この記事は、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です。
グラフバリュージェネレーターの原点基準についてです!