[アップデート] AMI に非推奨となるまでの有効期限を設定できるようになりました

有効期限が切れると AMI ユーザーによる参照が一部制限を受けます。使用は引き続き可能です。

コンバンハ、千葉(幸)です。

AMI に有効期限を設定できるようになりました。

有効期限が切れると非推奨(deprecated)な状態となり、当該 AMI を所有していない AWS アカウントからの参照が一部制限されます。

AMI 自体は引き続き利用できる状態であり、インスタンスの新規ローンチや作成済みのインスタンスに影響を与えるものではありません

AMI の使用を継続して可能としつつ、AMI の名称や説明に記載するよりも明確に 非推奨であることを表せるようになりました。

何ができるようになったのか

以下のイメージです。

ここでは、以下の通り呼称します。

  • AMI のオーナーアカウント:AMI 所有者
  • AMI を利用可能なアカウント:AMI ユーザー

AMI のプロパティに有効期限を表すものが追加されました。有効期限切れとなると、 AMI ユーザーにのみ影響が発生します。

ここでの AMI ユーザーとは、パブリックな AMI や共有されたプライベートな AMI を利用する AWS アカウントを表します。

以下、AMI ユーザーにおける影響を記します。

有効期限切れによりできなくなること

  • マネジメントコンソールでの当該 AMI の参照
  • デフォルトでのDescribeImagesAPIによる当該 AMI の参照

有効期限切れ後もできること

  • DescribeImagesAPIで以下を指定した場合の当該 AMI の参照
    • 当該 AMI の AMI ID
    • 非推奨 AMI も参照するオプション
  • 当該 AMI からの新規インスタンスのローンチ

補足

  • 特定の AMI から起動され、その後に AMI が非推奨となったインスタンスは何の影響も受けません
  • AMI に有効期限を設定することができるのは AMI 所有者のみです
  • AMI の有効期限の設定は AWS マネジメントコンソールではできません
  • AMI ユーザーによる非推奨 AMI の参照はマネジメントコンソールからはできません

繰り返しとなりますが、AMI 所有者にとっては有効期限切れによる影響はありません。今回のアップデートは、 AMI ユーザー向けに より明確に非推奨化を提示するためのものとして機能します。

やってみた

前提として以下のような構成となっています。

  • AMI 所有者:000000000000
  • AMI ユーザー:999999999999
  • AMI ID:ami-07136d89de4ceb101

AMI はプライベートなまま AMI ユーザーに共有がかけられています。この AMI に有効期限を設定し、非推奨となった後の挙動を確認します。

なお、今回は AWS CLI は以下のバージョンを使用します。

% aws --version
aws-cli/1.19.93 Python/2.7.16 Darwin/19.6.0 botocore/1.20.93

毎度おなじみですが AWS CLI v2 は新規 API への対応が遅れがちなので、2021/6/13 時点では必要なコマンドが実行できませんでした。AWS ドキュメントの記述は v2 前提で書かれているようなので、一部指定するオプションに差異があります。

有効期限切れ前の AMI ユーザーによる参照

まずは有効期限切れの前の AMI ユーザー側での状態の確認です。

マネジメントコンソールから問題なく参照できる状態です。

AMIUSER1st

AWS CLI でも問題なく参照できます。

AMI ユーザーアカウントで実行

% aws ec2 describe-images --filters Name=is-public,Values=false
{
    "Images": [
        {
            "Architecture": "x86_64",
            "CreationDate": "2021-06-13T08:47:50.000Z",
            "ImageId": "ami-07136d89de4ceb101",
            "ImageLocation": "000000000000/AmazonLinux2-2021-06-13T08-46-11Z",
            "ImageType": "machine",
            "Public": false,
            "OwnerId": "000000000000",
            "PlatformDetails": "Linux/UNIX",
            "UsageOperation": "RunInstances",
            "State": "available",
            "BlockDeviceMappings": [
                {
                    "DeviceName": "/dev/xvda",
                    "Ebs": {
                        "DeleteOnTermination": true,
                        "SnapshotId": "snap-09ff6a5a2a7b24c89",
                        "VolumeSize": 8,
                        "VolumeType": "gp2",
                        "Encrypted": false
                    }
                }
            ],
            "EnaSupport": true,
            "Hypervisor": "xen",
            "Name": "AmazonLinux2-2021-06-13T08-46-11Z",
            "RootDeviceName": "/dev/xvda",
            "RootDeviceType": "ebs",
            "SriovNetSupport": "simple",
            "VirtualizationType": "hvm"
        }
    ]
}

AMI 所有者による有効期限の設定

AMI 所有者アカウントから AWS CLI で実行していきます。

有効期限として過去の日時を指定できないため、1 分後(実際は秒数が丸められるため微妙に異なりますが)を指定する形式で実行します。

AMI 所有者アカウントで実行

% IMAGEID=ami-07136d89de4ceb101
% DEPRECATEDATE=`date -v+1M -u +%Y-%m-%dT%H:%M:%S`
% aws ec2 enable-image-deprecation \
    --image-id $IMAGEID \
    --deprecate-at "$DEPRECATEDATE"
{
    "Return": true
}

trueとだけ返ってきておしまいです。どう見えるか確認していきましょう。

AMI 所有者による AMI の参照

