AWS Glue 리소스 기반 액세스 제어 정책 예제 - AWS Glue

AWS Glue 리소스 기반 액세스 제어 정책 예제

이 단원에는 교체 계정 액세스 권한을 부여하는 정책을 비롯해 리소스 정책 예제가 포함되어 있습니다.

중요

AWS Glue 리소스 정책을 변경하면 계정 내 기존 AWS Glue 사용자에 대한 권한을 실수로 취소해 예기치 않은 중단을 일으킬 수 있습니다. 다음 예제는 개발 또는 테스트 계정에서만 시도해 보고, 변경하기 전에 이러한 예제가 기존 워크플로우에 문제를 일으키지 않는지 확인하십시오.

참고

IAM 정책과 AWS Glue 리소스 정책을 둘 다 전파하려면 몇 초 가량 걸립니다. 새 정책을 연결하더라도 새 정책이 시스템 전체에서 전파되기까지 이전 정책이 계속해서 적용됩니다.

다음 예제에서는 AWS Command Line Interface(AWS CLI)를 사용하여 AWS Glue 서비스 API와 상호 작용합니다. AWS Glue 콘솔에서 또는 AWS SDK 중 하나를 사용하여 동일한 작업을 수행할 수 있습니다.

AWS CLI을 설정하려면
  1. AWS Command Line Interface 사용 설명서AWS Command Line Interface 설치 지침에 따라 AWS CLI를 설치합니다.

  2. 구성 및 자격 증명 파일의 지침에 따라 AWS CLI를 구성합니다. AWS 계정 관리자 자격 증명을 사용하여 관리자 프로파일을 생성합니다. 기본 AWS 리전을 (또는 사용 중인 리전)로 구성하고 기본 출력 포맷을 JSON으로 설정합니다.

  3. 다음 명령을 실행하여 AWS Glue API에 대한 액세스를 테스트합니다. Alice를 계정의 실제 IAM 사용자 또는 역할로 바꿉니다.

    # Run as admin of account account-id $ aws glue put-resource-policy --profile administrator-name --region us-west-2 --policy-in-json '{ "Version": "2012-10-17", "Statement": [ { "Principal": { "AWS": [ "arn:aws:iam::account-id:user/Alice" ] }, "Effect": "Allow", "Action": [ "glue:*" ], "Resource": [ "arn:aws:glue:us-west-2:account-id:*" ] } ] }'
  4. 리소스 정책 및 교차 계정 액세스를 테스트하는 데 사용하는 계정 내 각 IAM 사용자에 대한 사용자 프로파일을 구성합니다.

예 1. 리소스 정책을 사용하여 동일한 계정에서 액세스 제어

이 예제에서 계정 A의 관리 사용자는 계정 A의 IAM 사용자인 Alice에게 카탈로그에 대한 모든 액세스 권한을 부여하는 리소스 정책을 생성합니다. Alice에게는 연결된 IAM 정책이 없습니다.

이렇게 하기 위해 관리 사용자가 다음 AWS CLI 명령을 실행합니다.

# Run as admin of Account A $ aws glue put-resource-policy --profile administrator-name --region us-west-2 --policy-in-json '{ "Version": "2012-10-17", "Statement": [ { "Principal": { "AWS": [ "arn:aws:iam::account-A-id:user/Alice" ] }, "Effect": "Allow", "Action": [ "glue:*" ], "Resource": [ "arn:aws:glue:us-west-2:account-A-id:*" ] } ] }'

