ECS FargateでSSMから安全に環境変数を注入する設定手順

はじめに

ECS Fargateでのコンテナ起動時、データベースのパスワードやAPIキーなどの機密情報をどのように渡していますか?コンテナイメージやタスク定義に直接プレーンテキストで埋め込むのは、セキュリティ上非常に危険です。本記事では、AWS Systems Manager(SSM)パラメータストアを利用し、ECS Fargateへ安全に環境変数を注入するための具体的な設定手順をステップバイステップで解説します。

前提知識/必要な理由

ECS Fargateで機密情報を扱う場合、SSMパラメータストアやAWS Secrets Managerに情報を格納し、タスク起動時に動的に環境変数として注入するのがベストプラクティスです。これにより、認証情報の漏洩リスクを最小限に抑え、環境ごとの設定変更も容易になります。

この仕組みを実現するには、ECSエージェントがコンテナを起動する際にSSMパラメータストアへアクセスするための「ECSタスク実行ロール(Task Execution Role)」の設定が必要不可欠です。なお、今回の手順はECSの標準機能を利用するため、コンテナ内のアプリケーションにAWS SDKなどの外部ライブラリを導入する必要はありません。既存のコードを書き換えることなく、環境変数として値を受け取ることができます。

具体的な設定手順・設計方法

ステップ1: SSMパラメータストアに機密情報を登録する

まずは、AWSマネジメントコンソールまたはAWS CLIを使用して、暗号化されたパラメータ(SecureString)を登録します。以下はAWS CLIを使用した登録例です。

aws ssm put-parameter \
  --name "/production/myapp/database_password" \
  --value "SuperSecretPassword123!" \
  --type "SecureString"

ステップ2: ECSタスク実行ロールにIAM権限を付与する

ECSタスクが起動時にSSMパラメータストアから値を取得し、暗号化を解除できるように、タスク実行ロール(通常は ecsTaskExecutionRole)に以下のIAMポリシーを追加します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ssm:GetParameters",
        "kms:Decrypt"
      ],
      "Resource": [
        "arn:aws:ssm:ap-northeast-1:123456789012:parameter/production/myapp/*",
        "arn:aws:kms:ap-northeast-1:123456789012:key/YOUR_KMS_KEY_ID"
      ]
    }
  ]
}

※アカウントID(123456789012)やリージョン、KMSキーIDはご自身の環境に合わせて置き換えてください。デフォルトのAWSマネージドキー(aws/ssm)を使用している場合は、KMSのDecrypt権限のResourceに該当キーのARNを指定します。

ステップ3: ECSタスク定義で環境変数をマッピングする

タスク定義の containerDefinitions 内で secrets セクションを使用し、コンテナ内での環境変数名とSSMパラメータのARNをマッピングします。

{
  "containerDefinitions": [
    {
      "name": "myapp-container",
      "image": "123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/myapp:latest",
      "essential": true,
      "secrets": [
        {
          "name": "DB_PASSWORD",
          "valueFrom": "arn:aws:ssm:ap-northeast-1:123456789012:parameter/production/myapp/database_password"
        }
      ],
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
          "awslogs-group": "/ecs/myapp",
          "awslogs-region": "ap-northeast-1",
          "awslogs-stream-prefix": "ecs"
        }
      }
    }
  ],
  "executionRoleArn": "arn:aws:iam::123456789012:role/ecsTaskExecutionRole",
  "family": "myapp-task"
}

実務での注意点

  • タスクロールとタスク実行ロールを混同しない: SSMからパラメータを取得するのは「ECSコンテナエージェント」であるため、権限は「タスクロール(Task Role)」ではなく、コンテナ起動を担う「タスク実行ロール(Task Execution Role)」に付与する必要があります。
  • KMS復号権限の不足による起動エラー: SecureStringで暗号化されたパラメータを使用する場合、タスク実行ロールに kms:Decrypt 権限がないと、コンテナが ResourceInitializationError で異常終了します。
  • パラメータARNの末尾: パラメータのバージョンを指定せずに常に最新版を取得したい場合は、ARNの末尾にバージョン番号(:1 など)を付与しないように注意してください。

まとめ

SSMパラメータストアとECSタスク定義を連携させることで、コンテナイメージやリポジトリに機密情報を一切露出させることなく、安全に環境変数を注入できます。実務で非常に多用される設定パターンのため、タスク実行ロールとKMSの権限関係を正しく整理して設計に役立ててください。

上部へスクロール