AWS CLI または AWS SDK で使用するサンプルポリシー - Amazon Elastic Compute Cloud

AWS CLI または AWS SDK で使用するサンプルポリシー

IAM ポリシーを使用して Amazon EC2 に必要な許可をユーザーに付与する必要があります。以下の例では、Amazon EC2 に対してユーザーが所有する許可をコントロールするために使用できるポリシーステートメントを示しています。これらのポリシーは、AWS CLI または AWS SDK で行われたリクエスト向けに設計されています。詳細については、「IAM ユーザーガイド」の「IAM ポリシーの作成」を参照してください。Amazon EC2 コンソールで機能するポリシーの例については、Amazon EC2 コンソールで機能するサンプル ポリシーを参照してください。Amazon VPC に固有の IAM ポリシーの例については、Amazon VPC の Identity and Access Managementを参照してください。

次の例では、ユーザー入力プレースホルダーをユーザー自身の情報で置き換えます。

例: 読み取り専用アクセス

次のポリシーでは、名前が Describe で始まるすべての Amazon EC2 API アクションを使用できるアクセス許可をユーザーに与えます。Resource エレメントにワイルドカードを使用します。これは、ユーザーが API アクションですべてのリソースを指定できることを示します。また、API アクションがリソースレベルのアクセス許可をサポートしていない場合も、* ワイルドカードが必要です。どの Amazon EC2 API アクションでどの ARN を使用できるかの詳細については、Amazon EC2 のアクション、リソース、および条件キーを参照してください。

デフォルトで API アクションを使用するアクセス許可が拒否されているため、ユーザーには (別のステートメントでアクセス許可が与えられない限り) そのリソースに対してアクションを実行するアクセス許可がありません。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:Describe*", "Resource": "*" } ] }

例: 特定のリージョンへのアクセスの制限

次のポリシーでは、リージョンが 欧州 (フランクフルト) でない限り、すべての Amazon EC2 API アクションを使用するアクセス許可をユーザーに拒否します。これにはグローバル条件キー aws:RequestedRegion が使用され、このキーはすべての Amazon EC2 API アクションでサポートされています。

{ "Version":"2012-10-17", "Statement": [ { "Effect": "Deny", "Action": "ec2:*", "Resource": "*", "Condition": { "StringNotEquals": { "aws:RequestedRegion": "eu-central-1" } } } ] }

または、条件キー ec2:Region を使用することもできます。これは、Amazon EC2 に固有のもので、すべての Amazon EC2 API アクションでサポートされています。

{ "Version":"2012-10-17", "Statement": [ { "Effect": "Deny", "Action": "ec2:*", "Resource": "*", "Condition": { "StringNotEquals": { "ec2:Region": "eu-central-1" } } } ] }

インスタンスの使用

例: すべてのインスタンスを記述、起動、停止、開始、および終了する

次のポリシーでは、Action エレメントで指定された API アクションを使用するアクセス許可をユーザーに与えます。Resource エレメントでは * ワイルドカードを使用して、ユーザーが API アクションですべてのリソースを指定できることを示します。また、API アクションがリソースレベルのアクセス許可をサポートしていない場合も、* ワイルドカードが必要です。どの Amazon EC2 API アクションでどの ARN を使用できるかの詳細については、Amazon EC2 のアクション、リソース、および条件キーを参照してください。

ユーザーはデフォルトで API アクションを使用するアクセス許可を拒否されているため、ユーザーには (別のステートメントでユーザーにそのアクセス許可を与えない限り) その他の API アクションを使用するアクセス許可がありません。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:DescribeInstances", "ec2:DescribeImages", "ec2:DescribeKeyPairs", "ec2:DescribeSecurityGroups", "ec2:DescribeAvailabilityZones", "ec2:RunInstances", "ec2:TerminateInstances", "ec2:StopInstances", "ec2:StartInstances" ], "Resource": "*" } ] }

例: すべてのインスタンスを記述し、特定のインスタンスのみを停止、開始、および終了する

次のポリシーでは、すべてのインスタンスを表示し、i-1234567890abcdef0 と i-0598c7d356eba48d7 インスタンスのみを開始および停止し、米国東部 (バージニア北部) リージョン (us-east-1) 内でリソースタグ 「purpose=test」 の付いたインスタンスのみを終了する許可をユーザーに与えます。

最初のステートメントでは、Resource エレメントに * ワイルドカードを使用して、ユーザーがそのアクションにすべてのリソースを指定できることを示しています。この場合、すべてのインスタンスをリストできます。また、API アクションがリソースレベルのアクセス許可をサポートしていない場合も、* ワイルドカードが必要です (この場合は、ec2:DescribeInstances)。どの Amazon EC2 API アクションでどの ARN を使用できるかの詳細については、Amazon EC2 のアクション、リソース、および条件キーを参照してください。

2 番目のステートメントでは、StopInstances および StartInstances アクションに対してリソースレベルのアクセス許可を使用しています。Resource エレメント内で、ARN によって特定のインスタンスが指定されています。