まずは有効期限切れによる影響がない AMI 所有者からです。

マネジメントコンソールから引き続き問題なく参照できます。有効期限に関するプロパティはコンソールからは確認できません。

AMIOWNER

aws ec2 describe-images を「パブリックでないもの」というフィルターだけをかけて実行すると、引き続き当該 AMI が参照できます。

AMI 所有者アカウントで実行

% aws ec2 describe-images --filters Name=is-public,Values=false | jq '.Images[].ImageId'
"ami-0167977651e1d11be"
"ami-021e2213dc25159d3"
"ami-02f91633d81dc8ec4"
"ami-0639e7e335df01566"
"ami-07136d89de4ceb101"
---以下略---

詳細を確認すると、DeprecationTimeというフィールドが増えていることがわかります。

AMI 所有者アカウントで実行

% aws ec2 describe-images --image-ids $IMAGEID
{
    "Images": [
        {
---略---
            "Hypervisor": "xen",
            "DeprecationTime": "2021-06-13T11:57:00.000Z",
            "State": "available",
            "SriovNetSupport": "simple",
            "ImageId": "ami-07136d89de4ceb101",
---略---
        }
    ]
}

「有効期限切れのものは表示しない」というオプションは用意されておらず、非推奨なものを除外したい場合には一工夫が必要そうです。

AMI 所有者アカウントで実行

% DATE=`date -u +%Y-%m-%dT%H:%M:%S`
% aws ec2 describe-images --filters Name=is-public,Values=false\
| jq '.Images[] | select(.DeprecationTime ==null or .DeplicationTime > "'$DATE'") | .ImageId'
"ami-0167977651e1d11be"
"ami-021e2213dc25159d3"
"ami-02f91633d81dc8ec4"
"ami-0639e7e335df01566"
"ami-0812a7c8da0b089de"
"ami-091abda999bef592f"
"ami-0968eba7adf356d19"
"ami-0a7e610df58f1a480"
"ami-0f6120796c79251cd"

AMI ユーザーによる AMI の参照

AMI ユーザー側のアカウントでの確認です。

マネジメントコンソールから参照できなくなっています。AMI ID を指定して検索をかけても同様です。

AMIUSERNOTFOUND

AWS CLI で参照しても結果に現れません。

AMI ユーザーアカウントで実行

% aws ec2 describe-images --filters Name=is-public,Values=false
{
    "Images": []
}

--include-deprecatedオプションを付与することで参照できます。(今回使用した AWS CLI のバージョンではtrue を指定する必要はありませんでした。)

AMI ユーザーアカウントで実行

% aws ec2 describe-images --filters Name=is-public,Values=false\
  --include-deprecated
{
    "Images": [
        {
            "VirtualizationType": "hvm",
            "EnaSupport": true,
            "PlatformDetails": "Linux/UNIX",
            "Hypervisor": "xen",
            "DeprecationTime": "2021-06-13T11:57:00.000Z",
            "State": "available",
            "SriovNetSupport": "simple",
            "ImageId": "ami-07136d89de4ceb101",
---略---
        }
    ]
}

--image-idsを指定することでも参照できます。

AMI ユーザーアカウントで実行

% aws ec2 describe-images --image-ids $IMAGEID
{
    "Images": [
        {
            "VirtualizationType": "hvm",
            "EnaSupport": true,
            "PlatformDetails": "Linux/UNIX",
            "Hypervisor": "xen",
            "DeprecationTime": "2021-06-13T11:57:00.000Z",
            "State": "available",
            "SriovNetSupport": "simple",
            "ImageId": "ami-07136d89de4ceb101",
---略---
        }
    ]
}

有効期限切れ AMI からのインスタンスの起動

非推奨な状態の AMI を指定し、EC2 インスタンスを新規ローンチします。

問題なく実行できました。

AMI ユーザーアカウントで実行

% aws ec2 run-instances --image-id $IMAGEID
{
    "Groups": [],
    "Instances": [
        {
            "AmiLaunchIndex": 0,
            "ImageId": "ami-07136d89de4ceb101",
            "InstanceId": "i-01d9d5bb3019d3c88",
            "InstanceType": "m1.small",
            "LaunchTime": "2021-06-13T12:44:12+00:00",
            "Monitoring": {
                "State": "disabled"
            },
            "Placement": {
                "AvailabilityZone": "ap-northeast-1a",
                "GroupName": "",
                "Tenancy": "default"
            },
---以下略---

有効期限設定の解除

AMI 所有者アカウントから有効期限切れ状態を解除できます。

AMI 所有者アカウントで実行

% aws ec2 disable-image-deprecation \
    --image-id $IMAGEID
{
    "Return": true
}

上記を実行後は、AMI ユーザーアカウントからも問題なく参照できる状態に戻ります。

終わりに

AMI に「非推奨とする」までの有効期限を表すプロパティが追加された、というアップデートでした。

AMI 所有者自身にはほとんど影響はありません。多くの AMI ユーザーがいる環境で、いきなり AMI を登録解除すると影響が大きいため徐々にフェードアウトさせていく、という用途で使えそうです。

有効期限切れになっても引き続き使用できるし、オプションで指定すれば参照もできる、という点は間違えないように覚えておきましょう。

以上、 チバユキ (@batchicchi) がお送りしました。