まーぽんって誰がつけたの?

iOS→Scala→インフラなおじさん技術メモ

Terraformで最新のECS Optimized AMIのidをとってくる方法

もっといい方法があったので一番下に追記

最新のAMIみたいな情報は今どきはSSMで提供してくれるようになってきています。

Amazon ECS 最適化 AMI バージョン - Amazon Elastic Container Service

aws ssm get-parameters --names /aws/service/ecs/optimized-ami/amazon-linux-2/recommended --query "Parameters[0].Value" --output text
{
  "schema_version": 1,
  "image_name": "amzn2-ami-ecs-hvm-2.0.20200623-x86_64-ebs",
  "image_id": "ami-08d175f1b493f205f",
  "os": "Amazon Linux 2",
  "ecs_runtime_version": "Docker version 19.03.6-ce",
  "ecs_agent_version": "1.41.0"
}

ただ、valueの値がjson形式なので、data.aws_ssm_parameter.ecs_optimized_ami.valueってやってもjsonencodeされたものが返ってきてしまうので、そのままは使えない

jsondecodeを使う

Valueはjson形式なので、そのままではTerraformでは使えないので、以下のような感じでjsondecodeを使えばいける。

data "aws_ssm_parameter" "ecs_optimized_ami" {
  name = "/aws/service/ecs/optimized-ami/amazon-linux-2/arm64/recommended"
}

resource "aws_launch_configuration" "cluster" {
  name                        = "ecs-cluster-${aws_ecs_cluster.cluster.name}"
  image_id                    = jsondecode(data.aws_ssm_parameter.ecs_optimized_ami.value).image_id
  ...
}

追記: jsondecode不要

エゴサしてたらTwitterで見つけました。ありがとうございます。

docs.aws.amazon.com

この公式ドキュメントにもあるように、image_idなどサブパラメータとして取得できるみたいです。

data "aws_ssm_parameter" "ecs_optimized_ami_image_id" {
  name = "/aws/service/ecs/optimized-ami/amazon-linux-2/arm64/recommended/image_id"
}

resource "aws_launch_configuration" "cluster" {
  name                        = "ecs-cluster-${aws_ecs_cluster.cluster.name}"
  image_id                    = data.aws_ssm_parameter.ecs_optimized_ami_mage_id.value
  ...
}