IAM 정책 태그를 사용하여 EC2 인스턴스 또는 EBS 볼륨의 생성 방식을 제한하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2021년 12월 20일

AWS Identity and Access Management(IAM) 사용자 또는 그룹가 새로운 Amazon EC2(Amazon Elastic Compute Cloud) 인스턴스를 시작할 수 있도록 액세스를 허용하고 싶습니다. 또한 IAM 사용자가 특정 태그를 적용하는 경우에만 새 Amazon EBS(Amazon Elastic Block Store) 볼륨을 생성할 수 있도록 액세스를 허용하고 싶습니다. IAM 정책 조건을 사용하여 새 리소스를 생성하기 위한 액세스를 제한하려면 어떻게 해야 합니까?

간략한 설명

리소스를 생성하는 API 호출의 일부로서 EC2 인스턴스 및 EBS 볼륨에 대한 태그를 지정할 수 있습니다. 이 원칙을 사용하면 IAM 정책에 조건을 적용하여 IAM 사용자가 특정 리소스에 태그를 지정하도록 요구할 수 있습니다. 다음 예제 정책에서는 사용자가 보안 그룹이나 키 페어를 생성할 수 없으므로 사용자는 기존 보안 그룹과 키 페어를 선택해야 합니다.

다음의 예제 IAM 정책을 통해 사용자는 아래와 같은 작업을 수행할 수 있습니다.

  • 태그 키와 값이 일치하는 EC2 인스턴스를 시작합니다.
  • 적어도 하나 이상의 태그와 값이 일치하는 EC2 인스턴스를 시작합니다.
  • 적어도 하나 이상의 태그 키가 일치하는 EC2 인스턴스를 시작합니다.
  • 지정된 목록의 태그만 있는 EC2 인스턴스를 시작합니다.

해결 방법

태그 키와 값이 일치하는 EC2 인스턴스를 시작합니다.

다음 예제 정책을 사용하면 ForAllValues 한정자를 사용하여 정책에 정의된 모든 태그를 적용하는 경우에만 사용자가 EC2 인스턴스를 시작하고 EBS 볼륨을 생성할 수 있습니다. 사용자가 정책에 포함되지 않은 태그를 적용할 경우 작업이 거부됩니다. 대소문자를 구분하려면 aws:TagKeys 조건을 사용하십시오.

참고: 예제 정책에서 key1value1을 수정하여 리소스에 적용되는 태그 및 값을 포함시킵니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowToDescribeAll",
      "Effect": "Allow",
      "Action": [
        "ec2:Describe*"
      ],
      "Resource": "*"
    },
    {
      "Sid": "AllowRunInstances",
      "Effect": "Allow",
      "Action": "ec2:RunInstances",
      "Resource": [
        "arn:aws:ec2:*::image/*",
        "arn:aws:ec2:*::snapshot/*",
        "arn:aws:ec2:*:*:subnet/*",
        "arn:aws:ec2:*:*:network-interface/*",
        "arn:aws:ec2:*:*:security-group/*",
        "arn:aws:ec2:*:*:key-pair/*"
      ]
    },
    {
      "Sid": "AllowRunInstancesWithRestrictions",
      "Effect": "Allow",
      "Action": [
        "ec2:CreateVolume",
        "ec2:RunInstances"
      ],
      "Resource": [
        "arn:aws:ec2:*:*:volume/*",
        "arn:aws:ec2:*:*:instance/*",
        "arn:aws:ec2:*:*:network-interface/*"
      ],
      "Condition": {
        "StringEquals": {
          "aws:RequestTag/key1": "value1",
          "aws:RequestTag/key2": "value2"
        },
        "ForAllValues:StringEquals": {
          "aws:TagKeys": [
            "key1",
            "key2"
          ]
        }
      }
    },
    {
      "Sid": "AllowCreateTagsOnlyLaunching",
      "Effect": "Allow",
      "Action": [
        "ec2:CreateTags"
      ],
      "Resource": [
        "arn:aws:ec2:*:*:volume/*",
        "arn:aws:ec2:*:*:instance/*",
        "arn:aws:ec2:*:*:network-interface/*"
      ],
      "Condition": {
        "StringEquals": {
          "ec2:CreateAction": [
            "RunInstances",
            "CreateVolume"
          ]
        }
      }
    }
  ]
}

중요: EC2 인스턴스를 성공적으로 시작하려면 이 정책에 일치하는 태그 키와 값이 포함되어 있어야 합니다. 키와 값 페어가 일치하지 않으면 "시작 실패(Launch Failed)" 오류 또는 비슷한 유형의 API 실패 메시지가 나타날 수 있습니다.

예제 결과

키/값 결과
키1/값1 및 키2/값2 허용
키1/값1 거부
키1/값2 거부
키와 값 없음 거부

적어도 하나 이상의 태그와 값이 일치하는 EC2 인스턴스를 시작합니다.

다음 예에서는 하나 이상의 태그 키 이름이 key1이고 값이 value1인 경우 사용자가 EC2 인스턴스를 시작하고 EBS 볼륨을 생성할 수 있도록 AllowRunInstancesWithRestrictions 조건 블록을 교체합니다. RunInstances 요청에는 여러 태그를 추가할 수 있습니다.

"Condition": {
  "StringEquals": {
    "aws:RequestTag/key1": "value1"
  },
  "ForAnyValue:StringEquals": {
    "aws:TagKeys": [
      "key1"
    ]
  }
}

예제 결과

키/값 결과
키1/값1 및 키2/값2 허용
키1/값1 허용

키1/값2

거부
키와 값 없음

거부

적어도 하나 이상의 태그 키가 일치하는 EC2 인스턴스를 시작합니다.

다음 정책 예에서는 하나 이상의 태그 키 이름이 key1인 경우 사용자가 EC2 인스턴스를 시작하고 EBS 볼륨을 생성할 수 있도록 AllowRunInstancesWithRestrictions 조건 블록을 교체합니다. key1 태그에는 특정 값이 필요하지 않으며 RunInstances 요청에는 여러 태그를 추가할 수 있습니다.

"Condition": {
  "ForAnyValue:StringEquals": {
    "aws:TagKeys": [
      "key1"
    ]
  }
}

예제 결과

키/값 결과
키1/값1 및 키2/값2 허용
키1/값1 허용
키1/값2 허용
키와 값 없음 거부

지정된 목록의 태그만 있는 EC2 인스턴스를 시작합니다.

다음 예제 정책에서 AllowRunInstancesWithRestrictions 조건 블록을 교체하여 요청에 태그 키 key1key2가 제공된 경우에만 사용자가 EC2 인스턴스를 시작하고 EBS 볼륨을 생성할 수 있도록 허용합니다. 두 태그 키에는 특정 값이 필요하지 않으며 RunInstances 요청에는 여러 태그를 추가할 수 있습니다.

"Condition": {
  "StringLike": {
      "aws:RequestTag/key1": "*",
      "aws:RequestTag/key2": "*"
  },
  "ForAllValues:StringEquals": {
    "aws:TagKeys": [
        "key1",
        "key2"
    ]
  }
}

참고: 모든 태그가 있는지 확인하려면 StringLike 조건이 필요합니다.

예제 결과

키/값 결과
키1/모든 값 및 키2/모든 값 허용
키1/모든 값

거부

키2/모든 값 거부
키 또는 값 없음 거부
키1/모든 값, 키2/모든 값, 키3/모든 값 거부