デザインワン・ジャパン Tech Blog

DesignOne Japan | Activate the World.

API Gateway をつかってパラメータストアの値を取得してみた

まえがき

インフラエンジニアの 冨田(@komitta)です。好きなAWSサービスはAPI Gatewayです。

ということでAPI GatewayAWS サービス統合機能を使ってパラメータストアの値を取得してみたお話をします。

API Gateway 経由でパラメータストアの値を取得することになった経緯

弊社で運営しているエキテンサービスではAWS ECS Fargateを利用してアプリケーションを開発しています。

Fargate環境で秘匿情報の環境変数を設定する際、AWS Systems Manager パラメータストア*1に値を格納し、Fargateのコンテナ定義にてパラメータストアの名前を設定することで、コンテナ内部の環境変数として値を取得することが可能です。

docs.aws.amazon.com

dev.classmethod.jp

ですがパラメータストアの値を更新した場合、更新された値を取得するにはコンテナを起動し直す必要があります。

AWS SDK*2を使うことでパラメータストアの値の取得を行うことは可能ですが、コンテナのイメージサイズ最適化のためなるべくAWS SDKを使用しない形を検討していました。

そこで API GatewayAWSサービス統合機能*3を使ってパラメータストアの値を取得できるか検証しました。

事前準備

事前に下記を準備しておきます。

  • パラメータストアに 暗号化された文字列で作成

  • 上記SSMおよびkmsの権限が付与されたIAMロールの作成

API Gatewayの構築、設定

API GatewayREST APIで作成します。GETメソッド作成し、以下の統合リクエストの設定を行います。

  • 統合タイプ : AWS サービス

  • AWSリージョン : ap-northeast-1

  • AWS サービス : Simple Systems Management (SSM)

  • HTTP メソッド : POST

  • アクション : GetParameter

  • 実行ロール : 事前に作成したIAMロールのarnを入力

GetParameter の実行には AWSAPI Reference*4より、下記値のリクエストを送る必要があります。

{
   "Name": "/sample/test",
   "WithDecryption": true
}

上記の値をURL クエリ文字列パラメータに設定します。(※)

※メソッドをPOSTで作成しリクエスト本文に上記json形式の内容をPOSTするとエラーが発生して取得することはできない*5ので注意が必要です。自分はここでハマりました。。

URL クエリ文字列パラメータに設定後、デプロイしたURLに対してGETリクエストを送ると以下レスポンスが返却されます。

{
  "GetParameterResponse": {
    "GetParameterResult": {
      "Parameter": {
        "ARN": "arn:aws:ssm:ap-northeast-1:***************:parameter/sample/test",
        "DataType": "text",
        "LastModifiedDate": 1664518488.949,
        "Name": "/sample/test",
        "Selector": null,
        "SourceResult": null,
        "Type": "SecureString",
        "Value": "test",
        "Version": 1
      }
    },
    "ResponseMetadata": {
      "RequestId": "9a82fed0-e0a3-45ec-9247-57c40b29245e"
    }
  }
}

Valueの値のみ取得したい場合は、統合レスポンスのマッピングテンプレートに下記を設定することで取得することも可能です。

{
  "Value": $input.json('$.GetParameterResponse.GetParameterResult.Parameter.Value')
}

{
  "Value": "test"
}

まとめ

API Gatewayを使用して パラメータストアの値を取得する設定について紹介しました。

今回はURLクエリ文字列パラメータに固定値でパラメータストアの名前を指定したので、指定したパラメータストアの値しか取得することはできませんが、

method.request.path を使用するなどして任意のパラメータストアを取得することができると思います。

また、どこでも実行ができてしまうと情報漏洩につながるため、運用で使うには実行元の制限も行う必要があります。

API Gateway経由でパラメータストアの値を取得するケースは稀だと思いますが、誰かの参考になれば幸いです。

おわりに

仲間を募集しております

募集中の職種については以下を御覧ください。

www.wantedly.com