Amazon EC2 API 액세스를 제어하는 예제 정책

Amazon EC2 API 액세스를 제어하는 예제 정책

IAM 정책을 사용해 사용자에게 Amazon EC2 작업에 필요한 권한을 부여할 수 있어요. 단계별 지침은 IAM 사용자 가이드의 "Creating IAM policies"를 참조하세요.

다음 예제는 사용자에게 Amazon EC2 사용 권한을 부여하는 데 사용할 수 있는 정책 문을 보여줍니다. 이러한 정책은 AWS CLI 또는 AWS SDK를 사용한 요청을 위해 설계되었어요. 다음 예제에서는 각 사용자 입력 자리 표시자를 본인의 정보로 바꾸세요.

출처: 문서

인스턴스 작업

예제: 모든 인스턴스 설명, 시작, 중지, 시작, 종료

다음 정책은 사용자에게 Action 요소에 지정된 API 작업을 사용할 수 있는 권한을 부여합니다. Resource 요소는 * 와일드카드를 사용해 사용자가 이러한 API 작업으로 모든 리소스를 지정할 수 있다는 것을 나타냅니다. * 와일드카드는 API 작업이 리소스 수준 권한을 지원하지 않는 경우에도 필요합니다.

사용자는 기본적으로 API 작업을 사용할 권한이 거부되므로, 다른 문이 권한을 부여하지 않는 한 다른 API 작업을 사용할 수 없습니다. JSON

{
   "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 인스턴스만 시작·중지하며, 리소스 태그 purpose=test가 있는 us-east-1 리전의 인스턴스만 종료할 수 있게 합니다.

첫 번째 문은 Resource 요소에 * 와일드카드를 사용해 사용자가 이 작업으로 모든 리소스를 지정할 수 있다는 것을 나타냅니다(이 경우 모든 인스턴스를 나열). * 와일드카드는 API 작업이 리소스 수준 권한을 지원하지 않는 경우(이 경우 ec2:DescribeInstances)에도 필요합니다.

두 번째 문은 StopInstances와 StartInstances 작업에 리소스 수준 권한을 사용합니다. 특정 인스턴스는 Resource 요소의 ARN으로 표시됩니다.

세 번째 문은 사용자가 지정된 AWS 계정에 속한 us-east-1 리전의 모든 인스턴스를 종료할 수 있게 하지만, 인스턴스에 태그 purpose=test가 있는 경우만 허용합니다. Condition 요소는 정책 문이 적용되는 시기를 한정합니다. JSON

{
   "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:111122223333:instance/i-1234567890abcdef0",
        "arn:aws:ec2:us-east-1:111122223333:instance/i-0598c7d356eba48d7"
      ]
    },
    {
      "Effect": "Allow",
      "Action": "ec2:TerminateInstances",
      "Resource": "arn:aws:ec2:us-east-1:111122223333:instance/*",
      "Condition": {
         "StringEquals": {
            "aws:ResourceTag/purpose": "test"
         }
      }
   }

   ]
}

인스턴스 시작(RunInstances)

RunInstances API 작업은 하나 이상의 On-Demand Instances 또는 하나 이상의 Spot Instances를 시작합니다. RunInstances는 AMI가 필요하며 인스턴스를 생성합니다. 사용자는 요청에서 키 페어와 보안 그룹을 지정할 수 있어요. VPC로 시작하려면 서브넷이 필요하며 네트워크 인터페이스를 생성합니다. Amazon EBS 지원 AMI에서 시작하면 볼륨이 생성됩니다. 따라서 사용자는 이러한 Amazon EC2 리소스를 사용할 권한이 있어야 합니다. RunInstances에 선택적 파라미터를 지정하도록 요구하거나 파라미터의 특정 값으로 제한하는 정책 문을 만들 수 있습니다.

인스턴스 시작에 필요한 리소스 수준 권한에 대한 자세한 내용은 "Actions, resources, and condition keys for Amazon EC2"를 참조하세요.

기본적으로 사용자는 결과 인스턴스를 설명, 시작, 중지, 종료할 권한이 없어요. 사용자에게 결과 인스턴스 관리 권한을 부여하는 한 가지 방법은 각 인스턴스에 특정 태그를 만든 뒤 해당 태그가 있는 인스턴스를 관리할 수 있게 하는 문을 만드는 것입니다.

