LoginSignup
0
0

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

Posted at

はじめに

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

目的

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

前提

  • アプリケーション作成済み
  • クラスター作成済み

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

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

タスクロールを作成する

タスクロールとは

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

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

image.png

ECSTaskRole-sota-dev___IAM___Global.png

自分のパラメータ_-AWS_Systems_Manager-_パラメータストア.png

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

{
    "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

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

{
	"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

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

  • 値のタイプ:ValueFrom
  • 値:該当の環境変数のARN

Elastic_Container_Service___ap-northeast-1.png

しかし、ここでエラーが発生!

タスクの停止時刻: 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

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

image.png
CloudWatchで問題なく環境変数を取得してくれていることを確認できました!
MySQLのホスト名に格納した値(arn_of_rds)を見てくれていますね

image.png

最後に

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

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0