[アップデート] コピー先のAMIにコピー元のAMIのタグを付与するオプションが追加されました

AMIにタグを大量に付与している場合にとってもありがたい
2022.11.22

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

コピー先のAMIに同じタグを付与したいな

こんにちは、のんピ(@non____97)です。

皆さんはコピー先のAMIにコピー元のAMIのタグを付与したいなと思ったことはありますか? 私はあります。

AWS Backupだとそういったことは可能ですが、ジョブ管理システムなどを使ってAMIを順序立てて取りたい場合は、AWS Backupではなくスクリプトなどで制御する必要があります。

場合によってはDRとしてAMIをリージョン間コピー場面もあると思います。その際、スクリプトで対象のコピー元のAMIのタグを全て取得してコピー先のAMIに付与するのは地味に面倒な作業でした。

今回、AMIコピー時にコピー先のAMIにコピー元のAMIのタグを付与するオプションが追加されました。

先ほどのスクリプトで頑張っていた部分を減らせそうです。

早速確認してみたので紹介します。

いきなりまとめ

  • AMIコピー時にコピー先のAMIにコピー元のAMIのタグを付与することができる
  • 別リージョンへのコピーでもタグを付与できる
  • 以下タグはコピー先のAMIに付与されない
    • ami:から始まるタグ
    • パブリック及び、共有されているAMIに対して他のAWSアカウントから付与されたタグ
  • AMIに紐づくEBSスナップショットのタグはコピー先のEBSスナップショットに付与されない

APIを確認してみる

まず、APIを確認してみましょう。

CopyImage APIを確認すると、CopyImageTagsというパラメーターが追加されていました。

CopyImageTags

Indicates whether to include your user-defined AMI tags when copying the AMI.

The following tags will not be copied:

  • System tags (prefixed with aws:)

  • For public and shared AMIs, user-defined tags that are attached by other AWS accounts

Default: Your user-defined AMI tags are not copied.

Type: Boolean

Required: No

CopyImage - Amazon Elastic Compute Cloud

CopyImageTagsTrueにすれば、コピー先のAMIに同じタグが付与されそうです。

また、以下タグはコピー先のAMIに付与されないようです。

  • ami:から始まるタグ
  • パブリック及び、共有されているAMIに対して他のAWSアカウントから付与されたタグ

AWS CLIのcopy-imageも見てみましょう。

  copy-image
[--client-token <value>]
[--description <value>]
[--encrypted | --no-encrypted]
[--kms-key-id <value>]
--name <value>
--source-image-id <value>
--source-region <value>
[--destination-outpost-arn <value>]
[--dry-run | --no-dry-run]
[--copy-image-tags | --no-copy-image-tags]
[--cli-input-json <value>]
[--generate-cli-skeleton <value>]
[--debug]
[--endpoint-url <value>]
[--no-verify-ssl]
[--no-paginate]
[--output <value>]
[--query <value>]
[--profile <value>]
[--region <value>]
[--version <value>]
[--color <value>]
[--no-sign-request]
[--ca-bundle <value>]
[--cli-read-timeout <value>]
[--cli-connect-timeout <value>]

コピー先のAMIに同じタグを付与したい場合は--copy-image-tagsで、付与したくない場合は--no-copy-image-tagsをすれば良さそうですね。

やってみた

同じリージョンへのコピー

それでは実際にやってみます。

まずは同じリージョンへのコピーからです。

以下のようにこれは:AMIですというタグを付与したAMIをus-east-1に用意しました。

