はじめに
ECSのタスク定義では、Secrets Managerで格納しているシークレット値を取得して環境変数に設定することができます。
このタスク定義をもとにECSタスクを起動する場合、タスクコンテナの内部では環境変数がどのような形式で保持されるのか気になったので調査してみました。
考えられる選択肢は以下の2つで、どちらの挙動になるかを検証します。
- シークレットの値が取り出された状態で設定されている
- シークレットのARNが設定されており、参照のたびにSecrets Managerから値を取得する
結論
# env
KEY=test
シークレット値が取り出された状態で設定されていました。
検証
構築成果物
検証のために作成したTerraformコードを以下に公開しています。
https://github.com/rindo-610/poc-secretsmanager-ecs-env
実行環境
- macOS 14.4.1
- Terraform v1.12.2
- aws-cli/2.27.50
併せて、Session Manager Plugin がインストールされている必要があります(後述する ECS Exec を使用するため)。
下記コマンドで確認できます。インストールされていない場合はこちらに従ってインストールしてください。
$ session-manager-plugin
The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.
構築内容を簡単に説明すると、ECSクラスター・タスク定義・サービス、Secrets Manager、必要なVPCやIAMをTerraformで定義しています。
Secrets Managerのシークレットは、プレーンテキストでtest
と設定しています。
タスク定義の環境変数KEY
には、上記シークレットのARNをvalueFrom
として設定しており、このシークレット値がタスクコンテナ内でどのように設定されているかを確認することが今回のゴールです。
コンテナに接続
Fargateをタスクに用いる場合、コンテナ内に接続するためにはECS Execを有効にしてからCLIでアクセスする必要があります。
今回、ECS Execの有効化はTerraformで行っています。
resource "aws_ecs_service" "main" {
(中略)
enable_execute_command = true # ECS Execを有効化
}
以下のコマンドを実行し、コンテナ内に接続します。
$ aws ecs execute-command --cluster [クラスター名] --task [タスクID] --container [コンテナ名] --region [リージョン名] --interactive --command "/bin/sh"
The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.
Starting session with SessionId: ecs-execute-command-xxxxxxxxxxxxxxxxxxxxxxxxxx
#
コンテナ内に接続後、env
コマンドにより環境変数を確認します。
# env
(中略)
KEY=test
シークレット値test
が取り出された状態で設定されているため、参照するたびにSecrets Managerからシークレット値を取りにいっているのではなく、タスク起動時に一度シークレット値を取得していることがわかりました。
おわりに
直感的にはタスク起動時に取得したシークレット値をコンテナ内に保持しつづけるだろうと思っていたので、それを実際に検証して確認できてよかったです。
もし参照のたびにSecrets Managerから値を取得していたとしたら、ECSタスクが頻繁にAPIリクエストを行うことになり、リクエスト回数による料金がかさんでしまうと思ったので、今回の検証結果に少し安心しました。
参考