[アップデート] Amazon EC2 の macOS AMI ID を SSM パブリックパラメータから取得出来るようになりました

[アップデート] Amazon EC2 の macOS AMI ID を SSM パブリックパラメータから取得出来るようになりました

Clock Icon2024.06.23

いわさです。

CloudFormation や CLI で EC2 インスタンスを構築する際に、AMI の ID を指定する必要があります。
特定プラットフォームの最新版を指定したい場合があるのですが、AMI ID を静的に指定すると古い AMI を指定し続けてしまいます。

一部の AMI は SSM パラメータストアのパブリックパラメータとして AMI ID が提供されており、パラメータストアを通して CloudFormation などで指定することが可能です。

先日のアップデートで、EC2 macOS の AMI ID もパラメータストア経由で取得出来るようになりました。

今回こちらを CloudFormation で使ってみましたのでテンプレートなど紹介したいと思います。
EC2 macOS の CloudFormation テンプレートの例はあまり情報が多くなく少し悩んだところがありまして、そのあたりも共有したいと思います。

EC2 macOS での CloudFormation

macOS の AMI は本日時点では Sonoma、Ventura、Monterey の 3 種類が提供されています。(東京リージョン)
今回は最新版である Sonoma を使って CloudFormation を構築してみます。

まず、静的な AMI ID を指定したテンプレートは次のような形となります。
VPC やセキュリティグループ、キーペアなどは既に存在していることを前提としたテンプレートとなっています。

macOS インスタンス向けの CloudFormation テンプレートを今回始めて作ったのですが、何度かトライ&エラーが必要でした。
私は次のようなエラーメッセージで詰まりました。

  • The requested tenancy is not supported for this instance type. Please check the documentation for supported configurations.
  • You do not have a host with a matching configuration and sufficient capacity. Either target a host resource group that can automatically allocate hosts on your behalf, or manually allocate a new host to your account and then try again.
  • Invalid request provided: You cannot specify InstanceFamily and InstanceType in the same request
  • The instance family 'mac1' is not supported.

最終的にそれらを解決したテンプレートが以下です。

AWSTemplateFormatVersion: '2010-09-09'
Description: Mac on EC2 Environment

Parameters:
  InstanceType:
    Type: String
    Default: mac1.metal
  PublicSubnetId: 
    Type: String
    Default: subnet-fdb861b5
  SecurityGroupId:
    Type: String
    Default: sg-9b3e02d0
  KeyName: 
    Type: AWS::EC2::KeyPair::KeyName
    Default: iwasakojin

Resources:
  MacInstance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: ami-0babebe201ea298a2
      InstanceType: !Ref InstanceType
      KeyName: !Ref KeyName
      NetworkInterfaces:
        - AssociatePublicIpAddress: true
          DeviceIndex: "0"
          GroupSet:
            - !Ref SecurityGroupId
          SubnetId: !Ref PublicSubnetId
      Tenancy: host
      HostId: !Ref MacDedicatedHost

  MacDedicatedHost:
    Type: AWS::EC2::Host
    Properties:
      AvailabilityZone: !Select [ 0, "Fn::GetAZs": {Ref: "AWS::Region"}]
      InstanceType: mac1.metal

ポイントとしては、macOS インスタンスは専有ホストが前提となるのでAWS::EC2::Hostをあわせて構築する必要があるのと、Tenancy: hostを指定する必要があります。
そして専有ホストでは macOS の場合はInstanceFamily: mac1ではなくInstanceType: mac1.metalを指定する必要があります。

なお東京リージョンではまだ mac1 のみが利用可能で、バージニア北部などでは mac2-m2pro なども利用が可能になっています。

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

上記テンプレートに今回のアップデート要素を加えてみましょう。
まずは SSM パラメータストアを確認してみます。

新たにパブリックパラメータにサービス「ec2-macos」から最新イメージが参照可能です。

以下はバージニア北部の場合でこちらは Arm の最新イメージも提供されています。バージニア北部ではサービスに「ami-macos-latest」というものも追加されていましたが、こちらは本日時点ではまだ何もパラメータが存在していませんでした。

まずは AWS CLI から値だけ確認してみましょう。ssm get-parameterを使います。

