[アップデート] 検証された AMI ID のみを保管できる AWS Systems Manager パラメータストア aws:ec2:image データタイプが追加されました

パラメータストアに新たな可能性を感じた
2020.05.06

2020.05.06 追記
アップデートリリースありました。私が見逃しておりました!!
・ Amazon EC2 now supports aliases for Amazon Machine Images (AMIs)

ドキュメント更新から見つけたのでシェアします。(まだ、アップデートリリースは見てない、、はず)

AWS Systems Manager の文字列パラメータストアに data-type という新しい属性が追加され、有効な AMI ID のみを格納できるようになりました。

何がうれしいのか?

最初にこのリリースを見たとき「パラメータストアに AMI ID を渡して、SDK などで参照するだけでは?」と思いましたが、よくよく読んでみると便利な機能でした。

イメージ ID の指定にパラメータストアが指定できる

例えば ec2 run-instances でイメージ ID を渡す場合に、--image-id resolve:ssm:<パラメータストア名> という形で指定することが可能になりました。

従来であれば、パラメータストアに保管した値を aws ssm get-parameter で取得して使う必要があったかと思いますが、パラメータストアを直接指定できるので非常にシンプルですね。

AMI ID が更新された場合、変更するのはパラメータストアのみです。自動化、手動オペレーションに関わらず、AMI ID の更新を意識する必要はなく、該当のパラメータストアを --image-id resolve:ssm:<パラメータストア名> で指定すれば良いだけです。

有効な AMI ID であることを自動検証してくれる

新たに追加された aws:ec2:image データタイプのパラメータストアは、単に文字列として AMI ID を保管するのではなく、指定された AMI ID が有効であるかどうかを自動的に検証したうえで、パラメータに保管してくれます。

つまり、無効な AMI ID を指定した場合、その値は自動的に破棄されるので、誤った AMI ID を保管することはありません。(検証に失敗した AMI ID を指定した場合、Cloudwatch Events でメッセージを受け取ることができます)

ただし、動作確認した限りでは検証されるのは登録時のみです。既に AMI ID として登録された AMI を削除しても、過去のバージョンに自動的に巻き戻ったりするものでは無い点は注意してください。

やってみる

検証環境

AWS CLI は最新にアップデートする必要があります。AWS CLI v2 でしたが、以下のバージョンでは利用できませんでした。

$ aws --version
aws-cli/2.0.7 Python/3.7.4 Darwin/19.4.0 botocore/2.0.0dev11

アップデート後、以下のバージョンで利用できました。

$ aws --version
aws-cli/2.0.11 Python/3.7.4 Darwin/19.4.0 botocore/2.0.0dev15

パラメータストアの保管

--type String のパラメータストアのみ --data-type 属性が利用できます。AMI ID タイプを使用する場合、aws:ec2:image と指定します。今回は amzn2-ami-hvm-2.0.20200207.1-x86_64-ebs(ami-0289fbf73734505e2) を検証に利用しました。

$ aws ssm put-parameter --name TestAMI --value ami-0289fbf73734505e2 \
      --type String --data-type aws:ec2:image
Tier: Standard
Version: 1

$ aws ssm get-parameter --name TestAMI
Parameter:
  ARN: arn:aws:ssm:ap-northeast-1:XXXXXXXXXXXX:parameter/TestAMI
  LastModifiedDate: '2020-05-06T10:33:50.898000+09:00'
  Name: TestAMI
  Type: String
  Value: ami-0289fbf73734505e2
  Version: 1

無効な AMI ID を指定

例えば先程の AMI ID の最後の桁 を 3 に変更し、存在しない無効な AMI ID ami-0289fbf73734505e3 を指定して値を上書きしてみます。

$ aws ssm put-parameter --name TestAMI --value ami-0289fbf73734505e3 --overwrite
Tier: Standard
Version: 2

すると、CloudWatch Event で以下のように Unable to Describe Resource という失敗メッセージが報告されました。

