名もなき未知

エンジニアリングとか、日常とかそういうのをまとめる場所。

はてなAPI VS わし

N時間かかりました。

最終的にできたもの

なんかもうOAuthとか何もわからないよ… の気持ちになってこれができました。

import urllib.parse
import requests
from requests_oauthlib import OAuth1
# build parameters to post
consumer_key = "Authきぃ"
consumer_secret = "Authしいくれっと"
token_key = "APIきぃ"
token_secret = "APIしいくれっと"
message = """<?xml version="1.0" encoding="utf-8"?>
<entry xmlns="http://www.w3.org/2005/Atom"
       xmlns:app="http://www.w3.org/2007/app">
  <title>いきしちに</title>
  <content type="text/x-markdown">## ひみいりに

**ぽ!!!!!!!!111**

無事投稿できましたかな?やりましたかな?
 </content>
  <updated>2020-01-12T00:00:00</updated>
  <category/>
  <app:control>
    <app:draft>yes</app:draft>
  </app:control>
</entry>
"""
message = message.encode()
post_url = "https://blog.hatena.ne.jp/MireiMixin/namonakimichi.hatenablog.com/atom/entry"

auth = OAuth1(
    consumer_key,
    consumer_secret,
    token_key,
    token_secret,
)

headers = {'Content-Type': 'application/xml; utf-8'}

print(requests.post(post_url, headers=headers, auth=auth, data=message).text)

最終的にやったこと

みたところ

反省

  • どうもGoの理解が薄めだがGoで頑張りすぎた
    • 良い勉強にはなったが動かなさすぎ + デバッグのしづらさでストレス
    • OAuthクライアント周りの話をあまり知らないのにわからない言語でやる、は事故でしかなかった
    • どうもXMLデバッグ方法がよくわからないとなっていた。ラップされているところを一部崩して自分でOAuthのヘッダー作ってリクエストするとかしたほうが早かったかも
  • OAuth1.0あたりを本当に理解してなかった感
    • 普段出来上がってるものの保守が多いため、あんまり認証・認可を考えて来なかったツケが回ってきたなという感じ
    • あとWSSEやBASIC認証する手もあったけど、まあこれらは・・・ うん・・・ なんか個人的にやったら負け感があったのでOAuthにこだわった
    • 最初Auth用のキーとCustomerキーの違いがいまいちわかってなかったので一度発行しないといけないのがわかってなかった感
      • ついでにいうとCUIだけで完結する方法もいまいちわかってない
  • 結局ドキュメント読むのがやや辛かった
    • あれを読んでピンとこなかった感パないので地力が足らない
    • 実装サンプルもPerlRubyと自分にとって馴染みがなく、イマイチ何をしているのかわかってなかった
  • Pythonにして1時間以内に動くところまで行ったので、やっぱり言語的にわからないもの+仕組み的にわからないものを同時学習するコスト高いなと思った
    • 今作ってるのはさっさと形にしたいのでPythonでかく
    • 余裕があったらGoで書き直そう
    • あと単純にはてなブログAPIをGoで叩いてるケースとか、運用してるケースが見受けられなかった感じがするので、わかったことがあればちゃんと書かないとなと思った

まとめ

しんどいので今日はねます。三連休はコーディングがはかどって本当にいいと思う。

serverlessでとりあえずHelloWorldくらいのAPIを立ててみる

IAMとか理解してないので引っかかりまくったゾ。。。

やったこと

この記事を参考にした。

Serverless Frameworkの使い方まとめ - Qiita

ただ、最終的にデプロイしたいのはGoのコードだったので、Goの方はこれを参考に、 aws-go-mod テンプレートを使用した。

ServerlessFrameworkにてaws-go-modテンプレートのサービスをデプロイしてみる - Qiita

事前にnpm系統の何かをアップデートしていた。(この手順については割愛)

AWS周りの設定

デプロイ用のユーザーが必要なのでIAMを作成した。初めてでよくわからなかったのだが、頑張ってこれを見ながらすすめる…。

Serverless Dashboard - Access Roles

