AWS Glue 및 Amazon S3에 대한 Amazon Redshift Spectrum 교차 계정 액세스를 생성하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2020년 8월 11일

Amazon Redshift Spectrum을 사용하여 동일한 AWS 리전에 있는 다른 AWS 계정의 AWS Glue 및 Amazon Simple Storage Service(Amazon S3)에 액세스하려고 합니다. 어떻게 해야 합니까?

간략한 설명

Amazon Redshift Spectrum과는 다른 계정에 있는 AWS 리소스에 액세스하려면 다음 단계를 수행합니다.

1.    계정 1에서 Amazon Redshift와의 신뢰 관계를 통해 AWS Identity and Access Management(IAM) 역할을 생성합니다. 이 역할은 Amazon Redshift 클러스터에 연결되어야 합니다.

2.    계정 2에서 AWS Glue 및 Amazon S3 모두에 액세스할 수 있는 다른 역할을 생성합니다. 이 역할은 신뢰 관계를 편집하고 Amazon Redshift 계정이 이 역할을 수임하도록 허용합니다.

3.    계정 1에서 기존 역할에 대한 신뢰 관계를 편집하여 AWS Glue 및 Amazon S3 계정에서 생성된 역할을 수임합니다.

해결 방법

계정 1: Amazon Redshift와 신뢰 관계가 있는 AWS Identity and Access Management(IAM) 역할 생성

1.    IAM 콘솔을 엽니다.

2.    탐색 창에서 [Roles]를 선택하고 [Create role]을 선택합니다.

3.    [Select type of trusted entity]에서 [AWS 서비스]를 선택합니다.

4.    Redshift를 선택합니다.

5.    [Select your use case]에서 [Redshift - Customizable]을 선택합니다.

6.    [Next: Permissions, Next: Tags], [Next: Review]를 차례로 선택합니다. 정책이나 태그를 추가할 필요가 없습니다.

7.    [역할 이름]을 입력하고 [역할 만들기]를 선택합니다. 다음 예제에서는 이 역할을 redshift_role1이라고 합니다.

8.    redshift_role1을 Amazon Redshift 클러스터에 연결합니다. 이 연결을 사용하면 클러스터가 새로 생성된 역할을 수임하여 Amazon S3, Amazon Athena 및 AWS Glue에 액세스할 수 있습니다.

계정 2: AWS Glue 및 Amazon S3에 액세스할 수 있는 다른 역할 생성

1.    IAM 콘솔을 엽니다.

2.    [Policies]를 선택하고 [Create policy]를 선택합니다.

3.    [JSON] 탭을 선택한 다음 다음과 비슷한 IAM 정책을 입력합니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "VisualEditor0",
      "Effect": "Allow",
      "Action": [
        "glue:BatchCreatePartition",
        "glue:UpdateDatabase",
        "glue:CreateTable",
        "glue:DeleteDatabase",
        "glue:GetTables",
        "glue:GetPartitions",
        "glue:BatchDeletePartition",
        "glue:UpdateTable",
        "glue:BatchGetPartition",
        "glue:DeleteTable",
        "glue:GetDatabases",
        "glue:GetTable",
        "glue:GetDatabase",
        "glue:GetPartition",
        "glue:CreateDatabase",
        "glue:BatchDeleteTable",
        "glue:CreatePartition",
        "glue:DeletePartition",
        "glue:UpdatePartition"
      ],
      "Resource": "*"
    },
    {
      "Sid": "VisualEditor1",
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:ListBucketMultipartUploads",
        "s3:ListBucket",
        "s3:GetBucketLocation",
        "s3:ListMultipartUploadParts"
      ],
      "Resource": [
        "arn:aws:s3:::your_bucket",
        "arn:aws:s3:::your_bucket/*"
      ]
    },
    {
      "Sid": "VisualEditor2",
      "Effect": "Allow",
      "Action": [
        "kms:Decrypt"
      ],
      "Resource": [
        "<KMS_KEY_ARN>"
      ]
    }
  ]
}

your_bucket을 Amazon Redshift Spectrum에서 액세스하려는 S3 버킷의 이름으로 바꿉니다. KMS_KEY_ARN을 S3 버킷을 암호화하는 KMS 키의 ARN으로 바꿉니다.

참고: S3 버킷의 파일이 암호화된 경우 Amazon Redshift에 적절한 권한을 부여해야 합니다.