JSON 정책 문서를 AWS CLI 명령의 일부로 입력하는 대신 정책 문서를 파일로 저장한 다음 AWS CLI 명령에서 파일 경로(file://로 접두사가 지정됨)를 참조할 수 있습니다. 다음은 이렇게 할 수 있는 방법을 보여주는 예제입니다.

$ echo '{ "Version": "2012-10-17", "Statement": [ { "Principal": { "AWS": [ "arn:aws:iam::account-A-id:user/Alice" ] }, "Effect": "Allow", "Action": [ "glue:*" ], "Resource": [ "arn:aws:glue:us-west-2:account-A-id:*" ] } ] }' > /temp/policy.json $ aws glue put-resource-policy --profile admin1 \ --region us-west-2 --policy-in-json file:///temp/policy.json

리소스 정책이 전파된 후 Alice는 다음과 같이 계정 A에 있는 모든 AWS Glue 리소스에 액세스할 수 있습니다.

# Run as user Alice $ aws glue create-database --profile alice --region us-west-2 --database-input '{ "Name": "new_database", "Description": "A new database created by Alice", "LocationUri": "s3://my-bucket" }' $ aws glue get-table --profile alice --region us-west-2 --database-name "default" --table-name "tbl1"}

Alice의 get-table 호출에 대한 응답으로 AWS Glue 서비스는 다음을 반환합니다.

{ "Table": { "Name": "tbl1", "PartitionKeys": [], "StorageDescriptor": { ...... }, ...... } }

예 2. 리소스 정책을 사용하여 교차 계정 액세스 권한 부여

이 예제에서는 계정 A의 리소스 정책을 사용해 계정 B의 Bob에게 계정 A의 모든 데이터 카탈로그 리소스에 대한 읽기 전용 액세스 권한을 부여합니다. 이렇게 하기 위해서는 다음 4단계가 필요합니다.

  1. 계정 A가 Amazon Athena 데이터 카탈로그를 AWS Glue로 마이그레이션했는지 확인합니다.

    리소스 소유자 계정이 해당 Athena 데이터 카탈로그를 AWS Glue로 마이그레이션하지 않은 경우에는 AWS Glue에 대한 교차 계정 액세스가 허용되지 않습니다. Athena 카탈로그를 AWS Glue로 마이그레이션하는 방법에 대한 자세한 내용은 Amazon Athena 사용 설명서AWS Glue Data Catalog로 단계별 업그레이드를 참조하세요.

    # Verify that the value "ImportCompleted" is true. This value is region specific. $ aws glue get-catalog-import-status --profile admin1 --region us-west-2 { "ImportStatus": { "ImportCompleted": true, "ImportTime": 1502512345.0, "ImportedBy": "StatusSetByDefault" } }
  2. 계정 A의 관리자가 계정 B에게 액세스 권한을 부여하는 리소스 정책을 생성합니다.

    # Run as admin of Account A $ aws glue put-resource-policy --profile admin1 --region us-west-2 --policy-in-json '{ "Version": "2012-10-17", "Statement": [ { "Principal": { "AWS": [ "arn:aws:iam::account-B-id:root" ] }, "Effect": "Allow", "Action": [ "glue:Get*", "glue:BatchGet*" ], "Resource": [ "arn:aws:glue:us-west-2:account-A-id:*" ] } ] }'
  3. 계정 B의 관리자가 IAM 정책을 사용하여 Bob에게 계정 A에 대한 액세스 권한을 부여합니다.

    # Run as admin of Account B $ aws iam put-user-policy --profile admin2 --user-name Bob --policy-name CrossAccountReadOnly --policy-document '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "glue:Get*", "glue:BatchGet*" ], "Resource": [ "arn:aws:glue:us-west-2:account-A-id:*" ] } ] }'
  4. 계정 A의 리소스에 대한 Bob의 액세스 권한을 확인합니다.

    # Run as user Bob. This call succeeds in listing Account A databases. $ aws glue get-databases --profile bob --region us-west-2 --catalog-id account-A-id { "DatabaseList": [ { "Name": "db1" }, { "Name": "db2" }, ...... ] } # This call succeeds in listing tables in the 'default' Account A database. $ aws glue get-table --profile alice --region us-west-2 --catalog-id account-A-id \ --database-name "default" --table-name "tbl1" { "Table": { "Name": "tbl1", "PartitionKeys": [], "StorageDescriptor": { ...... }, ...... } } # This call fails with access denied, because Bob has only been granted read access. $ aws glue create-database --profile bob --region us-west-2 --catalog-id account-A-id --database-input '{ "Name": "new_database2", "Description": "A new database created by Bob", "LocationUri": "s3://my-bucket2" }' An error occurred (AccessDeniedException) when calling the CreateDatabase operation: User: arn:aws:iam::account-B-id:user/Bob is not authorized to perform: glue:CreateDatabase on resource: arn:aws:glue:us-west-2:account-A-id:database/new_database2

2단계에서 계정 A의 관리자는 계정 B의 루트 사용자에게 권한을 부여합니다. 그러면 루트 사용자는 모든 IAM 보안 주체(사용자, 역할, 그룹 등)에 IAM 정책을 연결하여 자신이 소유한 권한을 이러한 보안 주체에게 위임할 수 있습니다. 관리 사용자에게 이미 전체 액세스 IAM 정책이 연결되어 있기 때문에 관리자는 루트 사용자에게 부여된 권한과 계정의 다른 IAM 사용자에게 권한을 위임할 수 있는 권한도 자동으로 소유하게 됩니다.

또는 2단계에서 사용자 Bob의 Amazon 리소스 이름(ARN)에 권한을 직접 부여할 수도 있습니다. 그러면 교차 계정 액세스 권한이 Bob 혼자에게만 제한됩니다. 그러나 3단계에서는 Bob이 실제로 교차 계정 액세스 권한을 얻어야 합니다. 교차 계정 액세스의 경우 액세스가 작동하려면 리소스 계정의 리소스 정책 사용자 계정의 IAM 정책이 모두 필요합니다. 이는 리소스 정책 또는 IAM 정책이 다른 계정 없이 액세스 권한을 부여할 수 있는 예제 1의 동일 계정 액세스 권한과 다릅니다.