% aws ssm get-parameter --name /aws/service/ec2-macos/sonoma/x86_64_mac/latest/image_id --region ap-northeast-1
{
    "Parameter": {
        "Name": "/aws/service/ec2-macos/sonoma/x86_64_mac/latest/image_id",
        "Type": "String",
        "Value": "ami-0babebe201ea298a2",
        "Version": 1,
        "LastModifiedDate": "2024-06-18T04:14:29.907000+09:00",
        "ARN": "arn:aws:ssm:ap-northeast-1::parameter/aws/service/ec2-macos/sonoma/x86_64_mac/latest/image_id",
        "DataType": "aws:ec2:image"
    }
}

良さそうですね。

CloudFormation テンプレートで使う

冒頭の北野さんのブログを参考にしつつ以下のように SSM パラメータから AMI ID を取得するように変更してみました。
ハイライト部分が追加・変更した箇所です。

AWSTemplateFormatVersion: '2010-09-09'
Description: Mac on EC2 Environment

Parameters:
  InstanceType:
    Type: String
    Default: mac1.metal
  PublicSubnetId: 
    Type: String
    Default: subnet-fdb861b5
  SecurityGroupId:
    Type: String
    Default: sg-9b3e02d0
  KeyName: 
    Type: AWS::EC2::KeyPair::KeyName
    Default: iwasakojin
  BaseAMI:
    Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
    Default: /aws/service/ec2-macos/sonoma/x86_64_mac/latest/image_id

Resources:
  MacInstance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !Ref BaseAMI
      InstanceType: !Ref InstanceType
      KeyName: !Ref KeyName
      NetworkInterfaces:
        - AssociatePublicIpAddress: true
          DeviceIndex: "0"
          GroupSet:
            - !Ref SecurityGroupId
          SubnetId: !Ref PublicSubnetId
      Tenancy: host
      HostId: !Ref MacDedicatedHost

  MacDedicatedHost:
    Type: AWS::EC2::Host
    Properties:
      AvailabilityZone: !Select [ 0, "Fn::GetAZs": {Ref: "AWS::Region"}]
      InstanceType: mac1.metal

こちらのテンプレートを使ってスタックをデプロイしてみると次のように専有ホストと EC2 インスタンスが作成されていました。
AMI ID も先程 CLI で取得出来たものが使われていますね。

スタックを削除する

今回のアップデートと関係ないのですが、CloudFormation で作成した macOS インスタンスを含むスタックを削除した場合にどういった削除の挙動になるのか確認してみました。
macOS インスタンス(というか専有ホスト)は通常は 24 時間以上経過しないとリリース出来ないためです。

作成したスタックを削除してみましょう。

しばらく待つとスタックが削除され、リソースタブを見てみるとどちらも削除に成功しています。

コンソールからリソースのステータスなどを確認してみましょう。

EC2 インスタンスは削除される

macOS インスタンス自体は削除されていました。まぁこれは普通ですね。

専有ホストはリリースされない

専有ホストが気になるところです。
確認してみると、まず専有ホストのステータスはPendingとなっていました。

これは、CloudFormation の削除によるステータス変更というよりも、ホストした EC2 インスタンスが削除されたときにスクラブワークフローが実行され Pending ステータスになるという EC2 macOS の仕様ですね。

数十分経過したところでステータスが Available で、vCPU が未使用であることが確認出来ました。

つまり、専有ホストはスタック削除に伴って削除はされないようです。
スタック上は削除されているので CloudFormation の管理下からはおそらく外れています。

作成後 24 時間経過後に削除(リリース)出来るようになるので、使用しない場合はリリース操作を行うことを忘れないようにしましょう。料金が発生し続けます。

さいごに

本日は Amazon EC2 の macOS AMI ID を SSM パブリックパラメータから取得出来るようになったので試してみました。

SSM パラメータからの AMI ID 取得は問題なく行うことが出来ました。

macOS インスタンスを CloudFormation テンプレートで作成するのが今回初だったのですが、通常の EC2 と少し必要なパラメータが異なることと、スタック削除時に専有ホストは自動リリースはされないので、そのあたりは少し注意が必要ですね。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.