3 番目のステートメントでは、ユーザーは指定された us-east-1 アカウントに属する 米国東部 (バージニア北部) リージョン (AWS) 内のすべてのインスタンスを終了できますが、インスタンスにタグ "purpose=test" が付けられている場合に限ります。Condition エレメントは、ポリシーステートメントの発効条件を指定します。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:DescribeInstances", "Resource": "*" }, { "Effect": "Allow", "Action": [ "ec2:StopInstances", "ec2:StartInstances" ], "Resource": [ "arn:aws:ec2:us-east-1:account-id:instance/i-1234567890abcdef0", "arn:aws:ec2:us-east-1:account-id:instance/i-0598c7d356eba48d7" ] }, { "Effect": "Allow", "Action": "ec2:TerminateInstances", "Resource": "arn:aws:ec2:us-east-1:account-id:instance/*", "Condition": { "StringEquals": { "aws:ResourceTag/purpose": "test" } } } ] }

インスタンスの起動 (RunInstances)

RunInstances API アクションは、1 つ以上の オンデマンドインスタンス または 1 つ以上の スポットインスタンス を起動します。RunInstances は AMI を必要とし、インスタンスを作成します。ユーザーは、リクエストでキーペアとセキュリティグループを指定できます。VPC 内に起動するにはサブネットが必要であり、起動されるとネットワークインターフェイスが作成されます。Amazon EBS-backed AMI から起動すると、ボリュームが作成されます。そのため、ユーザーにはこれらの Amazon EC2 リソースを使用するアクセス許可が必要です。ユーザーが RunInstances に対してオプションのパラメータを指定する必要がある、またはユーザーからパラメータの特定の値を制限するポリシーステートメントを作成できます。

インスタンスの起動に必要なリソースレベルのアクセス許可の詳細については、Amazon EC2 のアクション、リソース、および条件キーを参照してください。

デフォルトでは、作成したインスタンスを記述、開始、停止、または終了するアクセス許可はユーザーに付与されていません。作成したインスタンスを管理するアクセス許可をユーザーに付与する 1 つの方法としては、インスタンスごとに特定のタグを作成し、そのタグでインスタンスを管理できるようにステートメントを作成します。詳細については、インスタンスの使用を参照してください。

AMI

次のポリシーでは、指定された AMI (ami-9e1670f7 および ami-45cf5c3c) のみを使用してインスタンスを起動できます。(別のステートメントでユーザーに起動するアクセス許可が付与されない限り) ユーザーはその他の AMI を使用してインスタンスを起動することはできません。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": [ "arn:aws:ec2:region::image/ami-9e1670f7", "arn:aws:ec2:region::image/ami-45cf5c3c", "arn:aws:ec2:region:account-id:instance/*", "arn:aws:ec2:region:account-id:volume/*", "arn:aws:ec2:region:account-id:key-pair/*", "arn:aws:ec2:region:account-id:security-group/*", "arn:aws:ec2:region:account-id:subnet/*", "arn:aws:ec2:region:account-id:network-interface/*" ] } ] }

または、次のポリシーを使用すると、ユーザーは Amazon、または特定の信頼できる検証済みのパートナーが所有するすべての AMI からインスタンスを起動できます。最初のステートメントの Condition エレメントは、ec2:Owneramazon であるかどうかをテストします。(別のステートメントでユーザーに起動するアクセス許可が付与されない限り) ユーザーはその他の AMI を使用してインスタンスを起動することはできません。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": [ "arn:aws:ec2:region::image/ami-*" ], "Condition": { "StringEquals": { "ec2:Owner": "amazon" } } }, { "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": [ "arn:aws:ec2:region:account-id:instance/*", "arn:aws:ec2:region:account-id:subnet/*", "arn:aws:ec2:region:account-id:volume/*", "arn:aws:ec2:region:account-id:network-interface/*", "arn:aws:ec2:region:account-id:key-pair/*", "arn:aws:ec2:region:account-id:security-group/*" ] } ] }

インスタンスタイプ

次のポリシーにより、ユーザーは t2.micro または t2.small インスタンスタイプのみを使用してインスタンスを起動できます。これにより、コストを管理することができます。最初のステートメントの Condition エレメントは ec2:InstanceTypet2.micro または t2.small のどちらであるかをテストするため、ユーザーは大きなインスタンスを起動することはできません。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": [ "arn:aws:ec2:region:account-id:instance/*" ], "Condition": { "StringEquals": { "ec2:InstanceType": ["t2.micro", "t2.small"] } } }, { "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": [ "arn:aws:ec2:region::image/ami-*", "arn:aws:ec2:region:account-id:subnet/*", "arn:aws:ec2:region:account-id:network-interface/*", "arn:aws:ec2:region:account-id:volume/*", "arn:aws:ec2:region:account-id:key-pair/*", "arn:aws:ec2:region:account-id:security-group/*" ] } ] }

また、ユーザーが t2.microt2.small のインスタンスタイプ以外のすべてのインスタンス起動へのアクセスを拒否するポリシーを作成することもできます。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": "ec2:RunInstances", "Resource": [ "arn:aws:ec2:region:account-id:instance/*" ], "Condition": { "StringNotEquals": { "ec2:InstanceType": ["t2.micro", "t2.small"] } } }, { "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": [ "arn:aws:ec2:region::image/ami-*", "arn:aws:ec2:region:account-id:network-interface/*", "arn:aws:ec2:region:account-id:instance/*", "arn:aws:ec2:region:account-id:subnet/*", "arn:aws:ec2:region:account-id:volume/*", "arn:aws:ec2:region:account-id:key-pair/*", "arn:aws:ec2:region:account-id:security-group/*" ] } ] }

サブネット

次のポリシーにより、ユーザーは指定したサブネット subnet-12345678 のみを使用してインスタンスを起動できます。グループは、インスタンスを他のサブネットに起動することはできません (他のステートメントがそのような許可をユーザーに与えている場合はその限りではありません)。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": [ "arn:aws:ec2:region:account-id:subnet/subnet-12345678", "arn:aws:ec2:region:account-id:network-interface/*", "arn:aws:ec2:region:account-id:instance/*", "arn:aws:ec2:region:account-id:volume/*", "arn:aws:ec2:region::image/ami-*", "arn:aws:ec2:region:account-id:key-pair/*", "arn:aws:ec2:region:account-id:security-group/*" ] } ] }

また、ユーザーがその他のサブネットにインスタンスを起動するアクセス許可を拒否するポリシーを作成することもできます。ステートメントでは、サブネット subnet-12345678 が指定されている場合以外は、ネットワークインターフェイスの作成を拒否することでこれを実行します。この拒否は、他のサブネットへのインスタンスの起動を許可する他のすべてのポリシーよりも優先されます。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": "ec2:RunInstances", "Resource": [ "arn:aws:ec2:region:account-id:network-interface/*" ], "Condition": { "ArnNotEquals": { "ec2:Subnet": "arn:aws:ec2:region:account-id:subnet/subnet-12345678" } } }, { "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": [ "arn:aws:ec2:region::image/ami-*", "arn:aws:ec2:region:account-id:network-interface/*", "arn:aws:ec2:region:account-id:instance/*", "arn:aws:ec2:region:account-id:subnet/*", "arn:aws:ec2:region:account-id:volume/*", "arn:aws:ec2:region:account-id:key-pair/*", "arn:aws:ec2:region:account-id:security-group/*" ] } ] }

EBS ボリューム

次のポリシーでは、インスタンスの EBS ボリュームが暗号化されている場合のみユーザーがインスタンスを起動できます。ユーザーは、ルートボリュームが暗号化されるように、暗号化されたスナップショットを使用して作成された AMI からインスタンスを起動する必要があります。ユーザーが起動時にインスタンスにアタッチする追加ボリュームも暗号化されている必要があります。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": [ "arn:aws:ec2:*:*:volume/*" ], "Condition": { "Bool": { "ec2:Encrypted": "true" } } }, { "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": [ "arn:aws:ec2:*::image/ami-*", "arn:aws:ec2:*:*:network-interface/*", "arn:aws:ec2:*:*:instance/*", "arn:aws:ec2:*:*:subnet/*", "arn:aws:ec2:*:*:key-pair/*", "arn:aws:ec2:*:*:security-group/*" ] } ] }

タグ

インスタンスの作成時にタグを付ける

次のポリシーでは、ユーザーがインスタンスを起動し、作成時にインスタンスにタグ付けすることができます。タグを適用するリソース作成アクションには、ユーザーが CreateTags アクションを使用するアクセス権限を持っていることが必要です。2 番目のステートメントは、ec2:CreateAction 条件キーを使用し、ユーザーが RunInstances のコンテキストでのみ、インスタンスに対してのみタグを作成できるようにします。ユーザーは、既存のリソースにタグ付けすることができず、RunInstances リクエストを使用してボリュームにタグ付けすることもできません。

詳細については、リソース作成時にタグ付けするアクセス許可の付与を参照してください。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:RunInstances" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "ec2:CreateTags" ], "Resource": "arn:aws:ec2:us-east-1:account-id:instance/*", "Condition": { "StringEquals": { "ec2:CreateAction" : "RunInstances" } } } ] }

インスタンスやボリュームの作成時に特定のタグを付ける

次のポリシーには、aws:RequestTag および RunInstances タグを使用して environment=production により作成されたすべてのインスタンスおよびボリュームへのタグ付けをユーザーに求める purpose=webserver 条件キーが含まれています。ユーザーがこれらのタグを渡さないか、タグをまったく指定しない場合、リクエストは失敗します。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:RunInstances" ], "Resource": [ "arn:aws:ec2:region::image/*", "arn:aws:ec2:region:account-id:subnet/*", "arn:aws:ec2:region:account-id:network-interface/*", "arn:aws:ec2:region:account-id:security-group/*", "arn:aws:ec2:region:account-id:key-pair/*" ] }, { "Effect": "Allow", "Action": [ "ec2:RunInstances" ], "Resource": [ "arn:aws:ec2:region:account-id:volume/*", "arn:aws:ec2:region:account-id:instance/*" ], "Condition": { "StringEquals": { "aws:RequestTag/environment": "production" , "aws:RequestTag/purpose": "webserver" } } }, { "Effect": "Allow", "Action": [ "ec2:CreateTags" ], "Resource": "arn:aws:ec2:region:account-id:*/*", "Condition": { "StringEquals": { "ec2:CreateAction" : "RunInstances" } } } ] }