AMIs

다음 정책은 사용자가 지정된 AMI인 ami-9e1670f7과 ami-45cf5c3c만 사용해 인스턴스를 시작할 수 있게 합니다. 사용자는 다른 AMI로는 인스턴스를 시작할 수 없습니다(다른 문이 허용하지 않는 한). JSON

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

또는 다음 정책은 사용자가 Amazon이 소유하거나 특정 신뢰·검증된 파트너가 소유한 모든 AMI에서 인스턴스를 시작할 수 있게 합니다. 첫 번째 문의 Condition 요소는 ec2:Owner가 amazon인지 테스트합니다. 사용자는 다른 AMI로는 인스턴스를 시작할 수 없습니다(다른 문이 허용하지 않는 한). JSON

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

인스턴스 유형

다음 정책은 사용자가 비용을 제어하기 위해 t2.micro 또는 t2.small 인스턴스 유형만 사용해 인스턴스를 시작할 수 있게 합니다. 첫 번째 문의 Condition 요소가 ec2:InstanceType이 t2.micro 또는 t2.small인지 테스트하므로 사용자는 더 큰 인스턴스를 시작할 수 없습니다. JSON

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

또는 t2.micro와 t2.small 인스턴스 유형 외의 모든 인스턴스 시작을 거부하는 정책을 만들 수 있습니다. JSON

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

서브넷

다음 정책은 사용자가 지정된 서브넷 subnet-12345678만 사용해 인스턴스를 시작할 수 있게 합니다. 그룹은 다른 서브넷에서는 인스턴스를 시작할 수 없습니다(다른 문이 허용하지 않는 한). JSON

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

또는 다른 서브넷으로의 인스턴스 시작을 거부하는 정책을 만들 수 있습니다. 이 문은 해당 서브넷 subnet-12345678이 지정된 경우를 제외하고 네트워크 인터페이스 생성 권한을 거부해 이를 수행합니다. 이 거부는 다른 서브넷으로의 인스턴스 시작을 허용하도록 만든 다른 정책을 재정의합니다. JSON

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

EBS 볼륨

다음 정책은 인스턴스의 EBS 볼륨이 암호화된 경우에만 인스턴스를 시작할 수 있게 합니다. 사용자는 루트 볼륨이 암호화되도록 암호화된 스냅샷으로 만든 AMI에서 인스턴스를 시작해야 합니다. 시작 중에 사용자가 인스턴스에 연결하는 추가 볼륨도 암호화되어야 합니다. JSON

{
    "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 작업을 사용할 권한이 있어야 해요. 두 번째 문은 ec2:CreateAction 조건 키를 사용해 사용자가 RunInstances 맥락에서만, 그리고 인스턴스에만 태그를 만들 수 있게 합니다. 사용자는 기존 리소스에 태그를 지정하거나 RunInstances 요청에서 볼륨에 태그를 지정할 수 없습니다. JSON

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

특정 태그로 인스턴스 및 볼륨 생성 시 태그 지정 — 다음 정책은 aws:RequestTag 조건 키를 포함해 사용자가 RunInstances로 생성하는 모든 인스턴스와 볼륨에 environment=production 및 purpose=webserver 태그를 지정하도록 요구합니다. 사용자가 이러한 특정 태그를 전달하지 않거나 태그를 전혀 지정하지 않으면 요청이 실패합니다. JSON

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

하나 이상의 특정 태그로 인스턴스 및 볼륨 생성 시 태그 지정 — 다음 정책은 aws:TagKeys 조건에 ForAnyValue 수정자를 사용해 요청에 태그가 하나 이상 지정되어야 하고, 그 태그에 environment 또는 webserver 키가 포함되어야 한다는 것을 나타냅니다. 태그는 인스턴스와 볼륨 모두에 적용되어야 합니다. 요청에는 임의의 태그 값을 지정할 수 있습니다. JSON

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

생성 시 인스턴스에 태그가 지정된 경우 특정 태그여야 함 — 다음 정책에서 사용자는 요청에 태그를 지정할 필요가 없지만, 지정한다면 태그는 purpose=test여야 합니다. 다른 태그는 허용되지 않아요. 사용자는 RunInstances 요청에서 태그를 지정할 수 있는 모든 리소스에 태그를 적용할 수 있습니다. JSON

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

RunInstances에 대한 생성 시 태그 지정을 아무에게도 허용하지 않으려면 — JSON

{
    "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/*"
            ]
        },
        {
            "Effect": "Deny",
            "Action": "ec2:CreateTags",
            "Resource": "*"
        }
    ]
}