{
	"version": "0",
	"id": "0265da57-e2ab-5819-ee77-7405ae568656",
	"detail-type": "Parameter Store Change",
	"source": "aws.ssm",
	"account": "XXXXXXXXXXXX",
	"time": "2020-05-06T02:17:31Z",
	"region": "ap-northeast-1",
	"resources": [
		"arn:aws:ssm:ap-northeast-1:XXXXXXXXXXXX:parameter/TestAMI"
	],
	"detail": {
		"exception": "Unable to Describe Resource",
		"dataType": "aws:ec2:image",
		"name": "TestAMI",
		"type": "String",
		"operation": "Update"
	}
}

コマンド発行時、Version: 2 と表示されていますが、更新に失敗しているためバージョンは変更されなかったことが判ります。

$ aws ssm get-parameter --name TestAMI
Parameter:
  ARN: arn:aws:ssm:ap-northeast-1:XXXXXXXXXXXX:parameter/TestAMI
  LastModifiedDate: '2020-05-06T10:33:50.898000+09:00'
  Name: TestAMI
  Type: String
  Value: ami-0289fbf73734505e2
  Version: 1

有効な AMI ID を指定

次に有効な AMI ID として amzn2-ami-hvm-2.0.20200406.0-x86_64-gp2(ami-0f310fced6141e627) を指定します。

$ aws ssm put-parameter --name TestAMI --value ami-0f310fced6141e627 --overwrite
Tier: Standard
Version: 2

$ aws ssm get-parameter --name TestAMI
Parameter:
  ARN: arn:aws:ssm:ap-northeast-1:XXXXXXXXXXXX:parameter/TestAMI
  DataType: aws:ec2:image
  LastModifiedDate: '2020-05-06T11:40:57.923000+09:00'
  Name: TestAMI
  Type: String
  Value: ami-0f310fced6141e627
  Version: 2

今度は正常に値が置き換えられ、Version: 2 に変わったことが確認できました。

パラメータストアを指定して EC2 を起動

AMI ID データタイプのパラメータストアを参照して、EC2 を起動します。以下のように --image-id resolve:ssm:<パラメータ名> で指定可能です。

$ aws ec2 run-instances \
>     --image-id resolve:ssm:TestAMI \
>     --count 1 \
>     --instance-type t3.nano \
>     --key-name cm_marumo.atsushi \
>     --security-groups default

起動された EC2 の情報を確認すると、パラメータストアに格納されている AMI ID ami-0f310fced6141e627 が利用されたことが判ります。

$ aws ec2 describe-instances
Reservations:
- Groups: []
  Instances:
  - AmiLaunchIndex: 0
    Architecture: x86_64
    BlockDeviceMappings:
    - DeviceName: /dev/xvda
      Ebs:
        AttachTime: '2020-05-06T02:44:07+00:00'
        DeleteOnTermination: true
        Status: attached
        VolumeId: vol-0a7554d54f797f72f
    CapacityReservationSpecification:
      CapacityReservationPreference: open
    ClientToken: ''
    CpuOptions:
      CoreCount: 1
      ThreadsPerCore: 2
    EbsOptimized: false
    EnaSupport: true
    HibernationOptions:
      Configured: false
    Hypervisor: xen
    ImageId: ami-0f310fced6141e627
    InstanceId: i-0553b8a94b57a9075
    InstanceType: t3.nano
  (後略)

検証は以上です!

さいごに

文字列パラメータに data-type という新しい属性が追加され、まずは AMI ID タイプが追加されました。新たに data-type という属性を設けたことを考えると、今後、AMI ID 同様にデータタイプが追加されていくのかな? と期待してしまいますね。

これまでパラメータストアは値を保管するだけの「箱」という印象でしたが、data-type の追加によって、「AMI ID の有効性の検証」など、単なる文字列の保管にとどまらないパラメータストアの新たな可能性を感じるアップデートですね!

以上!大阪オフィスの丸毛(@marumo1981)でした!

リファレンス