インスタンスやボリュームの作成時に特定のタグを少なくとも 1 つ付ける

次のポリシーは、ForAnyValue 条件で aws:TagKeys 修飾子を使用して、リクエストで少なくとも 1 つのタグが指定されている必要があり、キー environment または webserver が含まれている必要があることを示します。タグは、インスタンスとボリュームの両方に適用される必要があります。リクエストでは、任意のタグ値を指定できます。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:RunInstances" ], "Resource": [ "arn:aws:ec2:region::image/*", "arn:aws:ec2:region:account-id:subnet/*", "arn:aws:ec2:region:account-id:network-interface/*", "arn:aws:ec2:region:account-id:security-group/*", "arn:aws:ec2:region:account-id:key-pair/*" ] }, { "Effect": "Allow", "Action": [ "ec2:RunInstances" ], "Resource": [ "arn:aws:ec2:region:account-id:volume/*", "arn:aws:ec2:region:account-id:instance/*" ], "Condition": { "ForAnyValue:StringEquals": { "aws:TagKeys": ["environment","webserver"] } } }, { "Effect": "Allow", "Action": [ "ec2:CreateTags" ], "Resource": "arn:aws:ec2:region:account-id:*/*", "Condition": { "StringEquals": { "ec2:CreateAction" : "RunInstances" } } } ] }

インスタンスの作成時にタグを付ける場合は、特定のタグを使用してタグ付けする必要がある