시작 템플릿의 태그

다음 예제에서 사용자는 특정 시작 템플릿(lt-09477bcd97b0d310e)을 사용하는 경우에만 인스턴스를 시작할 수 있습니다. ec2:IsLaunchTemplateResource 조건 키는 사용자가 시작 템플릿에 지정된 리소스를 재정의하지 못하게 합니다. 문의 두 번째 부분은 사용자가 생성 시 인스턴스에 태그를 지정할 수 있게 합니다. 이 부분은 시작 템플릿의 인스턴스에 태그가 지정된 경우 필요합니다. JSON

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

Elastic GPUs

다음 정책에서 사용자는 인스턴스를 시작하고 인스턴스에 연결할 Elastic GPU를 지정할 수 있습니다. 사용자는 모든 리전에서 인스턴스를 시작할 수 있지만, us-east-2 리전에서 시작할 때만 Elastic GPU를 연결할 수 있어요.

ec2:ElasticGpuType 조건 키는 인스턴스가 eg1.medium 또는 eg1.large Elastic GPU 유형을 사용하도록 합니다. JSON

{
    "Version":"2012-10-17",
    "Statement": [
             {
            "Effect": "Allow",
            "Action": [
                "ec2:RunInstances"
            ],
            "Resource": [
                "arn:aws:ec2:*:111122223333: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:*:111122223333:network-interface/*",
                "arn:aws:ec2:*:111122223333:instance/*",
                "arn:aws:ec2:*:111122223333:subnet/*",
                "arn:aws:ec2:*:111122223333:volume/*",
                "arn:aws:ec2:*:111122223333:key-pair/*",
                "arn:aws:ec2:*:111122223333:security-group/*"
            ]
        }
    ]
}

시작 템플릿

다음 예제에서 사용자는 특정 시작 템플릿(lt-09477bcd97b0d310e)을 사용하는 경우에만 인스턴스를 시작할 수 있습니다. 사용자는 RunInstances 작업에서 파라미터를 지정해 시작 템플릿의 파라미터를 재정의할 수 있습니다. JSON

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

이 예제에서 사용자는 시작 템플릿을 사용하는 경우에만 인스턴스를 시작할 수 있습니다. 정책은 ec2:IsLaunchTemplateResource 조건 키를 사용해 사용자가 시작 템플릿의 기존 ARN을 재정의하지 못하게 합니다. JSON

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

다음 예제 정책은 사용자가 시작 템플릿을 사용하는 경우에만 인스턴스를 시작할 수 있게 합니다. 사용자는 요청에서 서브넷과 네트워크 인터페이스 파라미터를 재정의할 수 없습니다. 이러한 파라미터는 시작 템플릿에서만 지정할 수 있어요. 문의 첫 번째 부분은 NotResource 요소를 사용해 서브넷과 네트워크 인터페이스 외의 모든 리소스를 허용합니다. 문의 두 번째 부분은 서브넷과 네트워크 인터페이스 리소스를 허용하지만, 시작 템플릿에서 비롯된 경우만 허용합니다. JSON

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

다음 예제는 사용자가 시작 템플릿을 사용하고 시작 템플릿에 태그 Purpose=Webservers가 있는 경우에만 인스턴스를 시작할 수 있게 합니다. 사용자는 RunInstances 작업에서 시작 템플릿 파라미터를 재정의할 수 없습니다. JSON

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

Spot Instances 작업

RunInstances 작업을 사용해 Spot Instance 요청을 생성하고 생성 시 요청에 태그를 지정할 수 있어요. RunInstances에 지정할 리소스는 spot-instances-request입니다.

spot-instances-request 리소스는 IAM 정책에서 다음과 같이 평가됩니다.

  • 생성 시 Spot Instance 요청에 태그를 지정하지 않으면 Amazon EC2는 RunInstances 문에서 spot-instances-request 리소스를 평가하지 않습니다.
  • 생성 시 Spot Instance 요청에 태그를 지정하면 Amazon EC2는 RunInstances 문에서 spot-instances-request 리소스를 평가합니다.

