[アップデート]Amazon EBS で コピーされるソーススナップショットをIAMポリシーで制御可能になりました
お疲れさまです。とーちです。
Amazon EBS が EBS スナップショットをコピーするための追加のリソースレベルのアクセス権限をサポートしたというアップデートがありました。
少し前に似たようなアップデートがあったような気がして調べてみたところ、2025年1月31日に以下のアップデートがありました。
2025年1月のアップデートでは、CreateVolume アクション(EBSボリュームの作成をするもので、EBSスナップショットからボリュームを作成することもできる)が対象でしたが、今回はCopySnapshot アクション(EBSスナップショットのコピーをする)を対象として、IAMポリシーで使用できる条件(Condition)が追加されたようです。
また、以下のAWSブログを読んでみると、想像していたよりも複雑で興味深いアップデートであることがわかりました。
今回は、このアップデートの内容を詳しく見ていきましょう。
EBS スナップショットのコピーとIAMポリシーの関係
CopySnapshot アクションは、ソースとなるスナップショットを別のスナップショットとしてコピーするものです。
これまでは、作成先のスナップショットに対してのみIAMポリシーが有効で、ソースとなるスナップショットには特に権限が必要ありませんでした。2025年4月28日現在、日本語のAWSドキュメントはまだ更新されていないようで、以下のように記載されています。
CopySnapshot アクション用に指定されたリソースレベルのアクセス許可は、新しいスナップショットにのみに適用されます。ソーススナップショットには指定できません。
例えば、以下のポリシー例では、「Production」タグが付いたスナップショットのみをコピーできるように見えますが、実際にはソーススナップショットに対する制限はかからず、どのスナップショットからでもコピーできていたということになります(ドキュメントの記述から推測した想定であり、アップデート以前に実際にこの動作を確認したわけではありません)。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowCopySnapshot",
"Effect": "Allow",
"Action": "ec2:CopySnapshot",
"Resource": "arn:aws:ec2:*:account-id:snapshot/*",
"Condition": {
"StringEquals": {
"aws:ResourceTag/Environment": "Production"
}
}
}
]
}
今回のアップデートの重要ポイント
今回のアップデートの肝は、主に以下の2点です。
- CopySnapshotアクションでソーススナップショットに対するIAMポリシー制御が可能に
- CopySnapshotアクションで新たな条件キー(EC2固有・グローバル)が使用可能に
それぞれ詳しく見ていきましょう。
コピーされるソーススナップショットをIAMポリシーで制御可能に
上記の通り、従来はソーススナップショットについてはIAMの制御の対象外でしたが、アップデートによりソーススナップショットについてもIAMの操作対象とすることが可能になりました。
IAMポリシーの書き方は以下のようになります。
{
"Effect": "Allow",
"Action": "ec2:CopySnapshot",
"Resource": [
"arn:aws:ec2:*::snapshot/snap-1234567890abcdef0",
"arn:aws:ec2:*::snapshot/snap-9876543210fedcba0"
]
}
// IAM policy for the copied snapshot
{
"Effect": "Allow",
"Action": "ec2:CopySnapshot",
"Resource": "arn:aws:ec2:*::snapshot/${*}"
}
AWSブログによると、 ソーススナップショットにはsnap-
をつけ、コピー先スナップショットは${*}
で表す とのことです。これによりソーススナップショットかコピー先スナップショットかを判別しているようです。
実際に動作を確認してみる
テスト用に以下のようなポリシーを作成してみました。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "ec2:CopySnapshot",
"Resource": [
"arn:aws:ec2:*::snapshot/<実在するスナップショットID>"
]
},
{
"Effect": "Allow",
"Action": "ec2:CopySnapshot",
"Resource": "arn:aws:ec2:*::snapshot/${*}"
}
]
}
このポリシーを持つIAMロールをEC2に対して付与します。EC2には上記ポリシーのほかにはSSM接続のためのAmazonSSMManagedInstanceCore
ポリシーのみが付与されています。
この状態で、以下のAWS CLIを実行します。
aws ec2 copy-snapshot \
--source-region ap-northeast-1 \
--source-snapshot-id <実在するスナップショットID> \
--description "Approved snapshot copy"
これは当然ですが、問題なく実行できます。それでは、IAMポリシーを以下のように変更してみましょう。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "ec2:CopySnapshot",
"Resource": [
"arn:aws:ec2:*::snapshot/<実在しないスナップショットID>"
]
},
{
"Effect": "Allow",
"Action": "ec2:CopySnapshot",
"Resource": "arn:aws:ec2:*::snapshot/${*}"
}
]
}
この状態で上記と同じコマンドを実行すると以下のようなエラーになりました。ちゃんとソーススナップショットを対象としたIAMによる制御ができていますね。
An error occurred (UnauthorizedOperation) when calling the CopySnapshot operation: You are not authorized to perform this operation. User: arn:aws:sts::[ACCOUNT_ID]:assumed-role/ec2-app-role/i-[INSTANCE_ID] is not authorized to perform: ec2:CopySnapshot on resource: arn:aws:ec2:ap-northeast-1::snapshot/snap-[SNAPSHOT_ID] because no identity-based policy allows the ec2:CopySnapshot action. Encoded authorization failure message: [ENCODED_MESSAGE]
続いて、以下のようなポリシーにしてみました。おそらく失敗するはずですがどうなるでしょうか?
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "ec2:CopySnapshot",
"Resource": "arn:aws:ec2:*::snapshot/${*}"
}
]
}
こちらも上記と同様のエラーが出て失敗となりました。やはりarn:aws:ec2:*::snapshot/${*}
という記載だけではなく、ソーススナップショットARNを明示的に許可してあげないとダメなようですね。
では以下のポリシーではどうでしょう。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "ec2:CopySnapshot",
"Resource": "arn:aws:ec2:*::snapshot/*"
}
]
}
こちらは成功しました。arn:aws:ec2:*::snapshot/*
と書くことでソーススナップショットとコピー先スナップショットを含む形になるからでしょうね。
sh-5.2$ aws ec2 copy-snapshot --source-region ap-northeast-1 --source-snapshot-id <実在するスナップショットID> --description "Approved snapshot copy"
{
"SnapshotId": "snap-01287847cde18a4b9"
}
IAM ポリシーの CopySnapshot アクションに EC2 固有の条件キーが追加
こちらはIAMポリシーでCopySnapshotアクションを指定する際にConditionとして、以下の6つのEC2固有条件キーとグローバルキーが指定できるようになったというものです。
-
- EBS ボリュームが暗号化されているかどうかを確認する条件キーです。trueの場合、暗号化されていることを示します。
-
- EBS ボリュームのサイズを確認する条件キーです。特定のサイズ以下のボリュームのみコピーすることを許可するなど、ボリュームサイズに基づいた制限を設定する場合に使用します。
-
- リソースの所有者を確認する条件キーです。自分のアカウントが所有するリソースのみに操作を制限する場合などに使用します。
-
- スナップショットの作成元となったEBSボリューム(ARN)を確認する条件キーです。特定のボリュームから作成されたスナップショットのみを操作対象とする場合に使用します。
-
- スナップショットの開始時刻を確認する条件キーです。特定の期間に作成されたスナップショットのみを操作対象とする場合に使用します。
-
- コピー元となったスナップショット(ARN)を確認する条件キーです。特定のスナップショットから作成されたスナップショットのみを操作対象とする場合に使用します。
またこれらのEC2固有条件キーの他にグローバルキーも使用できます。
条件キーを実際に試してみる
それでは条件キーを実際に試してみましょう。ここでは2つのシナリオを検証します。
シナリオ1:ec2:ParentSnapshotを使った制限
特定の親スナップショットから作成されたボリュームのスナップショットのみをコピーできるようにしてみます。
以下の3つのスナップショットを検証のために用意しました。
それぞれのスナップショットは以下のように作成されています
snap-01287847cde18a4b9
:コピー元のスナップショットsnap-03d39e5493b93ff83
:snap-01287847cde18a4b9
をコピーして作成したスナップショットsnap-04da0b0ee1406b2a5
:上記2つ以外のスナップショットからコピーして作成したスナップショット
なお、検証条件をシンプルにするためにいずれのスナップショットも暗号化はAWSマネージドキー(aws/ebs)で行っています。
この状態で以下のようなIAMポリシーを作成しEC2に付与しました。コピー元スナップショットがsnap-01287847cde18a4b9
のスナップショットのみをコピー可能とするIAMポリシーになります。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "ec2:CopySnapshot",
"Resource": "arn:aws:ec2:*::snapshot/snap-*",
"Condition": {
"StringEquals": {
"ec2:ParentSnapshot": "arn:aws:ec2:ap-northeast-1::snapshot/snap-01287847cde18a4b9"
}
}
},
{
"Effect": "Allow",
"Action": "ec2:CopySnapshot",
"Resource": "arn:aws:ec2:*::snapshot/${*}"
}
]
}
この状態で以下のコマンドを試してみましょう。
# snap-03d39e5493b93ff83からのコピー
sh-5.2$ aws ec2 copy-snapshot --source-region ap-northeast-1 --source-snapshot-id snap-03d39e5493b93ff83 --description "Approved snapshot copy"
{
"SnapshotId": "snap-019a84881d272f10f"
}
# snap-04da0b0ee1406b2a5からのコピー
sh-5.2$ aws ec2 copy-snapshot --source-region ap-northeast-1 --source-snapshot-id snap-04da0b0ee1406b2a5 --description "Approved snapshot copy"
An error occurred (UnauthorizedOperation) when calling the CopySnapshot operation: You are not authorized to perform this operation. User: arn:aws:sts::[ACCOUNT_ID]:assumed-role/ec2-app-role/i-[INSTANCE_ID] is not authorized to perform: ec2:CopySnapshot on resource: arn:aws:ec2:ap-northeast-1::snapshot/snap-04da0b0ee1406b2a5 because no identity-based policy allows the ec2:CopySnapshot action. Encoded authorization failure message: [ENCODED_MESSAGE]
期待どおりの動作ですね。Conditionで指定したsnap-01287847cde18a4b9
をコピーして作成したスナップショットをコピーした際は成功し、そうでないスナップショットをコピーしようとしたら失敗しました。
シナリオ2:ec2:VolumeSizeを使った制限
コピー先スナップショットに関するポリシーに対するConditionも機能するかを確かめたいので、今度はコピー先スナップショットにサイズ制限をかけるポリシーを作成してみました。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "ec2:CopySnapshot",
"Resource": "arn:aws:ec2:*::snapshot/snap-*"
},
{
"Effect": "Allow",
"Action": "ec2:CopySnapshot",
"Resource": "arn:aws:ec2:*::snapshot/${*}",
"Condition": {
"NumericLessThanEquals": {
"ec2:VolumeSize": "10"
}
}
}
]
}
再掲ですが、現状ではいずれのスナップショットも10GBを超えているので、どのスナップショットをコピーしようとしてもコピー先のスナップショットの容量は10GBを超え、失敗するはずです。
# snap-04da0b0ee1406b2a5からのコピー
sh-5.2$ aws ec2 copy-snapshot --source-region ap-northeast-1 --source-snapshot-id snap-04da0b0ee1406b2a5 --description "Approved snapshot copy"
An error occurred (UnauthorizedOperation) when calling the CopySnapshot operation: You are not authorized to perform this operation. User: arn:aws:sts::[ACCOUNT_ID]:assumed-role/ec2-app-role/i-[INSTANCE_ID] is not authorized to perform: ec2:CopySnapshot on resource: arn:aws:ec2:ap-northeast-1::snapshot/* because no identity-based policy allows the ec2:CopySnapshot action. Encoded authorization failure message: [ENCODED_MESSAGE]
# snap-03d39e5493b93ff83からのコピー
sh-5.2$ aws ec2 copy-snapshot --source-region ap-northeast-1 --source-snapshot-id snap-03d39e5493b93ff83 --description "Approved snapshot copy"
An error occurred (UnauthorizedOperation) when calling the CopySnapshot operation: You are not authorized to perform this operation. User: arn:aws:sts::[ACCOUNT_ID]:assumed-role/ec2-app-role/i-[INSTANCE_ID] is not authorized to perform: ec2:CopySnapshot on resource: arn:aws:ec2:ap-northeast-1::snapshot/* because no identity-based policy allows the ec2:CopySnapshot action. Encoded authorization failure message: [ENCODED_MESSAGE]
こちらも期待どおり、どちらのスナップショットコピーも失敗しました。
まとめ
以上、Amazon EBS が EBS スナップショットをコピーするための追加のリソースレベルのアクセス権限をサポートしたというアップデートを検証してみました。
調べてみるとなかなか面白いアップデートでしたね。以前はソーススナップショットのコントロールをIAMでは出来なかったというのが意外でした。
このアップデートによって、以下のようなメリットが得られます
- ソーススナップショットの制御:特定のスナップショットのみをコピー可能にする制御ができるようになりました
- ボリュームサイズによる制限:コピーできるスナップショットのサイズを制限することでコスト最適化が可能になりました
- 所有者による制限:自分のアカウント以外からのコピーを制限することでガバナンス強化が期待できます
- 親ボリュームや親スナップショットによる制限:特定のボリュームやスナップショットから派生したスナップショットのみを許可することで、信頼性の高いスナップショットのみを使用するポリシーを実装できます
このあたりに課題を抱えている方はぜひ試して頂ければと思います。
以上、とーちでした。