카탈로그 리소스 정책을 사용하여 테이블에 대한 크로스 계정 AWS Glue ETL 작업을 설정하려면 어떻게 해야 하나요?

4분 분량
0

AWS Lake Formation을 사용하지 않고 AWS Glue 데이터 카탈로그의 ETL 작업을 사용하여 계정 B의 테이블에 액세스하고 싶습니다.

간략한 설명

AWS Lake Formation을 사용하거나 사용하지 않고 AWS Glue 데이터 카탈로그의 크로스 계정에 액세스할 수 있습니다. 다음 섹션에서는 AWS Glue만 사용하여 크로스 계정 카탈로그에 액세스하는 설정을 간략하게 설명합니다.

Lake Formation을 사용하는 경우, 계정 간 리소스 공유 설정에 대한 자세한 내용은 Lake Formation의 크로스 계정 데이터 공유를 참조하세요.

참고: 이러한 단계에서는 단일 AWS 리전 내에서 크로스 계정에 액세스하는 방법을 설명합니다. 다른 AWS 리전에 있는 리소스에 대한 액세스는 다루지 않습니다.

해결 방법

소스 및 대상 계정에 액세스 정책 설정

다음 단계를 사용하여 계정 A의 AWS Glue 데이터 카탈로그에서 계정 B에 리소스 수준 권한을 부여하세요.

참고: 계정 A에는 AWS Glue 데이터 카탈로그 리소스가 있고 계정 B에는 추출, 전환, 적재(ETL) 계정이 있습니다. 또한 계정 A에는 리소스 기반 정책 수정 사항이 있고 계정 B에는 일부 AWS Identity and Access Management(IAM) 정책 수정 사항이 있습니다.

계정 A에 카탈로그-리소스 정책 연결

1.    AWS 관리 콘솔에 로그인합니다.

2.    검색 창에서 AWS Glue를 검색합니다. AWS Glue로 시작하기를 선택합니다.

3.    왼쪽 패널에서 카탈로그 설정을 선택합니다.

4.    권한에서 다음 리소스 정책을 입력합니다. 이 리소스 정책을 통해 계정 B는 계정 A의 데이터베이스와 테이블에 액세스할 수 있습니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::1111222233334444:root"
      },
      "Action": "glue:*",
      "Resource": [
        "arn:aws:glue:us-east-1:5555666677778888:catalog",
        "arn:aws:glue:us-east-1:5555666677778888:database/doc_example_DB",
        "arn:aws:glue:us-east-1:5555666677778888:table/doc_example_DB/*"
      ]
    }
  ]
}

참고: 정책에서 다음 값을 바꿉니다.

  • 1111222233334444를 계정 B의 계정 ID로
  • 5555666677778888을 계정 A의 계정 ID로
  • us-east-1을 선택한 리전으로
  • doc_example_DB를 데이터베이스 이름으로

5.    (선택 사항) 정책에 역할의 Amazon 리소스 이름(ARN)을 포함하여 계정 A의 특정 역할에 대한 액세스를 제한할 수 있습니다. 예를 들면 다음과 같습니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::1111222233334444:role/service-role/AWSGlueServiceRole_Glue_Test"
      },
      "Action": "glue:*",
      "Resource": [
        "arn:aws:glue:us-east-1:5555666677778888:catalog",
        "arn:aws:glue:us-east-1:5555666677778888:database/doc_example_DB",
        "arn:aws:glue:us-east-1:5555666677778888:table/doc_example_DB/*"
      ]
    }
  ]
}

참고: 정책에서 다음 값을 바꿉니다.

  • 1111222233334444를 계정 B의 계정 ID로
  • 5555666677778888을 계정 A의 계정 ID로
  • us-east-1을 선택한 리전으로
  • doc_example_DB를 데이터베이스 이름으로
  • AWSGlueServiceRole_Glue_Test를 ETL 작업을 실행하는 데 사용되는 역할의 ARN으로

계정 B에 IAM 정책 연결

ETL 작업을 실행하는 계정 B의 IAM 사용자는 계정 A의 데이터베이스와 테이블에 액세스할 수 있어야 합니다.

참고: Amazon Athena를 데이터 카탈로그와 함께 사용하는 경우 정책에 기본 데이터베이스를 포함하세요. 이렇게 포함하면 GetDatabaseCreateDatabase 작업이 성공적으로 수행되도록 할 수 있습니다. 자세한 내용은 AWS 리전별 기본 데이터베이스 및 카탈로그를 참조하세요.

1.    AWS 로그인 자격 증명으로 IAM 콘솔에 로그인합니다.

2.    왼쪽 패널에서 역할을 선택합니다.

3.    ETL 스크립트 내에서 사용 중인 역할 이름을 선택합니다.

4.    IAM 정책을 계정 B에 있는 AWS Glue ETL 작업의 IAM 역할에 연결합니다. 그러면 계정 A의 데이터베이스와 테이블에 액세스할 수 있습니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "glue:GetDatabase",
        "glue:GetConnection",
        "glue:GetTable",
        "glue:GetPartition"
      ],
      "Resource": [
        "arn:aws:glue:us-east-1:5555666677778888:catalog",
        "arn:aws:glue:us-east-1:5555666677778888:database/default",
        "arn:aws:glue:us-east-1:5555666677778888:database/doc_example_DB",
        "arn:aws:glue:us-east-1:5555666677778888:table/doc_example_DB/*"
      ]
    }
  ]
}

참고: 정책에서 다음 값을 바꿉니다.

  • 5555666677778888을 계정 A의 계정 ID로
  • us-east-1을 선택한 리전으로
  • doc_example_DB를 데이터베이스 이름으로

5.    생성한 정책이 계정 B의 IAM 역할에 연결되었는지 확인합니다.

6.    계정 B가 계정 A의 데이터 카탈로그에 액세스할 수 있는지 테스트합니다. 다음 스크립트를 사용하여 ETL 작업을 생성합니다.

동적 프레임 스크립트:

df = glueContext.create_dynamic_frame.from_catalog(database="doc_example_DB", table_name="doc_example_table", catalog_id="5555666677778888", region="us-east-1")

데이터 프레임 스크립트:

"""Create Spark Session with cross-account AWS Glue Data Catalog"""
from pyspark.sql import SparkSession

spark_session = SparkSession.builder.appName("Spark Glue Example") \
.config("hive.metastore.client.factory.class", \
"com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory") \
.config("hive.metastore.glue.catalogid", "5555666677778888") \
.enableHiveSupport() \
.getOrCreate()

table_df = spark_session.sql("SELECT * FROM doc_example_DB.doc_example_table limit 10")

table_df.show()

참고: 정책에서 다음 값을 바꿉니다.

  • 5555666677778888을 계정 A의 계정 ID로
  • doc_example_DB를 데이터베이스 이름으로
  • doc_example_table을 테이블 이름으로
  • us-east-1을 선택한 리전으로

관련 정보

크로스 계정 액세스 권한 부여

AWS Glue 리소스 ARN 지정

Lake Formation 권한 모델로의 업그레이드에 대해

Hive 메타스토어와 AWS Glue 데이터 카탈로그 간의 마이그레이션

액세스 제어를 위한 AWS Glue 리소스 정책

AWS 공식
AWS 공식업데이트됨 일 년 전