次のポリシーでは、ユーザーはリクエストでタグを指定する必要はありませんが、指定する場合は purpose=test タグを指定する必要があります。他のタグは許可されません。ユーザーは、RunInstances リクエストでタグ付け可能なリソースにタグを適用できます。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:RunInstances" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "ec2:CreateTags" ], "Resource": "arn:aws:ec2:region:account-id:*/*", "Condition": { "StringEquals": { "aws:RequestTag/purpose": "test", "ec2:CreateAction" : "RunInstances" }, "ForAllValues:StringEquals": { "aws:TagKeys": "purpose" } } } ] }

RunInstances の呼び出しで作成時のタグ付けをユーザーを禁止するには

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowRun", "Effect": "Allow", "Action": [ "ec2:RunInstances" ], "Resource": [ "arn:aws:ec2:us-east-1::image/*", "arn:aws:ec2:us-east-1:*:subnet/*", "arn:aws:ec2:us-east-1:*:network-interface/*", "arn:aws:ec2:us-east-1:*:security-group/*", "arn:aws:ec2:us-east-1:*:key-pair/*", "arn:aws:ec2:us-east-1:*:volume/*", "arn:aws:ec2:us-east-1:*:instance/*", "arn:aws:ec2:us-east-1:*:spot-instances-request/*" ] }, { "Sid": "VisualEditor0", "Effect": "Deny", "Action": "ec2:CreateTags", "Resource": "*" } ] }

spot-instances-request の特定のタグのみを許可します。ここで矛盾数 2 が意外な効果を発揮します。通常の状況では、タグを指定しないと非認証になります。spot-instances-request の場合、spot-instances-request タグがないと、このポリシーは評価されないため、タグなしの Spot on Run リクエストが成功します。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowRun", "Effect": "Allow", "Action": [ "ec2:RunInstances" ], "Resource": [ "arn:aws:ec2:us-east-1::image/*", "arn:aws:ec2:us-east-1:*:subnet/*", "arn:aws:ec2:us-east-1:*:network-interface/*", "arn:aws:ec2:us-east-1:*:security-group/*", "arn:aws:ec2:us-east-1:*:key-pair/*", "arn:aws:ec2:us-east-1:*:volume/*", "arn:aws:ec2:us-east-1:*:instance/*", ] }, { "Sid": "VisualEditor0", "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": "arn:aws:ec2:us-east-1:*:spot-instances-request/*", "Condition": { "StringEquals": { "aws:RequestTag/environment": "production" } } } ] }

起動テンプレートのタグ

次の例で、ユーザーはインスタンスを起動できますが、特定の起動テンプレートを使用する場合に限ります (lt-09477bcd97b0d310e)。ec2:IsLaunchTemplateResource 条件キーは、ユーザーが起動テンプレートで指定されたリソースを上書きしないようにします。ステートメントの 2 番目の部分では、ユーザーは作成時にインスタンスにタグ付けできます — ステートメントのこの部分は、起動テンプレートでタグがインスタンスに対して指定されている場合に必要になります。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": "*", "Condition": { "ArnLike": { "ec2:LaunchTemplate": "arn:aws:ec2:region:account-id:launch-template/lt-09477bcd97b0d310e" }, "Bool": { "ec2:IsLaunchTemplateResource": "true" } } }, { "Effect": "Allow", "Action": [ "ec2:CreateTags" ], "Resource": "arn:aws:ec2:region:account-id:instance/*", "Condition": { "StringEquals": { "ec2:CreateAction" : "RunInstances" } } } ] }

Elastic GPU

次のポリシーでは、ユーザーはインスタンスを起動させ、インスタンスにアタッチする Elastic GPU を指定できます。ユーザーは任意のリージョンでインスタンスを起動できますが、Elastic GPU をアタッチできるのはその us-east-2 リージョンでの起動中に限られます。

ec2:ElasticGpuType条件キーは、eg1.mediumeg1.largeインスタンスがまたはエラスティック GPU タイプのいずれかを使用することを保証します。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:RunInstances" ], "Resource": [ "arn:aws:ec2:*:account-id:elastic-gpu/*" ], "Condition": { "StringEquals": { "ec2:Region": "us-east-2", "ec2:ElasticGpuType": [ "eg1.medium", "eg1.large" ] } } }, { "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": [ "arn:aws:ec2:*::image/ami-*", "arn:aws:ec2:*:account-id:network-interface/*", "arn:aws:ec2:*:account-id:instance/*", "arn:aws:ec2:*:account-id:subnet/*", "arn:aws:ec2:*:account-id:volume/*", "arn:aws:ec2:*:account-id:key-pair/*", "arn:aws:ec2:*:account-id:security-group/*" ] } ] }

起動テンプレート

次の例で、ユーザーはインスタンスを起動できますが、特定の起動テンプレートを使用する場合に限ります (lt-09477bcd97b0d310e)。ユーザーは、RunInstances アクションでパラメータを指定することで、起動テンプレートのパラメータを上書きできます。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": "*", "Condition": { "ArnLike": { "ec2:LaunchTemplate": "arn:aws:ec2:region:account-id:launch-template/lt-09477bcd97b0d310e" } } } ] }

この例で、ユーザーは、起動テンプレートを使用する場合に限りインスタンスを起動できます。ポリシーでは ec2:IsLaunchTemplateResource 条件キーを使用して、ユーザーが起動テンプレート内の既存の ARN を上書きできないようにします。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": "*", "Condition": { "ArnLike": { "ec2:LaunchTemplate": "arn:aws:ec2:region:account-id:launch-template/*" }, "Bool": { "ec2:IsLaunchTemplateResource": "true" } } } ] }

次のサンプルポリシーによりユーザーはインスタンスを起動できますが、起動テンプレートを使用する場合に限ります。ユーザーは、リクエストでサブネットおよびネットワークインターフェイスのパラメータを上書きすることはできません。これらのパラメータは、起動テンプレートでのみ指定できます。ステートメントの最初の部分は、NotResource 要素を使用して、サブネットやネットワークインターフェイスを除くその他のすべてのリソースを許可します。ステートメントの 2 番目の部分は、サブネットおよびネットワークインターフェイスのリソースを許可しますが、これは起動テンプレートから取得された場合に限ります。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:RunInstances", "NotResource": ["arn:aws:ec2:region:account-id:subnet/*", "arn:aws:ec2:region:account-id:network-interface/*" ], "Condition": { "ArnLike": { "ec2:LaunchTemplate": "arn:aws:ec2:region:account-id:launch-template/*" } } }, { "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": ["arn:aws:ec2:region:account-id:subnet/*", "arn:aws:ec2:region:account-id:network-interface/*" ], "Condition": { "ArnLike": { "ec2:LaunchTemplate": "arn:aws:ec2:region:account-id:launch-template/*" }, "Bool": { "ec2:IsLaunchTemplateResource": "true" } } } ] }

次の例では、起動テンプレートを使用していて、また起動テンプレートにタグがある場合に限り、ユーザーはインスタンスを起動できるようになります Purpose=Webservers。ユーザーは、RunInstances アクションで起動テンプレートパラメータを上書きすることはできません。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:RunInstances", "NotResource": "arn:aws:ec2:region:account-id:launch-template/*", "Condition": { "ArnLike": { "ec2:LaunchTemplate": "arn:aws:ec2:region:account-id:launch-template/*" }, "Bool": { "ec2:IsLaunchTemplateResource": "true" } } }, { "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": "arn:aws:ec2:region:account-id:launch-template/*", "Condition": { "StringEquals": { "aws:ResourceTag/Purpose": "Webservers" } } } ] }

スポットインスタンス の操作

RunInstances アクションを使用してスポットインスタンスリクエストを作成し、作成時にスポットインスタンスリクエストにタグ付けできます。RunInstances に指定するリソースは spot-instances-request です。

spot-instances-request リソースは、IAM ポリシーで次のように評価されます。

  • スポットインスタンスリクエストの作成時にタグを付けない場合、Amazon EC2 は RunInstances ステートメント内の spot-instances-request リソースを評価しません。

  • スポットインスタンスリクエストの作成時にタグを付けると、 RunInstances ステートメント内の spot-instances-request リソースが、Amazon EC2 により評価されます。

したがって、spot-instances-request リソースの場合、次のルールが IAM ポリシーに適用されます。

  • RunInstances を使用してスポットインスタンスリクエストを作成し、その際リクエストにタグを付けない場合は、spot-instances-request リソースを明示的に許可しなくても、その呼び出しは成功します。

  • RunInstances を使用してスポットインスタンスリクエストを作成する際に、そのリクエストにタグを付ける場合には、RunInstances の許可ステートメントに spot-instances-request リソースを含める必要があります。これがない場合は呼び出しが失敗します。

  • RunInstances を使用してスポットインスタンスリクエストを作成し、作成時にタグを付ける場合は、CreateTags 許可ステートメントに spot-instances-request リソースまたは * ワイルドカードを指定する必要があります。指定しないと、呼び出しは失敗します。

スポットインスタンス は、RunInstances または RequestSpotInstances を使用してリクエストできます。次の例の IAM ポリシーは、RunInstances を使用して スポットインスタンス をリクエストする場合にのみ適用されます。

例: RunInstances を使用して スポットインスタンス をリクエストする

次のポリシーでは、RunInstances アクションを使用して スポットインスタンス をリクエストすることをユーザーに許可します。spot-instances-request リソースは、RunInstances によって作成されます。このリソースは スポットインスタンス をリクエストします。

注記

RunInstances を使用してスポットインスタンスリクエストを作成し、作成時にタグを付けない場合は、spot-instances-request リストから Resource を省略できます。これは、スポットインスタンスリクエストの作成時にタグを付けない場合、Amazon EC2 は RunInstances ステートメント内の spot-instances-request リソースを評価しないためです。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowRun", "Effect": "Allow", "Action": [ "ec2:RunInstances" ], "Resource": [ "arn:aws:ec2:us-east-1::image/*", "arn:aws:ec2:us-east-1:*:subnet/*", "arn:aws:ec2:us-east-1:*:network-interface/*", "arn:aws:ec2:us-east-1:*:security-group/*", "arn:aws:ec2:us-east-1:*:key-pair/*", "arn:aws:ec2:us-east-1:*:volume/*", "arn:aws:ec2:us-east-1:*:instance/*", "arn:aws:ec2:us-east-1:*:spot-instances-request/*" ] } ] }
警告

サポート対象外 – 例: RunInstances を使用して スポットインスタンス をリクエストするためのアクセス許可をユーザーに拒否する

次のポリシーは、spot-instances-requestリソースではサポートされません。

次のポリシーでは、ユーザーに オンデマンドインスタンス を起動するためのアクセス許可を付与しますが、スポットインスタンス をリクエストするためのアクセス許可を拒否します。spot-instances-request リソースは、RunInstances によって作成されます。このリソースは スポットインスタンス をリクエストします。2 番目のステートメントでは、spot-instances-request リソースに対する RunInstances アクションを拒否します。ただし、スポットインスタンスリクエストの作成時にタグを付けない場合、Amazon EC2 が RunInstances ステートメントの spot-instances-request リソースを評価しないため、この条件はサポートされません。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowRun", "Effect": "Allow", "Action": [ "ec2:RunInstances" ], "Resource": [ "arn:aws:ec2:us-east-1::image/*", "arn:aws:ec2:us-east-1:*:subnet/*", "arn:aws:ec2:us-east-1:*:network-interface/*", "arn:aws:ec2:us-east-1:*:security-group/*", "arn:aws:ec2:us-east-1:*:key-pair/*", "arn:aws:ec2:us-east-1:*:volume/*", "arn:aws:ec2:us-east-1:*:instance/*" ] }, { "Sid": "DenySpotInstancesRequests - NOT SUPPORTED - DO NOT USE!", "Effect": "Deny", "Action": "ec2:RunInstances", "Resource": "arn:aws:ec2:us-east-1:*:spot-instances-request/*" } ] }

例: スポットインスタンスリクエストの作成時にタグを付ける

次のポリシーでは、インスタンスの起動時に作成されるすべてのリソースにタグを付けることをユーザーに許可します。最初のステートメントでは、一覧表示されたリソースの作成を RunInstances に許可します。spot-instances-request リソースは、RunInstances によって作成されます。このリソースは スポットインスタンス をリクエストします。2 番目のステートメントでは、* ワイルドカードを指定し、インスタンスの起動時に作成されるすべてのリソースのタグ付けを許可します。

注記

スポットインスタンスリクエストの作成時にタグを付けると、 RunInstances ステートメント内の spot-instances-request リソースが、Amazon EC2 により評価されます。したがって、RunInstances アクションで spot-instances-request リソースを明示的に許可する必要があります。許可しないと、呼び出しは失敗します。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowRun", "Effect": "Allow", "Action": [ "ec2:RunInstances" ], "Resource": [ "arn:aws:ec2:us-east-1::image/*", "arn:aws:ec2:us-east-1:*:subnet/*", "arn:aws:ec2:us-east-1:*:network-interface/*", "arn:aws:ec2:us-east-1:*:security-group/*", "arn:aws:ec2:us-east-1:*:key-pair/*", "arn:aws:ec2:us-east-1:*:volume/*", "arn:aws:ec2:us-east-1:*:instance/*", "arn:aws:ec2:us-east-1:*:spot-instances-request/*" ] }, { "Sid": "TagResources", "Effect": "Allow", "Action": "ec2:CreateTags", "Resource": "*" } ] }

例: スポットインスタンスリクエストの作成時にタグ付けを拒否する

次のポリシーでは、インスタンスの起動時に作成されるリソースにタグを付けるためのアクセス許可をユーザーに拒否します。

最初のステートメントでは、一覧表示されたリソースの作成を RunInstances に許可します。spot-instances-request リソースは、RunInstances によって作成されます。このリソースは スポットインスタンス をリクエストします。2 番目のステートメントでは、* ワイルドカードを指定し、インスタンスの起動時に作成されるすべてのリソースのタグ付けを拒否します。spot-instances-request リソースまたは他のリソースの作成時にタグを付けた場合、RunInstances の呼び出しは失敗します。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowRun", "Effect": "Allow", "Action": [ "ec2:RunInstances" ], "Resource": [ "arn:aws:ec2:us-east-1::image/*", "arn:aws:ec2:us-east-1:*:subnet/*", "arn:aws:ec2:us-east-1:*:network-interface/*", "arn:aws:ec2:us-east-1:*:security-group/*", "arn:aws:ec2:us-east-1:*:key-pair/*", "arn:aws:ec2:us-east-1:*:volume/*", "arn:aws:ec2:us-east-1:*:instance/*", "arn:aws:ec2:us-east-1:*:spot-instances-request/*" ] }, { "Sid": "DenyTagResources", "Effect": "Deny", "Action": "ec2:CreateTags", "Resource": "*" } ] }
警告

サポート対象外 - 例: スポットインスタンスリクエストに特定のタグを割り当てる場合にのみ、リクエストの作成を許可する

次のポリシーは、spot-instances-request リソースではサポートされません。

次のポリシーは、スポットインスタンスリクエストに特定のタグを付ける場合にのみ、リクエストを作成するためのアクセス許可を RunInstances に付与することを想定しています。

最初のステートメントでは、一覧表示されたリソースの作成を RunInstances に許可します。

2 番目のステートメントでは、スポットインスタンスリクエストにタグ environment=production が付いている場合にのみ、リクエストを作成するためのアクセス許可をユーザーに付与することを想定しています。この条件を RunInstances によって作成された他のリソースに適用する場合、タグを指定しないと、Unauthenticated エラーが発生します。ただし、スポットインスタンスリクエストにタグを指定しない場合、Amazon EC2 は RunInstances ステートメントの spot-instances-request リソースを評価しないため、RunInstances がタグなしのスポットインスタンスリクエストを作成します。

environment=production 以外の別のタグを指定すると、Unauthenticated エラーが発生することに注意してください。これは、ユーザーがスポットインスタンスリクエストにタグを付けると、Amazon EC2 が RunInstances ステートメントの spot-instances-request リソースを評価するためです。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowRun", "Effect": "Allow", "Action": [ "ec2:RunInstances" ], "Resource": [ "arn:aws:ec2:us-east-1::image/*", "arn:aws:ec2:us-east-1:*:subnet/*", "arn:aws:ec2:us-east-1:*:network-interface/*", "arn:aws:ec2:us-east-1:*:security-group/*", "arn:aws:ec2:us-east-1:*:key-pair/*", "arn:aws:ec2:us-east-1:*:volume/*", "arn:aws:ec2:us-east-1:*:instance/*" ] }, { "Sid": "RequestSpotInstancesOnlyIfTagIs_environment=production - NOT SUPPORTED - DO NOT USE!", "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": "arn:aws:ec2:us-east-1:*:spot-instances-request/*", "Condition": { "StringEquals": { "aws:RequestTag/environment": "production" } } }, { "Sid": "TagResources", "Effect": "Allow", "Action": "ec2:CreateTags", "Resource": "*" } ] }

例: スポットインスタンスリクエストに特定のタグが割り当てられている場合、このリクエストの作成を拒否する

次のポリシーは、スポットインスタンスリクエストにタグ environment=production が付いている場合、このリクエストを作成するためのアクセス許可を RunInstances に拒否します。

最初のステートメントでは、一覧表示されたリソースの作成を RunInstances に許可します。

2 番目のステートメントでは、スポットインスタンスリクエストにタグ environment=production が付いている場合、このリクエストを作成するためのアクセス許可をユーザーに拒否します。environment=production をタグとして指定すると、Unauthenticated エラーが発生します。他のタグを指定するか、タグを指定しないと、スポットインスタンスリクエストが作成されます。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowRun", "Effect": "Allow", "Action": [ "ec2:RunInstances" ], "Resource": [ "arn:aws:ec2:us-east-1::image/*", "arn:aws:ec2:us-east-1:*:subnet/*", "arn:aws:ec2:us-east-1:*:network-interface/*", "arn:aws:ec2:us-east-1:*:security-group/*", "arn:aws:ec2:us-east-1:*:key-pair/*", "arn:aws:ec2:us-east-1:*:volume/*", "arn:aws:ec2:us-east-1:*:instance/*", "arn:aws:ec2:us-east-1:*:spot-instances-request/*" ] }, { "Sid": "DenySpotInstancesRequests", "Effect": "Deny", "Action": "ec2:RunInstances", "Resource": "arn:aws:ec2:us-east-1:*:spot-instances-request/*", "Condition": { "StringEquals": { "aws:RequestTag/environment": "production" } } }, { "Sid": "TagResources", "Effect": "Allow", "Action": "ec2:CreateTags", "Resource": "*" } ] }

例: リザーブドインスタンス の操作

次のポリシーでは、アカウントで リザーブドインスタンス を表示、変更、購入するアクセス許可をユーザーに与えます。

個別の リザーブドインスタンス にリソースレベルのアクセス許可を設定することはできません。このポリシーは、ユーザーがアカウントのすべての リザーブドインスタンス にアクセスできることを意味します。

Resource 要素は * ワイルドカードを使用して、ユーザーがそのアクションにすべてのリソースを指定できることを示しています。この場合、アカウントのすべての リザーブドインスタンス をリストして変更できます。ユーザーは、アカウント認証情報を使用して リザーブドインスタンス を購入することもできます。また、API アクションがリソースレベルのアクセス許可をサポートしていない場合も、* ワイルドカードが必要です。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:DescribeReservedInstances", "ec2:ModifyReservedInstances", "ec2:PurchaseReservedInstancesOffering", "ec2:DescribeAvailabilityZones", "ec2:DescribeReservedInstancesOfferings" ], "Resource": "*" } ] }

次のコードでは、アカウント内の リザーブドインスタンス を表示および変更できるようにユーザーに許可しています。新しい リザーブドインスタンス の購入は、許可していません。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:DescribeReservedInstances", "ec2:ModifyReservedInstances", "ec2:DescribeAvailabilityZones" ], "Resource": "*" } ] }

例: リソースのタグ付け

次のポリシーでは、タグにキー CreateTags および値 environment が含まれている場合のみ、ユーザーが production アクションを使用してインスタンスにタグを適用できます。他のタグは許可されず、ユーザーは他のリソースタイプをタグ付けすることはできません。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:CreateTags" ], "Resource": "arn:aws:ec2:region:account-id:instance/*", "Condition": { "StringEquals": { "aws:RequestTag/environment": "production" } } } ] }

次のポリシーでは、ユーザーは owner のキーとユーザー名の値を使用したタグが既に適用されているタグ付け可能なリソースにタグ付けできます。加えて、ユーザーはリクエストで anycompany:environment-type のキーと値 test または prod を持つタグを指定する必要があります。ユーザーは、リクエストで追加のタグを指定できます。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:CreateTags" ], "Resource": "arn:aws:ec2:region:account-id:*/*", "Condition": { "StringEquals": { "aws:RequestTag/anycompany:environment-type": ["test","prod"], "aws:ResourceTag/owner": "${aws:username}" } } } ] }

