RDSのパスワードをFargateに渡したい。でもハードコーディングはしたくないし、セキュリティも担保したい……。
そんなときに便利なのが「Secrets Manager × 環境変数」の組み合わせです。
[ 学習フェーズ ]
以下を学習しましょう。
- ハードコーディングのデメリット
- 環境変数とは
- Secret Manager
- EC2/ECS + RDS + Secret Manager構成
実践フェーズで利用するサービスの役割
サービス名 | 役割 |
---|---|
Secrets Manager | パスワードを安全に保管 |
EC2/ECS | アプリを実行する基盤、RDSへアクセスするために各種情報が必要 |
IAM ロール | タスクにSecretsへのアクセス権を与える |
RDS | DBとしてEC2やECSと通信する |
なぜ必要?
FargateはDockerのように柔軟な一方で、コードや環境変数に直接パスワードを書くと漏洩リスクが高まります。
Secrets Managerを使えば、IAMで制御された安全なアクセスが可能になります。
[実践フェーズ]
今回は、Fargate --- RDSの想定で、FargateのIPアドレスを叩いた際にRDSのパスワードを表示させてみましょう。
その際、パスワードはdockerfileに直接記載せず、環境変数とSecret Managerを利用してセキュアに行います。
※実際はRDSを作成せず、仮のパスワードを用いて、Fargateでそのパスワードを表示させるというデモです。
Secrets Managerに仮のパスワードを保存
シークレット名は「my-rds-secret」とする。
また、今回はRDSを作成しないため、便宜上「その他のシークレットのタイプ」として作成しましょう。
{
"password": "fakedemo1234",
"port": "3306"
}
コンテナの準備(node.js)
app.js
const express = require('express');
const app = express();
const port = process.env.APP_PORT || 3000;
app.get('/', (req, res) => {
const dbPassword = process.env.DB_PASSWORD;
const dbPort = process.env.DB_PORT;
res.send(RDSパスワードは: ${dbPassword}、ポート番号は: ${dbPort}
);
});
app.listen(port, () => {
console.log(アプリがポート${port}で起動しました
);
});
dockerfile
FROM node:18
WORKDIR /app
COPY app.js .
RUN npm init -y && npm install express
CMD ["node", "app.js"]
build & ECRにpush
以下と同様の手順です。
IAMロールの設定
Secrets Managerから値を取得できるよう、タスク実行ロールに「SecretsManagerReadWrite」「AmazonECSTaskExecutionRolePolicy」を追加、次のFargateにて指定
Fargateタスク定義を作成(Secrets Managerを環境変数として使用)
ECS → タスク定義作成(または更新)にて、以下のようにSecretsを設定:
キー | 値のタイプ | 値 |
---|---|---|
DB_PASSWORD | ValueFrom | arn:aws:secretsmanager:ap-northeast-1:{AWSアカウント番号}:{secret-name}:DB_PASSWORD:: |
DB_PORT | ValueFrom | arn:aws:secretsmanager:ap-northeast-1:{AWSアカウント番号}:{secret-name}:DB_PORT:: |
APP_PORT | 値 | 3000 |
パブリックIP経由で動作確認
パブリックIPにて、以下の表示が出力されたら成功。(例:http://52.195.174.149:3000/)
RDSパスワードは: fakedemo1234、ポート番号は: 3306
