[アップデート] Amazon EC2 の macOS AMI ID を SSM パブリックパラメータから取得出来るようになりました
いわさです。
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 と少し必要なパラメータが異なることと、スタック削除時に専有ホストは自動リリースはされないので、そのあたりは少し注意が必要ですね。