ユーザーがリソースの特定のタグを指定できるようにする IAM ポリシーを作成できます。例えば、次のポリシーでは、リクエストで指定されたタグキーが environment または cost-center の場合、ユーザーがボリュームのタグを削除できます。タグにはどの値でも指定できますが、指定されたキーのいずれかにタグキーが一致する必要があります。

注記

リソースを削除すると、リソースに関連付けられているすべてのタグも削除されます。タグ付きのリソースを削除する場合、ユーザーは ec2:DeleteTags アクションを使用するためのアクセス許可は必要ありません。削除アクションを実行するためのアクセス許可のみが必要です。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:DeleteTags", "Resource": "arn:aws:ec2:us-east-1:account-id:volume/*", "Condition": { "ForAllValues:StringEquals": { "aws:TagKeys": ["environment","cost-center"] } } } ] }

このポリシーでは、リソースが owner のキーとユーザー名の値で既にタグ付けされている場合のみ、ユーザーが任意のリソースで environment=prod タグのみ削除できます。ユーザーは、リソースの他のタグを削除することはできません。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:DeleteTags" ], "Resource": "arn:aws:ec2:region:account-id:*/*", "Condition": { "StringEquals": { "aws:RequestTag/environment": "prod", "aws:ResourceTag/owner": "${aws:username}" }, "ForAllValues:StringEquals": { "aws:TagKeys": ["environment"] } } } ] }