やったこととしては、こんな感じ。ちなみにOrganization的なやつでやってる場合はよくわからないです。僕は個人で遊んでいるだけなので。。。。

  • AWSのIAMを作る画面に移動する
  • ユーザーあたりをクリックして、ユーザーを追加
  • プログラムの実行ユーザーとかで選ぶ
  • 操作権限は雑にAdministratorAccessとかにした(真面目に管理する場合はもう少しちゃんとした権限にする)
  • あとはポチポチしてたのであんまり記憶にない、最後にアクセスキーとかが表示されるのでコピるなりCSVをダウンロードするなりしておく

で、awsのconfigにつっこんどく。きーとしーくれっとはいい感じに置換する。

serverless config credentials --provider aws --key きー --secret しーくれっと

(ここでローカルの ~/.aws/credential みたいなファイルを見たら、デフォルトユーザーになっていたので、後でしれっとserverless_deployみたいなユーザー名にした)

ここまででやっとAWSにつなぐための設定ができた。

Serverlessでデプロイしてみる

npm のグローバルインストールで serverless を入れておく。(あんまりグローバルには入れたくないのだが、まあこれは使い回すかなあと思って入れておく)

npm install -g serverless

そのあと雑なフォルダで下記を実行した。

sls create --template aws-go-mod --path test-func

ビルドしてデプロイ。それなりに時間がかかった。

make build
serverless deploy -v --aws-profile serverless_deploy

その後Curlで表示されてるAPI叩いたら動いた。

f:id:MireiMixin:20200112144951p:plain

まとめ

取りあえず動くところまで行けたので良かったです。あとserverless.yml をもう少し設定変えてあげれば色々できるのかなーと思いつつ、色々知らないので調べないと・・・ という気持ちになりました。いちいち発行されるドメイン覚えておくのもあれだし、ドメインなんか取ろうかな…。

手軽に小さいAPIがデプロイできるようになったので、もう少し勉強して活用できるようになれば、と思います。

AWSにサーバレスな(裏がLambdaで動いてるような)APIを立てる練習をしていた

完全にただのGitHubAPIへのアクセスプロキシみたいなものになってしまうのだが、まあちょっとしたサーバーを建てとくのも面倒だったりするので、AWSでやってみようということで手を動かしてみた。

やったこと

Lambda編

まずこれを参考にLambdaへGoのコードをデプロイしてみる。

AWS Lambda で Go が使えるようになったので試してみた | Developers.IO

あと公式ドキュメントも見たが、ほぼ同じだった。

Go の AWS Lambda 関数ハンドラー - AWS Lambda

特につまずいたところはなかったのだが、このあたりはもう少し簡単にコマンドラインベースで多分できるよなーと思ったので、後日調べようと思う。このあたりを後で読もうと思う。

ローカル環境でgoで書いた aws lambda用のコードを実行しちゃう

API GateWay

この2つを参考に進めてみる。

2つ目のヤツのほうがわかりやすいし、APIキーの説明もあるしわかりやすいかも。

ハマりどころはとしては、APIキーでの認証を許可したあとうまくアクセスできないー、APIキーどこ!と思ったらデフォルトでは隠れてて、クリックしたら出てきたのでハイという感じだった。(キーとIDを間違えてヘッダーに設定していてはまり込んでいた)

あんまり真面目にここの公式ドキュメントを読み込んでいないので、これもそのうちコード値から定義できるのかなーとか思ってる。Swaggerの何かでできそうな雰囲気を感じたので、Swaggerで定義してAWSのラムダ関数を指定してあげる、とかで行けるのかなあとかぼんやり思ってる。

確認

Talend API Tester - Free Edition - Chrome ウェブストア で確認してみた。

使い方はこのへんとかが参考になりそう。 Talendで始めるREST APIテスト - Qiita

f:id:MireiMixin:20200112020418p:plain

まとめ

今まであんまり真面目に触ったことがなかったけど、意外と使えそうな感じなので活用していきたいかも。小さいAPIみたいなのを立てたいときってまあまああるような気がしていて、これをうまいことを活用できるようになると趣味開発は特に捗りそうな気がします。

あとコードからデプロイする方法とかもそのうち学んでいきたいところ。。。