aws

【D-24】ECS Fargate + Secret Maneger(環境変数)

RDSのパスワードをFargateに渡したい。でもハードコーディングはしたくないし、セキュリティも担保したい……。

そんなときに便利なのが「Secrets Manager × 環境変数」の組み合わせです。

[ 学習フェーズ ]

以下を学習しましょう。

  • ハードコーディングのデメリット
  • 環境変数とは
  • Secret Manager
  • EC2/ECS + RDS + Secret Manager構成

実践フェーズで利用するサービスの役割

サービス名役割
Secrets Managerパスワードを安全に保管
EC2/ECSアプリを実行する基盤、RDSへアクセスするために各種情報が必要
IAM ロールタスクにSecretsへのアクセス権を与える
RDSDBとして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_PASSWORDValueFromarn:aws:secretsmanager:ap-northeast-1:{AWSアカウント番号}:{secret-name}:DB_PASSWORD::
DB_PORTValueFromarn:aws:secretsmanager:ap-northeast-1:{AWSアカウント番号}:{secret-name}:DB_PORT::
APP_PORT3000

パブリックIP経由で動作確認

パブリックIPにて、以下の表示が出力されたら成功。(例:http://52.195.174.149:3000/)

RDSパスワードは: fakedemo1234、ポート番号は: 3306