$ aws ec2 describe-images --image-ids ami-02c3d9a791e910b98
{
    "Images": [
        {
            "Architecture": "x86_64",
            "CreationDate": "2022-11-19T09:36:19.000Z",
            "ImageId": "ami-02c3d9a791e910b98",
            "ImageLocation": "<AWSアカウントID>/ami-copy-test-instance_ami",
            "ImageType": "machine",
            "Public": false,
            "OwnerId": "<AWSアカウントID>",
            "PlatformDetails": "Linux/UNIX",
            "UsageOperation": "RunInstances",
            "State": "available",
            "BlockDeviceMappings": [
                {
                    "DeviceName": "/dev/xvda",
                    "Ebs": {
                        "DeleteOnTermination": true,
                        "Iops": 3000,
                        "SnapshotId": "snap-0a8898c8aa4b01c38",
                        "VolumeSize": 8,
                        "VolumeType": "gp3",
                        "Throughput": 125,
                        "Encrypted": false
                    }
                }
            ],
            "Description": "ami-copy-test-instance_ami",
            "EnaSupport": true,
            "Hypervisor": "xen",
            "Name": "ami-copy-test-instance_ami",
            "RootDeviceName": "/dev/xvda",
            "RootDeviceType": "ebs",
            "SriovNetSupport": "simple",
            "Tags": [
                {
                    "Key": "これは",
                    "Value": "AMIです"
                }
            ],
            "VirtualizationType": "hvm"
        }
    ]
}

こちらのAMIに紐づくEBSスナップショットにもこれは:EBSスナップショットですとタグを付与しています。

$ aws ec2 describe-snapshots --snapshot-ids snap-0a8898c8aa4b01c38
{
    "Snapshots": [
        {
            "Description": "Created by CreateImage(i-0b9597cb1fc2caada) for ami-02c3d9a791e910b98",
            "Encrypted": false,
            "OwnerId": "<AWSアカウントID>",
            "Progress": "100%",
            "SnapshotId": "snap-0a8898c8aa4b01c38",
            "StartTime": "2022-11-19T09:36:19.667000+00:00",
            "State": "completed",
            "VolumeId": "vol-0b5d2bb332d09b737",
            "VolumeSize": 8,
            "Tags": [
                {
                    "Key": "これは",
                    "Value": "AMIに紐づくEBSスナップショットです"
                }
            ],
            "StorageTier": "standard"
        }
    ]
}

マネジメントコンソールからAMIをコピーします。AMIをコピーする際にCopy tagsというオプションが追加されていますね。こちらにチェックを入れてAMIをコピーをクリックします。

同じリージョンにAMIをコピー

コピー先のAMIを確認します。

$ aws ec2 describe-images --image-ids ami-051d76d674f783e07
{
    "Images": [
        {
            "Architecture": "x86_64",
            "CreationDate": "2022-11-19T09:41:03.000Z",
            "ImageId": "ami-051d76d674f783e07",
            "ImageLocation": "<AWSアカウントID>/ami-copy-test-instance_ami",
            "ImageType": "machine",
            "Public": false,
            "OwnerId": "<AWSアカウントID>",
            "PlatformDetails": "Linux/UNIX",
            "UsageOperation": "RunInstances",
            "State": "available",
            "BlockDeviceMappings": [
                {
                    "DeviceName": "/dev/xvda",
                    "Ebs": {
                        "DeleteOnTermination": true,
                        "Iops": 3000,
                        "SnapshotId": "snap-038d113bfc770ee53",
                        "VolumeSize": 8,
                        "VolumeType": "gp3",
                        "Throughput": 125,
                        "Encrypted": false
                    }
                }
            ],
            "Description": "[Copied ami-02c3d9a791e910b98 from us-east-1] ami-copy-test-instance_ami",
            "EnaSupport": true,
            "Hypervisor": "xen",
            "Name": "ami-copy-test-instance_ami",
            "RootDeviceName": "/dev/xvda",
            "RootDeviceType": "ebs",
            "SriovNetSupport": "simple",
            "Tags": [
                {
                    "Key": "これは",
                    "Value": "AMIです"
                }
            ],
            "VirtualizationType": "hvm"
        }
    ]
}

コピー元AMIと同じタグが付与されていますね。

EBSスナップショットのタグも確認してみます。

