[ECS] タスク定義でパラメータストアから環境変数を参照する！！

# はじめに
:::note info
- この記事は紆余曲折し、エラーを解消しながらゴールまで突き進む物語です
- 最短の手順だけを述べたものではありません
- 少しでも皆さんのデバッグのヒントになればと思っております
:::



# 目的
ECS クラスターのタスク起動時にSystems Managerのパラメータストアに格納した環境変数の値を取得・参照できるようになる

# 前提
- アプリケーション作成済み
- クラスター作成済み

# タスク定義にロールを付与する

タスク定義においてまずはタスクロールとタスク実行ロールを付与します
パラメータストアから環境変数を取得できるようにタスクロール（IAMロール）を作成しましょう

### タスクロールを作成する
#### タスクロールとは
- 目的: ECSタスクがAWSのリソースにアクセスするための権限を提供します
- 使用例: ECSタスクがS3バケットからデータを読み取ったり、DynamoDBにデータを書き込んだりする

今回はタスクロールではSSMにアクセスできるようにポリシーを付与します
その他今後必要になりそうなポリシーがあれば、ご自由に追加しておいてください


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515002/94e8200f-9e56-e6db-8a46-d1b75e273e9a.png)

![ECSTaskRole-sota-dev___IAM___Global.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515002/e5db4931-01d7-53b4-b005-5c601ab97dc4.png)





![自分のパラメータ_-_AWS_Systems_Manager_-_パラメータストア.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515002/8a3554a4-3b43-cc65-6572-52c7c760e2ec.png)

カスタマーインラインポリシーのECSTaskRolePolicy-sota-devは以下のように設定しています

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "ec2:Describe*",
                "elasticloadbalancing:Describe*",
                "autoscaling:Describe*",
                "cloudwatch:ListMetrics",
                "cloudwatch:GetMetricStatistics",
                "cloudwatch:Describe*",
                "cloudwatch:DisableAlarmActions",
                "cloudwatch:EnableAlarmActions",
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents",
                "logs:DescribeLogStreams"
            ],
            "Resource": "*",
            "Effect": "Allow"
        }
    ]
}
```
### タスク実行ロールを作成する
#### タスク実行ロールとは
- 目的: ECSエージェントがタスクの起動や終了に必要な操作を実行するための権限を提供します
- 使用例: ECSタスクがECRからイメージをプルしたり、ログをCloudWatchに送信する

![ECSTaskExecutionRole-sota-dev___IAM___Global.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515002/cfd7fc78-27b5-cc74-c09f-8c9e6a926eca.png)


カスタマーインラインポリシーのECSTaskExecutionRolePolicy-sota-devは以下のように設定しています

```json
{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Action": [
				"ecr:BatchCheckLayerAvailability",
				"ecr:BatchGetImage",
				"ecr:DescribeImages",
				"ecr:GetAuthorizationToken",
				"ecr:GetDownloadUrlForLayer",
				"ecr:GetLifecyclePolicyPreview",
				"ecr:GetLifecyclePolicy",
				"ecr:GetRepositoryPolicy",
				"ecr:ListTagsForResource"
			],
			"Resource": [
				"arn:aws:ecr:ap-northeast-1:000000000000:repository/*"
			],
			"Effect": "Allow"
		},
		{
			"Action": [
				"ssm:GetParameters",
				"secretsmanager:GetSecretValue",
				"kms:Decrypt"
			],
			"Resource": [
				"arn:aws:ssm:ap-northeast-1:000000000000:parameter/*"
			],
			"Effect": "Allow"
		}
	]
}
```


# パラメータストアで環境変数の設定
アプリケーションが必要としている環境変数を設定していきましょう

![自分のパラメータ_-_AWS_Systems_Manager_-_パラメータストア.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515002/c9bb2d11-e868-6032-28d4-8e9c2e5c12b2.png)


タスク定義設定時、`環境変数 - オプション`で先ほどパラメータストアで設定した環境変数を追加していきます
- 値のタイプ：ValueFrom
- 値：該当の環境変数のARN


![Elastic_Container_Service___ap-northeast-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515002/e9c17c26-4106-1d76-08cd-d94b28da352f.png)

:::note alert
しかし、ここでエラーが発生！
:::



```
タスクの停止時刻: 2024-05-17T07:02:46.461Z
ResourceInitializationError: unable to pull secrets or registry auth: execution resource retrieval failed: unable to retrieve secrets from ssm: service call has been retried 1 time(s): AccessDeniedException: User: arn:aws:sts::000000000000:assumed-role/ECSTaskExecutionRole-sota-dev/aaaaaaaaaaaaaaaaaaaaaaaaa is not authorized to perform: ssm:GetParameters on resource: arn:aws:ssm:ap-northeast-1:000000000000:parameter/sota/dev/ENVIRONMENT_VARIABLE because no identity-based policy allows the ssm:GetParameters action status code: 400, request id: aaaaaaaaa-a502-4158-9a9c-aaaaaaaaaaaa
```


実行タスクロールを確認すると、ssm:GetParametersのResourceの指定が誤っていました
ここを正しいものに修正します
![IAM___Global.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515002/0eeb2978-20ee-5660-c10c-0b304932ae28.png)


修正後、タスクを実行すると、正常に起動しました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515002/c5b19c7e-74b7-ec5b-a4eb-757b9dec5770.png)
CloudWatchで問題なく環境変数を取得してくれていることを確認できました！
MySQLのホスト名に格納した値（arn_of_rds）を見てくれていますね

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515002/00899653-a760-7fee-458a-e16356107b48.png)



# 最後に
お疲れ様でした！！
試行錯誤しながらの記事になっております
少しでも皆さんのお力添えになればと思っています🐰




# 参考
https://zenn.dev/sugay0519/articles/88f13ca589fcba

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/secrets-envvar-ssm-paramstore.html