따라서 spot-instances-request 리소스에 대해 IAM 정책에는 다음 규칙이 적용됩니다.

  • RunInstances로 Spot Instance 요청을 만들고 생성 시 태그를 지정할 의도가 없다면 spot-instances-request 리소스를 명시적으로 허용할 필요가 없습니다. 호출은 성공합니다.
  • RunInstances로 Spot Instance 요청을 만들고 생성 시 태그를 지정할 의도가 있다면 RunInstances 허용 문에 spot-instances-request 리소스를 포함해야 합니다. 그렇지 않으면 호출이 실패합니다.
  • RunInstances로 Spot Instance 요청을 만들고 생성 시 태그를 지정할 의도가 있다면 CreateTags 허용 문에 spot-instances-request 리소스 또는 * 와일드카드를 지정해야 합니다. 그렇지 않으면 호출이 실패합니다.

RunInstances 또는 RequestSpotInstances를 사용해 Spot Instances를 요청할 수 있습니다. 다음 예제 IAM 정책은 RunInstances를 사용해 Spot Instances를 요청할 때만 적용됩니다.

예제: RunInstances를 사용해 Spot Instances 요청 — 다음 정책은 사용자가 RunInstances 작업으로 Spot Instances를 요청할 수 있게 합니다. RunInstances가 생성하는 spot-instances-request 리소스가 Spot Instances를 요청합니다.

참고 — RunInstances로 Spot Instance 요청을 만들 때 생성 시 Spot Instance 요청에 태그를 지정할 의도가 없다면 Resource 목록에서 spot-instances-request를 생략할 수 있어요. 생성 시 Spot Instance 요청에 태그가 지정되지 않으면 Amazon EC2가 RunInstances 문에서 spot-instances-request 리소스를 평가하지 않기 때문입니다. JSON

{
    "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 요청 권한 거부 — 다음 정책은 spot-instances-request 리소스에 대해 지원되지 않습니다. 이 정책은 사용자에게 On-Demand Instances 시작 권한은 주되 Spot Instances 요청 권한은 거부하려는 것입니다. RunInstances가 생성하는 spot-instances-request 리소스가 Spot Instances를 요청합니다. 두 번째 문은 spot-instances-request 리소스에 대해 RunInstances 작업을 거부하려는 것입니다. 그러나 이 조건은 생성 시 Spot Instance 요청에 태그가 지정되지 않으면 Amazon EC2가 RunInstances 문에서 spot-instances-request 리소스를 평가하지 않기 때문에 지원되지 않습니다. JSON

{
    "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": "DenySpotInstancesRequestsNOTSUPPORTEDDONOTUSE",
            "Effect": "Deny",
            "Action": "ec2:RunInstances",
            "Resource": "arn:aws:ec2:us-east-1:*:spot-instances-request/*"
        }
    ]
}

예제: 생성 시 Spot Instance 요청에 태그 지정 — 다음 정책은 사용자가 인스턴스 시작 중에 생성되는 모든 리소스에 태그를 지정할 수 있게 합니다. 첫 번째 문은 RunInstances가 나열된 리소스를 만들 수 있게 합니다. RunInstances가 생성하는 spot-instances-request 리소스가 Spot Instances를 요청합니다. 두 번째 문은 인스턴스 시작 시 생성될 때 모든 리소스에 태그를 지정할 수 있도록 * 와일드카드를 제공합니다.

참고 — 생성 시 Spot Instance 요청에 태그를 지정하면 Amazon EC2는 RunInstances 문에서 spot-instances-request 리소스를 평가합니다. 따라서 RunInstances 작업에 대해 spot-instances-request 리소스를 명시적으로 허용해야 하며, 그렇지 않으면 호출이 실패합니다. JSON

{
    "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": "*"
        }
    ]
}

예제: Spot Instance 요청에 대한 생성 시 태그 지정 거부 — 다음 정책은 사용자가 인스턴스 시작 중에 생성되는 리소스에 태그를 지정할 권한을 거부합니다. 첫 번째 문은 RunInstances가 나열된 리소스를 만들 수 있게 합니다. RunInstances가 생성하는 spot-instances-request 리소스가 Spot Instances를 요청합니다. 두 번째 문은 인스턴스 시작 시 생성될 때 모든 리소스에 태그를 지정하는 것을 거부하는 * 와일드카드를 제공합니다. spot-instances-request 또는 다른 리소스에 생성 시 태그가 지정되면 RunInstances 호출이 실패합니다. JSON