$ aws ec2 describe-snapshots --snapshot-ids snap-038d113bfc770ee53
{
    "Snapshots": [
        {
            "Description": "Copied for DestinationAmi ami-051d76d674f783e07 from SourceAmi ami-02c3d9a791e910b98 for SourceSnapshot snap-0a8898c8aa4b01c38. Task created on 1,668,850,863,132.",
            "Encrypted": false,
            "OwnerId": "<AWSアカウントID>",
            "Progress": "100%",
            "SnapshotId": "snap-038d113bfc770ee53",
            "StartTime": "2022-11-19T09:41:10.687000+00:00",
            "State": "completed",
            "VolumeId": "vol-ffffffff",
            "VolumeSize": 8,
            "StorageTier": "standard"
        }
    ]
}

EBSスナップショットにはタグが付与されていませんでした。そのため、EBSスナップショットのタグもコピーしたい場合はAWS CLIなどを使用して自分で実装する必要があります。

異なるリージョンへのコピー

同じリージョンへコピーしたAMIに同じタグが付与されることは確認できたので、異なるリージョンにコピーした場合も確認してみます。

送信先リージョンに東京リージョンを指定し、Copy tagsにチェックを入れてAMIをコピーをクリックします。

異なるリージョンにAMIをコピー

コピー先のリージョンでAMIを確認します。

$ aws ec2 describe-images --filters Name=name,Values=ami-copy-test-instance_ami --region ap-northeast-1
{
    "Images": [
        {
            "Architecture": "x86_64",
            "CreationDate": "2022-11-19T09:49:03.000Z",
            "ImageId": "ami-09d7079d8044ab0cc",
            "ImageLocation": "<AWSアカウントID>/ami-copy-test-instance_ami",
            "ImageType": "machine",
            "Public": false,
            "OwnerId": "<AWSアカウントID>",
            "PlatformDetails": "Linux/UNIX",
            "UsageOperation": "RunInstances",
            "State": "available",
            "BlockDeviceMappings": [
                {
                    "DeviceName": "/dev/xvda",
                    "Ebs": {
                        "DeleteOnTermination": true,
                        "Iops": 3000,
                        "SnapshotId": "snap-022c0b3b86b17d9d6",
                        "VolumeSize": 8,
                        "VolumeType": "gp3",
                        "Throughput": 125,
                        "Encrypted": false
                    }
                }
            ],
            "Description": "[Copied ami-02c3d9a791e910b98 from us-east-1] ami-copy-test-instance_ami",
            "EnaSupport": true,
            "Hypervisor": "xen",
            "Name": "ami-copy-test-instance_ami",
            "RootDeviceName": "/dev/xvda",
            "RootDeviceType": "ebs",
            "SriovNetSupport": "simple",
            "Tags": [
                {
                    "Key": "これは",
                    "Value": "AMIです"
                }
            ],
            "VirtualizationType": "hvm"
        }
    ]
}

コピー元AMIと同じタグが付与されていますね。

EBSスナップショットのタグも確認してみます。

$ aws ec2 describe-snapshots --snapshot-ids snap-022c0b3b86b17d9d6 --region ap-northeast-1
{
    "Snapshots": [
        {
            "Description": "Copied for DestinationAmi ami-09d7079d8044ab0cc from SourceAmi ami-02c3d9a791e910b98 for SourceSnapshot snap-0a8898c8aa4b01c38. Task created on 1,668,851,342,742.",
            "Encrypted": false,
            "OwnerId": "<AWSアカウントID>",
            "Progress": "100%",
            "SnapshotId": "snap-022c0b3b86b17d9d6",
            "StartTime": "2022-11-19T09:49:05.186000+00:00",
            "State": "completed",
            "VolumeId": "vol-ffffffff",
            "VolumeSize": 8,
            "StorageTier": "standard"
        }
    ]
}

やはりEBSスナップショットにはタグが付与されていませんでした。

AMIにタグを大量に付与している場合にとってもありがたい

コピー先のAMIにコピー元のAMIのタグを付与するオプションが追加されたアップデートを紹介しました。

AMIにタグを大量に付与している場合にとってもありがたいですね。ただし、EBSスナップショットに対してはタグを付与してくれないのでそこは要注意です。

この記事が誰かの助けになれば幸いです。

以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!