例: IAM ロールの使用

次のポリシーでは、department=test タグを持つインスタンス対して IAM ロールのアタッチ、置換、デタッチを行うことをユーザーに許可します。IAM ロールの置換またはデタッチには関連 ID が必要であるため、ポリシーでは ec2:DescribeIamInstanceProfileAssociations アクションを使用するアクセス許可もユーザーに付与します。

ユーザーは、ロールをインスタンスに渡すために iam:PassRole アクションを使用するための許可が必要です。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:AssociateIamInstanceProfile", "ec2:ReplaceIamInstanceProfileAssociation", "ec2:DisassociateIamInstanceProfile" ], "Resource": "arn:aws:ec2:us-east-1:account-id:instance/*", "Condition": { "StringEquals": { "aws:ResourceTag/department":"test" } } }, { "Effect": "Allow", "Action": "ec2:DescribeIamInstanceProfileAssociations", "Resource": "*" }, { "Effect": "Allow", "Action": "iam:PassRole", "Resource": "arn:aws:iam::account-id:role/DevTeam*" } ] }

次のポリシーでは、どのインスタンスに対しても IAM ロールのアタッチまたは置換を行うことをユーザーに許可します。ユーザーは、TestRole- で始まる名前の IAM ロールのみアタッチまたは置換できます。IAM アクションでは、インスタンスプロファイルではなく iam:PassRole ロールの名前を指定します (両方の名前が異なる場合)。詳細については、インスタンスプロファイルを参照してください。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:AssociateIamInstanceProfile", "ec2:ReplaceIamInstanceProfileAssociation" ], "Resource": "*" }, { "Effect": "Allow", "Action": "ec2:DescribeIamInstanceProfileAssociations", "Resource": "*" }, { "Effect": "Allow", "Action": "iam:PassRole", "Resource": "arn:aws:iam::account-id:role/TestRole-*" } ] }

例: ルートテーブルの使用

次のポリシーでは、VPC (vpc-ec43eb89) のみに関連付けられているルートテーブルのルートの追加、削除、置換を行うことができます。ec2:Vpc 条件キーの VPC を指定するには、VPC の完全な ARN を指定する必要があります。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:DeleteRoute", "ec2:CreateRoute", "ec2:ReplaceRoute" ], "Resource": [ "arn:aws:ec2:region:account-id:route-table/*" ], "Condition": { "StringEquals": { "ec2:Vpc": "arn:aws:ec2:region:account-id:vpc/vpc-ec43eb89" } } } ] }

例: 特定のインスタンスが他の AWS サービスでリソースを表示できるようにする

次に示すのは、IAM ロールにアタッチできるポリシーの例です。ポリシーにより、インスタンスは AWS サービスのさまざまなリソースを表示できるようになります。ec2:SourceInstanceARN 条件キーを使用して、リクエストの実行元インスタンスが i-093452212644b0dd6 インスタンスになるように指定します。同じ IAM ロールが別のインスタンスと関連付けられている場合、他のインスタンスはこれらのどのアクションも実行できません。

ec2:SourceInstanceARN キーは AWS グローバル条件キーであるため、Amazon EC2 だけではなく他のサービスアクションにも使用できます。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:DescribeVolumes", "s3:ListAllMyBuckets", "dynamodb:ListTables", "rds:DescribeDBInstances" ], "Resource": [ "*" ], "Condition": { "ArnEquals": { "ec2:SourceInstanceARN": "arn:aws:ec2:region:account-id:instance/i-093452212644b0dd6" } } } ] }

例: 起動テンプレートの使用

次のポリシーでは、ユーザーは起動テンプレートのバージョンを作成して起動テンプレートを変更することができます。ただし、特定の起動テンプレートに限られます (lt-09477bcd97b0d3abc)。ユーザーは、他の起動テンプレートを使用することはできません。

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "ec2:CreateLaunchTemplateVersion", "ec2:ModifyLaunchTemplate" ], "Effect": "Allow", "Resource": "arn:aws:ec2:region:account-id:launch-template/lt-09477bcd97b0d3abc" } ] }

次のポリシーでは、ユーザーは任意の起動テンプレートと起動テンプレートのバージョンを削除できます。ただし、起動テンプレートに Purpose=Testing のタグがある場合に限ります。

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "ec2:DeleteLaunchTemplate", "ec2:DeleteLaunchTemplateVersions" ], "Effect": "Allow", "Resource": "arn:aws:ec2:region:account-id:launch-template/*", "Condition": { "StringEquals": { "aws:ResourceTag/Purpose": "Testing" } } } ] }

インスタンスメタデータの使用

以下のポリシーでは、インスタンスメタデータサービスバージョン 2 (IMDSv2) を使用して、ユーザーがインスタンスメタデータのみを取得できるようにします。以下の 4 つのポリシーは、4 つのステートメントを使用する 1 つのポリシーに結合できます。1 つのポリシーとして結合すると、このポリシーをサービスコントロールポリシー (SCP) として使用できます。これは、既存の IAM ポリシーに適用する拒否ポリシーとして (既存のアクセス許可を削除して制限するために) 使用したり、アカウント、部門単位 (OU)、組織全体にグローバルに適用する SCP として使用したりすることもできます。

注記

以下の RunInstances メタデータオプションポリシーは、RunInstances を使用してインスタンスを起動するアクセス許可をプリンシパルに付与するポリシーと組み合わせて使用する必要があります。プリンシパルに RunInstances アクセス許可もない場合、インスタンスを起動することはできません。詳細については、インスタンスの使用インスタンスの起動 (RunInstances)のポリシーを参照してください。

重要

Auto Scaling グループを使用し、すべての新しいインスタンスで IMDSv2 の使用を要求する必要がある場合は、Auto Scaling グループで 起動テンプレートを使用する必要があります。

Auto Scaling グループが起動テンプレートを使用する場合、新しい Auto Scaling グループが作成されるときに IAM プリンシパルの ec2:RunInstances アクセス許可がチェックされます。また、既存の Auto Scaling グループが更新され、新しい起動テンプレートまたは新しいバージョンの起動テンプレートが使用される場合にもチェックされます。

RunInstances の IAM プリンシパルでの IMDSv1 の使用に関する制限は、起動テンプレートを使用している Auto Scaling グループが作成または更新された場合にのみチェックされます。Latest または Default 起動テンプレートを使用するように設定された Auto Scaling グループでは、起動テンプレートの新しいバージョンが作成されたときにアクセス許可はチェックされません。アクセス許可をチェックするには、特定のバージョンの起動テンプレートを使用するように Auto Scaling グループを設定する必要があります。

Auto Scaling グループによって起動されるインスタンスで IMDSv2 の使用を強制するには、以下の追加ステップが必要です。
  1. 作成された新しいプリンシパルのサービスコントロールポリシー (SCP) または IAM アクセス許可の境界を使用して、組織内のすべてのアカウントの起動設定の使用を無効にします。Auto Scaling グループアクセス許可を持つ既存の IAM プリンシパルの場合、関連するポリシーをこの条件キーで更新します。起動設定の使用を無効にするには、値が "autoscaling:LaunchConfigurationName" として指定された null 条件キーを使用して、関連する SCP、アクセス許可の境界、または IAM ポリシーを作成または変更します。

  2. 新しい起動テンプレートの場合は、起動テンプレートでインスタンスメタデータオプションを設定します。既存の起動テンプレートの場合は、新しいバージョンの起動テンプレートを作成し、新しいバージョンでインスタンスメタデータオプションを設定します。

  3. 起動テンプレートを使用するアクセス許可を任意のプリンシパルに付与するポリシーで、$latest を指定して $default"autoscaling:LaunchTemplateVersionSpecified": "true" の関連付けを制限します。使用を特定のバージョンの起動テンプレートに制限することで、インスタンスメタデータオプションが設定されているバージョンを使用して新しいインスタンスを確実に起動できます。詳細については、Amazon EC2 Auto Scaling API リファレンス (具体的には Version パラメータ) のLaunchTemplateSpecificationを参照してください。

  4. 起動設定を使用する Auto Scaling グループの場合、起動設定を起動テンプレートに置き換えます。詳細については、Amazon EC2 Auto Scaling ユーザーガイド起動設定を起動テンプレートと置き換えるを参照してください。

  5. 起動テンプレートを使用する Auto Scaling グループの場合、インスタンスメタデータオプションが設定された新しい起動テンプレートを使用するか、インスタンスメタデータオプションが設定された現在の起動テンプレートの新しいバージョンを使用します。詳細については、AWS CLI コマンドリファレンスupdate-auto-scaling-groupを参照してください。

IMDSv2 の使用を要求する

次のポリシーでは、インスタンスが IMDSv2 の使用を要求するようにオプトインされていない限り("ec2:MetadataHttpTokens": "required" で指定)、RunInstances API を呼び出せないように指定します。インスタンスが IMDSv2 を要求するように指定しないと、RunInstances API を呼び出したときに UnauthorizedOperation エラーが発生します。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "RequireImdsV2", "Effect": "Deny", "Action": "ec2:RunInstances", "Resource": "arn:aws:ec2:*:*:instance/*", "Condition": { "StringNotEquals": { "ec2:MetadataHttpTokens": "required" } } } ] }

IMDSv2 のオプトアウトを拒否する

次のポリシーでは、ModifyInstanceMetadataOptions API を呼び出さないように指定し、IMDSv1 または IMDSv2 のオプションを許可します。ModifyInstanceMetadataOptions API を呼び出す場合は、HttpTokens 属性を required に設定する必要があります。

{ "Version": "2012-10-17", "Statement": [{ "Sid": "DenyIMDSv1HttpTokensModification", "Effect": "Deny", "Action": "ec2:ModifyInstanceMetadataOptions", "Resource": "arn:aws:ec2:*:*:instance/*", "Condition": { "StringNotEquals": { "ec2:Attribute/HttpTokens": "required" }, "Null": { "ec2:Attribute/HttpTokens": false } } }] }

ホップ制限の最大値の指定

次のポリシーでは、ホップ制限を指定しない限り、RunInstances API を呼び出せないように指定します。また、ホップ制限を 3 以下にするように指定します。これを指定しないと、RunInstances API を呼び出したときに UnauthorizedOperation エラーが発生します。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "MaxImdsHopLimit", "Effect": "Deny", "Action": "ec2:RunInstances", "Resource": "arn:aws:ec2:*:*:instance/*", "Condition": { "NumericGreaterThan": { "ec2:MetadataHttpPutResponseHopLimit": "3" } } } ] }

インスタンスメタデータオプションを変更できるユーザーの制限

次のポリシーでは、一般の管理者がインスタンスメタデータオプションを変更するロール ec2-imds-admins を持つユーザーのみに変更を行うことを許可します。ec2-imds-admins ロール以外のプリンシパルが ModifyInstanceMetadataOptions API を呼び出そうとすると、UnauthorizedOperation エラーが発生します。このステートメントは、ModifyInstanceMetadataOptions API の使用を制御するために使用できます。現在、ModifyInstanceMetadataOptions API 用の詳細なアクセスコントロール (条件) はありません。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowOnlyImdsAdminsToModifySettings", "Effect": "Deny", "Action": "ec2:ModifyInstanceMetadataOptions", "Resource": "*", "Condition": { "StringNotLike": { "aws:PrincipalARN": "arn:aws:iam::*:role/ec2-imds-admins" } } } ] }

IMDSv2 からロール認証情報を取得することを要求する

次のポリシーでは、このポリシーを適用したロールを EC2 サービスが引き受けて、結果の認証情報をリクエストの署名に使用する場合は、IMDSv2 から取得した EC2 ロールの認証情報を使用してリクエストに署名する必要があることを指定します。それ以外の場合は、すべての API コールで UnauthorizedOperation エラーが発生します。このステートメント/ポリシーは、リクエストが EC2 ロールの認証情報によって署名されていない場合は効果がないため、一般的に適用できます。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "RequireAllEc2RolesToUseV2", "Effect": "Deny", "Action": "*", "Resource": "*", "Condition": { "NumericLessThan": { "ec2:RoleDelivery": "2.0" } } } ] }

Amazon EBS ボリュームとスナップショットの使用

Amazon EBS ボリュームとスナップショットを使用するポリシーの例については、「Amazon EBS のアイデンティティベースのポリシー例」を参照してください。