mockmockでAmazon API Gatewayにデータを送るプロジェクトを作成する


この記事は、mockmockアドベントカレンダー10日目の記事です。

今回は公式ドキュメントに載っていない、Amazon API Gatewayで作ったAPIに向けてデータを送る方法を書いてみます。

プロジェクト認証

API Gateway宛にデータを送るプロジェクトを作る場合、サーバータイプをGeneralにします。
独自に作成したサーバー向けにデータを送る場合に使うサーバータイプですが、
ユーザーの管理下にないホストに向かってデータを送信するのを防ぐため、認証作業が必要となります。
API Gatewayを使う場合、ココをクリアするのが一番の山場になります。

プロジェクトを作成する際に、mockmockから認証キーが提示されるので、
http(s)://[送信先ホスト]/[認証用パス]に対してリクエストを行い、認証キーが含まれるレスポンスが返れば認証となります。

方針としては、チュートリアルAPIで行なっているものと同様です。
http(s)://[送信先ホスト]/auth/[認証キー]というGETのAPIを用意し、[認証キー]の部分をオウム返しさせることで、認証をクリアさせます。

SAMプロジェクト作成

今回はSAMでAPI Gateway + Lambdaを設定していきます。

サンプルを以下に作っていますので、全体は以下を参考にしてください。
https://github.com/fusic/mockmock-amazon-api-gateway-sample

テンプレート

以下のように、/auth/{auth_key}のGETのAPIを設定します。
auth_keyはリクエストパラメーターです。

Resources:
  AuthFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: app/app.auth
      Runtime: python3.6
      Events:
        Auth:
          Type: Api
          Properties:
            Path: /auth/{auth_key}
            Method: get
            RequestParameters:
              - method.request.path.auth_key:
                  Required: true
                  Caching: false

Lambda

Lambdaの内容はとても簡単です。

import json

def auth(event, context):
    auth_key = event["pathParameters"]["auth_key"]
    return {"statusCode": 200, "body": auth_key}

デプロイ

必要に応じて--profileを指定してください。

$ sam package --output-template-file packaged.yaml  --s3-bucket REPLACE_THIS_WITH_YOUR_S3_BUCKET_NAME
$ sam deploy --template-file packaged.yaml --stack-name api-gateway-sample  --capabilities CAPABILITY_IAM

デプロイされたAPIは以下で確認できます。

aws cloudformation describe-stacks --stack-name api-gateway-sample --query 'Stacks[].Outputs[?OutputKey==`AuthApi`]' --output table

プロジェクト設定

これで、以下のようにプロジェクトを設定すると認証をクリアできると思います。
生のAPI GatewayのエンドポイントだとProdなどステージを表す階層が付きますが、それは認証用パスの方に入れます。

まとめ

API Gatewayで作ったAPIに向けてデータを送る場合、認証部分が山場でした。
ちょっと大変ですが、そこを乗り越えればあとは普通のAPIサーバーに行う設定と同様です。
(もちろんデータ送信用のAPIは別途作る必要がありますが。)

明日は@yukabeokaです。
グラフバリュージェネレーターの原点基準についてです!