はじめに
先日、Rails 7.2で作ったアプリをECSで動かすことをやりました。
発展的な話題として、環境変数で指定したRDSの接続先情報をSecrets Managerに登録しているものを参照する形式に変えることにします。
事前準備
事前準備として、以下のことをやります。
- Secrets Managerに対するVPCエンドポイントを作成する
- タスク実行ロールに
SecretsManagerReadWriteを追加する
順番にやっていきます。
1. Secrets Managerに対するVPCエンドポイントを作成する
以前CDKでVPC関係を実装しました。詳細は以下を参照してください。
この実装に以下の記述を追加します。
this.value.addInterfaceEndpoint("SecretsManagerEndpoint", { service: InterfaceVpcEndpointAwsService.SECRETS_MANAGER, });
以下のAWSブログも参考になるかなと思います。
2. タスク実行ロールにSecretsManagerReadWriteを追加する
タスク定義で指定しているタスク実行ロールにSecretsManagerReadWriteを追加します。本当は、対象となるSecrets Managerだけに限定すると良いかなと思いますが、とりあえず動かすことを目的としました。

なお実装した後に気がつきましたが、権限は与えすぎた感じがします。厳密には以下のドキュメントに記載されているものに絞ると良いでしょう。
Secrets Managerを参照する
AWSのドキュメントをもとに実装していきます。
ポイントは、値のタイプをValueFromにすることです。また、値はSecrets ManagerのARN:キー名::とします。最後の::も忘れないようにします。

コンソール上のフォーム画面では値が正しく入っているかは分かりにくいので、JSONタブで設定している値を確認すると良いでしょう。
以上を実装することで、Secrets Managerに設定したRDSの接続先を参照してECSで動くRailsアプリを動かすことに成功しました。
考察
本文中にも記載しましたが、タスク実行ロールに与えている権限が広すぎたので、もう少し狭めたものを与えるようにしたいと考えています。
また、これらの実装をCDKを使って実装していく予定です。