ちばのてっく

積極的にアウトプット

Systems Managerのパブリックパラメータから最新のAMI IDを取得してみた

最新のAMI IDを取得するために、Systems Manager(以下、SSM)のパブリックパラメータが利用できそうなので試してみた。

はじめに結論

AWS CLIの場合

aws ssm get-parameters --names /aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64 --query 'Parameters[].Value' --
output text

Terraformの場合

data "aws_ssm_parameter" "linux_latest" {
  name = "/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64"
}

output "linux_latest" {
  value = data.aws_ssm_parameter.linux_latest.id
}

やってみた

AWSドキュメントのこのあたりを参考にする。

aws ssm get-parameters-by-pathコマンドで、SSMのパブリックパラメータが取得できるとのこと。

利用できるパブリックパラメータは、オプションに--path /aws/service/listを加えることで確認可能。

入力

aws ssm get-parameters-by-path --path /aws/service/list

出力

{
    "Parameters": [
### 割愛 ###            
        {
            "Name": "/aws/service/list/ami-windows-latest",
            "Type": "String",
            "Value": "/aws/service/ami-windows-latest/",
            "Version": 1,
            "LastModifiedDate": "2021-03-12T08:07:38.727000+09:00",
            "ARN": "arn:aws:ssm:ap-northeast-1::parameter/aws/service/list/ami-windows-latest",
            "DataType": "text"
        },
### 割愛 ###
        {
            "Name": "/aws/service/list/ami-amazon-linux-latest",
            "Type": "String",
            "Value": "/aws/service/ami-amazon-linux-latest/",
            "Version": 1,
            "LastModifiedDate": "2021-03-12T08:07:37.393000+09:00",
            "ARN": "arn:aws:ssm:ap-northeast-1::parameter/aws/service/list/ami-amazon-linux-latest",
            "DataType": "text"
        }
    ]
}

特定のパブリックパラメータを確認するには、パスからlistを削除する。例えば/aws/service/list/ami-amazon-linux-latestであれば、/aws/service/ami-amazon-linux-latestになる。また、AWS CLIはJMETHPathに従ったクエリが利用可能。

入力

aws ssm get-parameters-by-path --path /aws/service/ami-amazon-linux-latest --query 'Parameters[].Name'

出力

[
    "/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-arm64",
    "/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64",
    "/aws/service/ami-amazon-linux-latest/al2023-ami-minimal-kernel-6.1-arm64",
    "/aws/service/ami-amazon-linux-latest/al2023-ami-minimal-kernel-6.1-x86_64",
    "/aws/service/ami-amazon-linux-latest/al2023-ami-minimal-kernel-default-arm64",
    "/aws/service/ami-amazon-linux-latest/amzn-ami-hvm-x86_64-gp2",
    "/aws/service/ami-amazon-linux-latest/amzn-ami-hvm-x86_64-s3",
    "/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-ebs",
    "/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2",
    "/aws/service/ami-amazon-linux-latest/amzn2-ami-kernel-5.10-hvm-x86_64-ebs",
    "/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64",
    "/aws/service/ami-amazon-linux-latest/al2023-ami-minimal-kernel-default-x86_64",
    "/aws/service/ami-amazon-linux-latest/amzn-ami-hvm-x86_64-ebs",
    "/aws/service/ami-amazon-linux-latest/amzn-ami-minimal-hvm-x86_64-s3",
    "/aws/service/ami-amazon-linux-latest/amzn-ami-minimal-pv-x86_64-s3",
    "/aws/service/ami-amazon-linux-latest/amzn-ami-pv-x86_64-s3",
    "/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-arm64-gp2",
    "/aws/service/ami-amazon-linux-latest/amzn2-ami-kernel-5.10-hvm-arm64-gp2",
    "/aws/service/ami-amazon-linux-latest/amzn2-ami-kernel-5.10-hvm-x86_64-gp2",
    "/aws/service/ami-amazon-linux-latest/amzn2-ami-minimal-hvm-arm64-ebs",
    "/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-arm64",
    "/aws/service/ami-amazon-linux-latest/amzn-ami-minimal-hvm-x86_64-ebs",
    "/aws/service/ami-amazon-linux-latest/amzn-ami-minimal-pv-x86_64-ebs",
    "/aws/service/ami-amazon-linux-latest/amzn-ami-pv-x86_64-ebs",
    "/aws/service/ami-amazon-linux-latest/amzn2-ami-minimal-hvm-x86_64-ebs"
]

これまでの経験から、おそらくはもっとも普遍的なAMIかと勝手に思っているため、「/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-arm64」のAMI IDを取得することにする。最下層のパラメータへアクセスする際は、get-parameters-by-path --pathではなく、get-parameters --nameを使う。

入力

aws ssm get-parameters --names /aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64 --query 'Parameters[].Value' --
output text

出力

ami-031134f7a79b6e424

terraformの場合は、data句aws_ssm_parameerを使う。

入力

data "aws_ssm_parameter" "linux_latest" {
  name = "/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64"
}
output "linux_latest" {
  value = data.aws_ssm_parameter.linux_latest.id
}

出力

Changes to Outputs:
  + linux_latest = "/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64"