Serverless 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
    

やること

  1. sls info から API キーの値を取得する
  2. 取得した 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 キーの外出しに悩んでいる方は参考にしてみてください。


以上、よっしー (michimani) でした。

Share to ...

0

Follow on Feedly