{
    "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 Instance 요청 생성 허용 — 다음 정책은 spot-instances-request 리소스에 대해 지원되지 않습니다. 이 정책은 요청에 특정 태그가 지정된 경우에만 RunInstances가 Spot Instance 요청을 만들 수 있도록 하려는 것입니다. 첫 번째 문은 RunInstances가 나열된 리소스를 만들 수 있게 합니다. 두 번째 문은 요청에 environment=production 태그가 있는 경우에만 Spot Instance 요청을 만들 수 있도록 하려는 것입니다. 이 조건이 RunInstances로 생성된 다른 리소스에 적용되면 태그를 지정하지 않으면 Unauthenticated 오류가 발생합니다. 그러나 Spot Instance 요청에 태그를 지정하지 않으면 Amazon EC2는 RunInstances 문에서 spot-instances-request 리소스를 평가하지 않으므로 RunInstances로 태그가 없는 Spot Instance 요청이 생성됩니다. environment=production 외의 다른 태그를 지정하면 Unauthenticated 오류가 발생한다는 점을 유의하세요. 사용자가 Spot Instance 요청에 태그를 지정하면 Amazon EC2가 RunInstances 문에서 spot-instances-request 리소스를 평가하기 때문입니다. JSON

{
    "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": "RequestSpotInstancesOnlyIfTagIsEnvironmentProductionNOTSUPPORTEDDONOTUSE",
            "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": "*"
        }

    ]
}

예제: 특정 태그가 지정된 경우 Spot Instance 요청 생성 거부 — 다음 정책은 요청에 environment=production 태그가 지정된 경우 RunInstances가 Spot Instance 요청을 만들 수 있는 권한을 거부합니다. 첫 번째 문은 RunInstances가 나열된 리소스를 만들 수 있게 합니다. 두 번째 문은 요청에 environment=production 태그가 있는 경우 사용자가 Spot Instance 요청을 만들 수 있는 권한을 거부합니다. 태그로 environment=production을 지정하면 Unauthenticated 오류가 발생합니다. 다른 태그를 지정하거나 태그를 지정하지 않으면 Spot Instance 요청이 생성됩니다. JSON

{
    "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": "*"
        }
    ]
}

예제: Reserved Instances 작업

다음 정책은 사용자에게 계정의 Reserved Instances를 보고, 수정하고, 구매할 권한을 부여합니다. 개별 Reserved Instances에 대해 리소스 수준 권한을 설정하는 것은 불가능해요. 이 정책은 사용자가 계정의 모든 Reserved Instances에 접근할 수 있다는 것을 의미합니다.

Resource 요소는 * 와일드카드를 사용해 사용자가 이 작업으로 모든 리소스를 지정할 수 있다는 것을 나타냅니다(이 경우 계정의 모든 Reserved Instances를 나열하고 수정). 또한 계정 자격 증명을 사용해 Reserved Instances를 구매할 수 있습니다. * 와일드카드는 API 작업이 리소스 수준 권한을 지원하지 않는 경우에도 필요합니다. JSON

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

사용자가 계정의 Reserved Instances를 보고 수정할 수 있게 하되 새 Reserved Instances를 구매할 수는 없게 하려면. JSON

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

예제: 리소스 태그 지정

다음 정책은 사용자가 태그에 environment 키와 production 값이 포함된 경우에만 CreateTags 작업을 사용해 인스턴스에 태그를 적용할 수 있게 합니다. 다른 태그는 허용되지 않으며 사용자는 다른 리소스 유형에 태그를 지정할 수 없습니다. JSON


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

다음 정책은 사용자가 이미 owner 키와 그 값이 사용자 이름인 태그가 있는 태그 지정 가능한 리소스에 태그를 지정할 수 있게 합니다. 또한 사용자는 요청에서 anycompany:environment-type 키와 test 또는 prod 값을 가진 태그를 지정해야 합니다. 사용자는 요청에 추가 태그를 지정할 수 있습니다. JSON

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

