CloudFormationで最新のAmazon Linux 2のAMI IDを取得してEC2を構築する

CloudFormationでEC2を構築するとき、AMI IDをどうやって保持するのか悩ましいです。

パラメータとして保持する?そうすると、リージョン毎にAMI IDは異なるので特定のリージョンでしか使えないCloudFormationテンプレートになってしまう。
Mappingsとして保持する?そうすると全リージョンの最新のAMI IDを記載するのがとてもめんどくさい。

そんなことを悩んでいたら、公開パラメータストアから最新のAMI IDを取得する方法を知ったのでやり方をご紹介いたします。

公開パラメータストアからAMI IDを取得する

次のコマンドをAWS CLIで実行すると、最新のAmazon Linux2のAMI IDを取得できます。

$ aws ssm get-parameter \
  --name /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 \
  --region ap-northeast-1
{
    "Parameter": {
        "Name": "/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2",
        "Type": "String",
        "Value": "ami-0ff21806645c5e492",
        "Version": 22,
        "LastModifiedDate": 1567628887.33,
        "ARN": "arn:aws:ssm:ap-northeast-1::parameter/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2"
    }
}

--query オプションを使って、AMI IDの値だけ取り出してみます。

$ aws ssm get-parameter \
  --name /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 \
  --query "Parameter.Value" \
  --region ap-northeast-1
"ami-0ff21806645c5e492"

マネジメントコンソールを見てみると、Amazon Linux 2のAMI IDと一致していて、問題なく取得できていそうです。

他のリージョンでも試してみると、そのリージョンにあったAMI IDが取得できていそうです。

$ aws ssm get-parameter \
  --name /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 \
  --query "Parameter.Value" \
  --region us-east-1
"ami-0b69ea66ff7391e80"
$ aws ssm get-parameter \
  --name /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 \
  --query "Parameter.Value" \
  --region us-west-2
"ami-04b762b4289fba92b"

パラメータストアを利用してCloudFormationテンプレートを作成する

SSMパラメータはCloudFormationのパラメータセクションから簡単に参照できます。
詳細は公式ドキュメントを参照ください。

具体的にCloudFormationテンプレートをあげると、次のように利用できます。

---
AWSTemplateFormatVersion: '2010-09-09'

Parameters:
  Ec2ImageId:
    Type: AWS::SSM::Parameter::Value<String>
    Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2
  Ec2InstanceType:
    Type: String
    Default: t3.nano

Resources:
  SampleInstance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !Ref Ec2ImageId
      InstanceType: !Ref Ec2InstanceType

CloudFormationでEC2を作成する

実際にCloudFormationでEC2を作成すると、公開パラメータストアで取得したAMI IDは、解決済みの値として参照することができます。

作られたEC2インスタンスを見てみても、問題なく最新のAmazon Linux 2のAMI IDで構築できていることが確認できます。

終わりに

公開パラメータストアを利用できることがわかって、CloudFormationにおいてEC2のAMI IDをどこに保存するか迷わなくなりました!
CloudFormationでEC2を構築する際には、ぜひお試しください。