[アップデート] AWS App Runner の環境変数ソースで Secrets Manager と SSM パラメータストアがサポートされました
いわさです。
App Runner にはサービスの環境変数を設定する機能があります。
これまではプレーンテキストのみがサポートされており、機密性の低いデータのみに利用が限られていました。
今回のアップデートで App Runner 環境変数のソースとして AWS Secrets Manager と AWS System Manager (SSM) パラメータストアを指定することが出来るようになりました。
これによって API キーやデータベースの認証情報など機密性の高いデータを環境変数としてアプリケーションから参照することが出来るようになりました。
本日はこちらの利用方法や更新タイミングなどを確認してみました。
ベースサービスを作成
まずは環境変数を参照する適当な Web サービスを作成したので App Runner へデプロイします。
以下のリポジトリに格納しておきます。.NET 6 を想定しています。
.NET 6 は App Runner マネージドランタイムでの実行が最近サポートされていますので Git リポジトリを指定の上構成情報を少し入力すれば独自にコンテナイメージを用意しなくても App Runner で実行出来ます。
デプロイ方法は以下を参照してください。
適当な Controller から以下のように環境変数HOGE_ENV1
とHOGE_ENV2
を参照しています。
using Microsoft.AspNetCore.Mvc; namespace asp_dotnet_core_env_show.Controllers { [ApiController] [Route("api/[controller]")] public class HogeController : ControllerBase { [HttpGet(Name = "GetEnvironmentValues")] public IEnumerable<string?> Get() { return new[] { Environment.GetEnvironmentVariable("HOGE_ENV1"), Environment.GetEnvironmentVariable("HOGE_ENV2") }; } } }
App Runner の環境変数オプションで次のようにHOGE_ENV1
とHOGE_ENV2
を指定します。
まずは従来どおりのプレーンテキストで指定して動作確認します。
HTTP クライアントでアクセスしてみましょう。
% curl https://39ue7pd32b.ap-northeast-1.awsapprunner.com/api/hoge ["aaa","bbb"]
良さそうです。
環境変数にシークレットと SSM パラメータを指定してみる
さて、それではアップデートの確認です。
Secrets Manager と SSM パラメータストアにサンプルデータを用意して、App Runner の環境変数で指定してみましょう。
シークレットとパラメータの用意
シークレットとパラメータの作成手順については割愛しますがここでは次のように単純なテキスト文字列を保存しました。
App Runner サービス設定で環境変数の設定
先程はプレーンテキストを選択しましたが、環境変数のソースとして次のように Secrets Manager と SSM Parameter Store が指定出来るようになっています。
Secrets Manager は ARN を、SSM Parameter Store はパラメータ名か ARN が指定出来るようです。
今回はどちらも ARN を指定してみました。
arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:hoge0107secret-FXw11Y
arn:aws:ssm:ap-northeast-1:123456789012:parameter/hoge0107ssmparam
App Runner インスタンスロールとポリシーの追加
環境変数の下に IAM ポリシーのテンプレートが表示されるようになりました。
App Runner から Secrets Manager と SSM Parameter Store へアクセスするために必要なポリシーのテンプレートが表示されています。
手動でポリシーの追加が必要なようです。
App Runner では「インスタンスロール」を使ってサービスで IAM ロールを割り当てることが出来ます。
上記に従って App Runner 用のインスタンスロールを作成しましょう。
カスタム信頼ポリシーとして以下を指定します。App Runner から AssumeRole 出来るようになります。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "tasks.apprunner.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
先程のテンプレートに従って IAM ロールに次のようなカスタムポリシーを割り当ててみました。
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "secretsmanager:GetSecretValue", "kms:Decrypt*" ], "Effect": "Allow", "Resource": [ "arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:hoge0107secret-FXw11Y", "arn:aws:kms:ap-northeast-1:123456789012:key/66a67261-fcab-4c9f-a3cd-0f86aadf7d7d" ] }, { "Action": [ "ssm:GetParameters" ], "Effect": "Allow", "Resource": [ "arn:aws:ssm:ap-northeast-1:123456789012:parameter/hoge0107ssmparam" ] } ] }
App Runner のサービス設定 - セキュリティ - インスタンスロール で作成した IAM ロールを指定します。
サービス更新後に HTTP クライアントでアクセスしてみましょう。
% curl https://39ue7pd32b.ap-northeast-1.awsapprunner.com/api/hoge ["{\"hogesecret\":\"secretvalue1\"}","ssmparametervalue1"]%
おお、シークレットとパラメータストアの値が取得出来ていますね。
値の更新時は自動反映されないので注意
以下に記載されていますが注意事項があります。
Secrets Manager 側で値のローテーションや更新が発生した場合 App Runner 側で自動ですぐに反映される仕組みがありません。
When the secrets and parameter values are rotated or changed they are not automatically updated in your App Runner service. Redeploy your App Runner service as App Runner only pulls secrets and parameters during deployment.
Referencing environment variables - AWS App Runner より
実際にシークレットとパラメータを更新してみましたが古いデータが App Runner 環境変数上は利用され続けていました。
% curl https://39ue7pd32b.ap-northeast-1.awsapprunner.com/api/hoge ["{\"hogesecret\":\"secretvalue1\"}","ssmparametervalue1"]
ドキュメントによるとサービスの再デプロイのタイミングで取得・反映されるようなので再デプロイして試してみました。
% curl https://39ue7pd32b.ap-northeast-1.awsapprunner.com/api/hoge ["{\"hogesecret\":\"secretvalue2\"}","ssmparametervalue2"]
期待どおり新しい値が反映されていますね。
ちなみに、サービスの「一時停止」 → 「再開」でも反映されることを確認しました。
% curl https://39ue7pd32b.ap-northeast-1.awsapprunner.com/api/hoge ["{\"hogesecret\":\"secretvalue3\"}","ssmparametervalue3"]
さいごに
本日は AWS App Runner の環境変数ソースで Secrets Manager と SSM パラメータストアがサポートされたので設定方法など確認してみました。
従来どおりコード上で SDK を使ってシークレットなどを使う方法ももちろん引き続き利用可能ですが、環境変数でマネージドに引き渡せるとコードから Secrets Manager などへの依存性を削除出来るので嬉しいアップデートではないでしょうか。