4.    [정책 검토]를 선택합니다.

5.    정책에 대한 [Name]을 입력하고 [Create policy]를 선택합니다.

6.    탐색 창에서 [역할]을 선택하고 [역할 만들기]를 선택합니다.

7.    [ Select type of trusted entity]에서 다른 [AWS 계정]을 선택합니다.

8.    [계정 ID]에 Amazon Redshift를 사용 중인 계정의 ID를 입력합니다. 자세한 내용은 AWS 계정 ID 찾기를 참조하십시오.

9.    [Next: Permissions]를 선택합니다.

10.    정책 목록에서 사용자가 생성한 정책 이름 옆에 있는 확인란을 선택합니다.

11.    [Next: Tags]를 선택한 후 [Next: Review]를 선택합니다. 태그를 추가할 필요가 없습니다.

12.    [역할 이름]을 입력하고 [역할 만들기]를 선택합니다. 다음 예제에서는 이를 glue_s3_role2라고 합니다.

13.    탐색 창에서 [Roles]를 선택합니다.

14.    사용자가 생성한 역할의 이름을 선택한 다음, [신뢰 관계] 탭을 선택합니다.

15.    [Edit Trust Relationship]을 선택합니다.

16.    기존 정책을 삭제한 후 다음과 비슷한 정책으로 바꿉니다. redshift_account1을 Amazon Redshift를 사용 중인 계정의 ID로 바꿉니다. redshift_role1을 사용자가 생성한 첫 번째 역할의 이름으로 바꿉니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::redshift_account1:role/redshift_role1"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

17.    [신뢰 정책 업데이트]를 선택합니다.

계정 1: Amazon Redshift에서 생성된 역할에 대한 신뢰 관계 편집

1.    IAM 콘솔을 엽니다.

2.    탐색 창에서 [역할]을 선택하고 앞서 생성한 첫 번째 역할의 이름(redshift_role1)을 선택합니다.

3.    [Add inline policy]를 선택합니다.

4.    [JSON] 탭을 선택합니다. 기존 정책을 삭제하고 다음과 비슷한 IAM 정책을 입력합니다. glue_s3_account2를 AWS Glue 및 Amazon S3를 사용 중인 계정의 ID로 바꿉니다. glue_s3_role2를 사용자가 생성한 두 번째 역할의 이름으로 바꿉니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1487639602000",
      "Effect": "Allow",
      "Action": [
        "sts:AssumeRole"
      ],
      "Resource": "arn:aws:iam::glue_s3_account2:role/glue_s3_role2"
    }
  ]
}

5.    [정책 검토]를 선택합니다.

6.    정책에 대한 이름을 입력하고 [Create policy]를 선택합니다.

7.    Amazon Redshift 클러스터에 연결하십시오.

8.    다음 예제와 같이, 두 계정에서 생성한 역할을 사용하여 외부 스키마를 생성합니다.

create external schema spectrum_schema
from data catalog
database 'your_db'
iam_role 'arn:aws:iam::redshift_account1:role/redshift_role1,arn:aws:iam::glue_s3_account2:role/glue_s3_role2'

다음 값을 바꿉니다.
your_db: AWS Glue에 있는 데이터베이스의 이름입니다.
redshift_account1: Amazon Redshift 계정의 ID입니다.
redshift_role1: Amazon Redshift 계정에서 생성한 역할 이름입니다.
glue_s3_account2: AWS Glue 및 Amazon S3 계정의 ID입니다.
glue_s3_role2: AWS Glue 및 Amazon S3 계정에서 생성한 역할의 이름입니다.

이제 모든 리소스가 동일한 리전에 있는 한, redshift_account1에 있는 Amazon Redshift 클러스터에서 Amazon Redshift Spectrum을 사용하여 glue_s3_account2에서 AWS Glue 테이블을 쿼리할 수 있습니다. Redshift Spectrum이 기존 AWS Glue 테이블에 액세스할 수 있으므로 외부 테이블을 다시 생성할 필요가 없습니다.

다음 예제의 쿼리는 외부 스키마에서 생성된 AWS Glue 테이블의 행 수를 반환합니다.

select count(*) from spectrum_schema.glue_table;

참고: spectrum_schemaglue_table을 스키마와 AWS Glue 테이블의 이름으로 바꿉니다.


이 문서가 도움이 되었습니까?


결제 또는 기술 지원이 필요합니까?