리소스에 대한 특정 태그를 삭제할 수 있게 하는 IAM 정책을 만들 수 있어요. 예를 들어 다음 정책은 사용자가 요청에 지정된 태그 키가 environment 또는 cost-center인 경우 볼륨에 대한 태그를 삭제할 수 있게 합니다. 태그 값은 무엇이든 지정할 수 있지만 태그 키는 지정된 키 중 하나와 일치해야 합니다.

참고 — 리소스를 삭제하면 리소스와 연결된 모든 태그도 삭제됩니다. 사용자는 태그가 있는 리소스를 삭제하기 위해 ec2:DeleteTags 작업을 사용할 권한이 필요하지 않습니다. 삭제 작업을 수행할 권한만 있으면 됩니다. JSON

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

이 정책은 리소스가 이미 owner 키와 그 값이 사용자 이름인 태그로 태그가 지정된 경우에만, 사용자가 모든 리소스에서 environment=prod 태그만 삭제할 수 있게 합니다. 사용자는 리소스의 다른 태그는 삭제할 수 없습니다. JSON

{
  "Version":"2012-10-17",
  "Statement": [
      {
      "Effect": "Allow",
      "Action": [
        "ec2:DeleteTags"
      ],
      "Resource": "arn:aws:ec2:us-east-1:111122223333:*/*",
      "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 작업을 사용할 권한이 있어야 합니다. JSON

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

다음 정책은 사용자가 모든 인스턴스에 IAM 역할을 연결하거나 교체할 수 있게 합니다. 사용자는 이름이 TestRole-로 시작하는 IAM 역할만 연결하거나 교체할 수 있어요. iam:PassRole 작업의 경우 IAM 역할의 이름(이름이 다르다면 인스턴스 프로필이 아님)을 지정해야 합니다. JSON

{
    "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::111122223333:role/TestRole-*"
        }
    ]
}

예제: 라우팅 테이블 작업

다음 정책은 사용자가 VPC vpc-ec43eb89와 연결된 라우팅 테이블에 대해서만 라우트를 추가, 제거, 교체할 수 있게 합니다. ec2:Vpc 조건 키에 VPC를 지정하려면 VPC의 전체 ARN을 지정해야 합니다. JSON

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

예제: 특정 인스턴스가 다른 AWS 서비스의 리소스를 보도록 허용

다음은 IAM 역할에 연결할 수 있는 정책의 예입니다. 이 정책은 인스턴스가 다양한 AWS 서비스의 리소스를 볼 수 있게 합니다. ec2:SourceInstanceARN 전역 조건 키를 사용해 요청이 이루어진 인스턴스가 i-093452212644b0dd6여야 한다고 지정합니다. 같은 IAM 역할이 다른 인스턴스와 연결되면 그 인스턴스는 이러한 작업을 수행할 수 없습니다. JSON

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

예제: 시작 템플릿 작업

다음 정책은 사용자가 특정 시작 템플릿(lt-09477bcd97b0d3abc)에 대해서만 시작 템플릿 버전을 만들고 시작 템플릿을 수정할 수 있게 합니다. 사용자는 다른 시작 템플릿으로는 작업할 수 없습니다. JSON

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

다음 정책은 시작 템플릿에 태그 Purpose=Testing이 있는 경우에만 사용자가 모든 시작 템플릿과 시작 템플릿 버전을 삭제할 수 있게 합니다. JSON

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

인스턴스 메타데이터 작업

다음 정책은 사용자가 IMDSv2(Instance Metadata Service Version 2)를 사용해서만 인스턴스 메타데이터를 검색할 수 있도록 합니다. 다음 네 가지 정책을 네 개의 문이 있는 하나의 정책으로 결합할 수 있어요. 하나의 정책으로 결합하면 이 정책을 서비스 제어 정책(SCP)으로 사용할 수 있습니다. 기존 IAM 정책에 적용하는 거부 정책(기존 권한을 제거하고 제한) 또는 계정, 조직 단위(OU), 조직 전체에 전역적으로 적용되는 SCP로 똑같이 잘 작동합니다.

참고 — 다음 RunInstances 메타데이터 옵션 정책은 실행 주체에게 RunInstances로 인스턴스를 시작할 권한을 부여하는 정책과 함께 사용해야 합니다. 실행 주체에게 RunInstances 권한이 없으면 인스턴스를 시작할 수 없습니다.

중요 — Auto Scaling 그룹을 사용하는데 모든 새 인스턴스에 IMDSv2 사용을 요구해야 한다면 Auto Scaling 그룹이 시작 템플릿을 사용해야 합니다. Auto Scaling 그룹이 시작 템플릿을 사용하면 새 Auto Scaling 그룹이 생성될 때 IAM 실행 주체의 ec2:RunInstances 권한이 확인됩니다. 기존 Auto Scaling 그룹이 새 시작 템플릿이나 새 버전의 시작 템플릿을 사용하도록 업데이트될 때도 확인됩니다. IMDSv1 사용에 대한 제한은 시작 템플릿을 사용하는 Auto Scaling 그룹이 생성되거나 업데이트될 때만 확인됩니다. Latest 또는 Default 시작 템플릿을 사용하도록 구성된 Auto Scaling 그룹의 경우 새 버전의 시작 템플릿이 생성될 때 권한이 확인되지 않습니다. 권한이 확인되려면 Auto Scaling 그룹이 특정 버전의 시작 템플릿을 사용하도록 구성해야 합니다. Auto Scaling 그룹이 시작한 인스턴스에 IMDSv2 사용을 강제하려면 다음 추가 단계가 필요합니다.

  • SCP 또는 새로 생성되는 실행 주체에 대한 IAM 권한 경계를 사용해 조직의 모든 계정에서 시작 구성을 비활성화합니다. Auto Scaling 그룹 권한이 있는 기존 IAM 실행 주체의 경우 연결된 정책을 이 조건 키로 업데이트합니다. 시작 구성 사용을 비활성화하려면 값이 null로 지정된 "autoscaling:LaunchConfigurationName" 조건 키로 관련 SCP, 권한 경계, 또는 IAM 정책을 만들거나 수정합니다.
  • 새 시작 템플릿의 경우 시작 템플릿에서 인스턴스 메타데이터 옵션을 구성합니다. 기존 시작 템플릿의 경우 시작 템플릿의 새 버전을 만들고 새 버전에서 인스턴스 메타데이터 옵션을 구성합니다.
  • 실행 주체에게 시작 템플릿 사용 권한을 부여하는 정책에서 "autoscaling:LaunchTemplateVersionSpecified": "true"를 지정해 $latest와 $default의 연결을 제한합니다. 시작 템플릿 사용을 특정 버전으로 제한하면 인스턴스 메타데이터 옵션이 구성된 버전으로 새 인스턴스가 시작되도록 할 수 있습니다.
  • 시작 구성을 사용하는 Auto Scaling 그룹의 경우 시작 구성을 시작 템플릿으로 교체합니다.
  • 시작 템플릿을 사용하는 Auto Scaling 그룹의 경우 인스턴스 메타데이터 옵션이 구성된 새 시작 템플릿을 사용하거나, 인스턴스 메타데이터 옵션이 구성된 현재 시작 템플릿의 새 버전을 사용하는지 확인합니다.

IMDSv2 사용 요구

다음 정책은 인스턴스가 IMDSv2 사용을 요구하도록 선택하지 않은 한("ec2:MetadataHttpTokens": "required"로 표시됨) RunInstances API를 호출할 수 없다고 지정합니다. 인스턴스가 IMDSv2를 요구하도록 지정하지 않으면 RunInstances API를 호출할 때 UnauthorizedOperation 오류가 발생합니다. JSON

{
    "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로 설정되어야 합니다. JSON

{
    "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 오류가 발생합니다. JSON

{
    "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에는 세분화된 액세스 제어(조건)가 없습니다.

역할 자격 증명이 IMDSv2에서 검색되도록 요구

다음 정책은 이 정책이 역할에 적용되고 그 역할이 EC2 서비스에 의해 수임되어 생성된 자격 증명이 요청 서명에 사용된 경우, 그 요청은 IMDSv2에서 검색된 EC2 역할 자격 증명으로 서명되어야 한다고 지정합니다. 그렇지 않으면 모든 API 호출이 UnauthorizedOperation 오류가 발생합니다. 요청이 EC2 역할 자격 증명으로 서명되지 않으면 효과가 없으므로, 이 문/정책은 일반적으로 적용될 수 있습니다. JSON

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

Amazon EBS 볼륨 및 스냅샷 작업

Amazon EBS 볼륨 및 스냅샷 작업을 위한 예제 정책은 "Identity-based policy examples for Amazon EBS"를 참조하세요.

더 알아보기