名もなき未知

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

AWS Chalice を触ってみた

概要

AWS Chalice を触って、API を立てるのをやってみました。

Discord の Webhook に投げるための中継点として使得ないかなと思い、試しています。

やったこと

要はこう

f:id:MireiMixin:20200622064847j:plain
イメージ

できたもの

コード

真面目?に書いた部分だけ

@app.route('/test', methods=['POST'], name='TweetTest')
def send_tweet_test():
    import urllib.request
    import json

    json_body = app.current_request.json_body
    app.log.info("received: %s" % json_body)

    webhook_url = os.environ.get('WEBHOOK_URL')
    method = "POST"
    headers = {
        "Content-Type" : "application/json",
        # User-Agent 指定なしだと怒られるため
        "User-Agent": "Yumechi WebHook/1.0",
    }

    # TODO: コンテンツはこの辺を見て増やしたい
    # https://birdie0.github.io/discord-webhooks-guide/discord_webhook.html
    values = {'content' : str(json_body)}


    # 典型的なリクエスト処理
    # refer: https://qiita.com/neko_the_shadow/items/324976c7b54623e82b26
    # refer: https://qiita.com/hoto17296/items/8fcf55cc6cd823a18217
    json_data = json.dumps(values).encode("utf-8")
    request = urllib.request.Request(webhook_url, data=json_data, headers=headers)
    with urllib.request.urlopen(request) as response:
        response_body = response.read().decode("utf-8")
        return {
            'status': 'ok',
            'res': response.read().decode("utf-8"),
        }

学び

  • めっちゃ簡単に API 立つ
    • Serverless Framework より楽かも
    • AWS 謹製なので完全に相性が考慮されてるんだろうなぁ
  • chalice local が超便利
    • ローカルで API のテストができる
    • AWS のほかサービスとつないでいる場合はわからないが、自分は受け取ったリクエストを右から左に受け流すだけだったので、実用に耐えた
  • chalice deploy が便利
  • ログも設定ができる
  • IFTTT の Twitter 連携が下記の形でないとうまくいかなかった
    • 置換が string なら string というわけではなく、確実に ダブルクォーテーションで囲う必要がある
    • エスケープは不要ということだったが、将来的にはまるパターンを考えると先にやっておいて損はなさそう
{
    "text": "<<< {{Text}} >>>",
    "user_name": "<<< {{UserName}} >>>",
    "link_to_tweet": "<<< {{LinkToTweet}} >>>",
    "created_at": "<<< {{CreatedAt}} >>>",
    "tweet_embed_code": "<<< {{TweetEmbedCode}} >>>"
}

展望

まとめ

Serverless Framework やってたおかげか、すっと頭の中に入ってきて、しかもわかりやすいなと思いました。

Python でやるならこれで十分かもという感じ。

ほかの言語でやりたい場合は Serverless Framework のほうが良いかもしれないですね。

自分はパッとかけるのは Python なので、パッと書かなきゃならないときは活用していきたいです。