Serverless Framework で生成した API キーをデプロイ時に SSM パラメータストアに登録する
2020-03-12Serverless Framework を使用すると API Gateway の API キーも簡単に生成することができます。今回は、生成した API キーを デプロイ時に SSM のパラメータストアに登録するようにしてみた話です。
目次
概要
Serverless Framework で API Gateway の API キーを生成し、その値を AWS Systems Manager (SSM) のパラメータストアに登録します。 パラメータストアに登録しておけば、別のプロジェクトとして管理しているフロントエンドやその他のクライアントのコードに埋め込む際にも扱いやすくなります。
前提
-
生成される API キーが各ステージに ひとつだけ であること
serverless.yml
では次のような設定になっていることを前提とします。provider: name: aws runtime: python3.7 apiKeys: - ${self:provider.stage}-defaultApiKey usagePlan: quota: limit: 10000 period: DAY throttle: burstLimit: 500 rateLimit: 250 stage: ${opt:stage, self:custom.defaultStage} custom: defaultStage: dev
-
CodeBuild でデプロイしている
GitHub や CodeCommit へのイベントをトリガーとして、 CodeBuild デプロイすることを前提とします。
buildspec.yml
は下記のようになっています。$STAGE
変数にはデプロイ先のステージ (dev
,stg
など) が入る想定です。version: 0.2 phases: install: commands: - npm install -g serverless - npm install build: commands: - sls deploy --stage $STAGE
やること
sls info
から API キーの値を取得する- 取得した API キーを SSM パラメータストアに登録する
これらを実現するためのコマンドを buildspec.yml
に追記する形で対応します。
1. sls info から API キーの値を取得する
Serverless Framework では sls info
コマンドによって生成された API のエンドポイントや Lambda 関数の情報を取得することができ、その情報の中に API キーの値も含まれています。 sls info
コマンドでは sls deploy
と同様に --stage
オプションで情報取得対象のステージを指定することができます。
$ sls info --stage dev
Service Information
service: sls-sample
stage: dev
region: us-east-1
stack: sls-sample-dev
resources: 14
api keys:
dev-defaultApiKey: VaO3S4kmbvajSscuozbXSaKLO06YwzV79OxjaWgU
endpoints:
GET - https://XXXXXXXXXX.execute-api.us-east-1.amazonaws.com/dev/handler
functions:
hello: sls-sample-dev-hello
layers:
None
sls info
の出力結果から API キーを抜き出すために、下記の sed
コマンドを使用します。
sls info --stage dev | sed -n -r 's/^.*defaultApiKey: (.+)$/\1/p'
macOS に標準で搭載されている sed
で確認する場合は -r
オプションの代わりに -E
オプションを使用して確認してください。
$ sls info --stage dev | sed -n -E 's/^.*defaultApiKey: (.+)$/\1/p'
VaO3S4kmbvajSscuozbXSaKLO06YwzV79OxjaWgU
2. 取得した API キーを SSM パラメータストアに登録する
SSM パラメータストアへ登録には AWS CLI の ssm put-patrameter
を使用します。
1
の出力結果を適当な変数 (ここでは API_KEY
) に格納し、その値を登録します。
$ API_KEY=$(sls info --stage dev | sed -n -r 's/^.*defaultApiKey: (.+)$/\1/p')
$ aws ssm put-parameter \
--name "/sampleapp/dev/api_key" \
--value "${API_KEY}" \
--type SecureString \
--overwrite
最終的な buildspec.yml
ここまでの手順を踏まえて、最終的に buildspec.yml
は下記のようになります。
version: 0.2
phases:
install:
commands:
- npm install -g serverless
- npm install
build:
commands:
- sls deploy --stage $STAGE
- "API_KEY=$(sls info --stage $STAGE | sed -n -r 's/^.+defaultApiKey: (.+)$/\\1/p')"
- echo $API_KEY
- aws ssm put-parameter --name "/sampleapp/${STAGE}/api_key" --value "${API_KEY}" --type SecureString --description "API key for Sample API - ${STAGE}" --overwrite
上記の説明と変わっているのは sed
コマンド内の /
をエスケープしている ことと、 ステージごとに可変にする部分を変数 STAGE
で置き換えている ことです。
build
フェーズでデプロイしてるやんっていうツッコミもありますが、節約も兼ねて CodeBuild 内で完結するようにしているので見逃してください。やっている内容としては post_build
フェーズのほうがしっくりくる気もしています。
まとめ
Serverless Framework で API Gateway の API キーを生成し、デプロイ時にその値を AWS Systems Manager (SSM) のパラメータストアに登録してみた話でした。
SSM パラメータストアに登録してしまえば他のサービスからも利用しやすくなるので、 API キーの外出しに悩んでいる方は参考にしてみてください。
comments powered by Disqus