AWS Glue용 크로스 클라우드 연결 설정

AWS Glue Data Catalog에 대한 크로스 클라우드 연결을 사용하면 Google Cloud내에서 직접 해당 카탈로그의 데이터를 쿼리할 수 있습니다. 이 기능을 사용하면 외부 데이터 소스를 기존Google Cloud 환경과 통합하여 데이터 분석을 통합할 수 있습니다.

연결을 설정한 후에는 파일을 이동하지 않고도 Lakehouse에서 제휴 Apache Iceberg 테이블을 쿼리하고 제어할 수 있습니다.

시작하기 전에

  1. 레이크하우스 개요를 검토하여 레이크하우스에서 데이터 액세스를 관리하는 방법을 이해합니다.
  2. 크로스 클라우드 데이터 액세스를 읽고 작동 방식을 이해합니다.
  3. 지원되는 카탈로그를 검토하여 지원되는 구성을 확인합니다.
  4. 선택사항: Google Cloud가상 프라이빗 클라우드 (VPC) 네트워크와 AWS VPC 간의 비공개 상호 연결을 통해 쿼리 읽기 또는 백그라운드 메타데이터 새로고침을 라우팅하려는 경우 활성 AWS 계정이 있는지 확인하고, Dedicated Cross-Cloud Interconnect 또는 Partner Cross-Cloud Interconnect를 프로비저닝하고, Cloud Router와 BGP 세션을 설정하고, 두 클라우드 환경 모두에 필요한 Identity and Access Management (IAM) 권한이 있는지 확인합니다.
  5. Google Cloud 계정에 로그인합니다. Google Cloud를 처음 사용하는 경우 계정을 만들고 Google 제품의 실제 성능을 평가해 보세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
  6. Verify that billing is enabled for your Google Cloud project.

  7. Enable the BigLake API, if it is not already enabled.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the API

  8. Verify that billing is enabled for your Google Cloud project.

  9. Enable the BigLake API, if it is not already enabled.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the API

필요한 역할

크로스 클라우드 데이터 액세스를 위해 Lakehouse를 설정하는 데 필요한 권한을 얻으려면 관리자에게 프로젝트에 대한 다음 IAM 역할을 부여해 달라고 요청하세요.

역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.

커스텀 역할이나 다른 사전 정의된 역할을 통해 필요한 권한을 얻을 수도 있습니다.

제한사항 및 고려사항

이 섹션에서는 크로스 클라우드 데이터에 액세스할 때의 제한사항과 고려사항을 설명합니다.

  • VPC 서비스 제어: 페더레이션 카탈로그 엔드포인트 또는 기본 Cloud Storage 버킷이 포함된 프로젝트가 VPC 서비스 제어 서비스 경계 내에 있는 경우 이그레스 또는 인그레스 규칙을 구성해야 합니다. 자세한 내용은 페더레이션 카탈로그 엔드포인트에 VPC 서비스 제어 사용을 참조하세요.
  • Cross-Cloud Interconnect에 지원되는 클라우드 제공업체: 비공개 상호 연결을 사용하여 쿼리 전송, 백그라운드 메타데이터 새로고침 또는 둘 다를 라우팅하는 것은 AWS에서 지원됩니다. Dedicated Cross-Cloud Interconnect 또는 Partner Cross-Cloud Interconnect를 사용할 수 있습니다.
  • 네트워크 라우팅: 쿼리 전송 또는 백그라운드 메타데이터 새로고침을 위해 비공개 상호 연결을 구성하지 않으면 해당 트래픽은 TLS를 사용하여 공개 인터넷을 통해 라우팅됩니다. 공개 인터넷을 통해 쿼리 읽기를 라우팅하면 원격 클라우드 제공업체의 이그레스 요금이 높아지고 성능 예측이 어려워질 수 있습니다.
  • 읽기 전용: Lakehouse의 페더레이션 카탈로그는 원격 카탈로그의 읽기 전용 뷰입니다. 리소스 조작(예: 리소스 만들기, 업데이트, 삭제)은 지원되지 않으며 원격 카탈로그에서 직접 수행해야 합니다.
  • 데이터 최신성: 제휴 카탈로그의 --refresh-interval 플래그는 메타데이터가 동기화되는 빈도를 결정합니다. 값은 0s(사용 중지됨) 또는 300s(5분) 이상이어야 합니다. 카탈로그의 백그라운드 메타데이터 새로고침은 네임스페이스 및 테이블 리소스가 많을수록 더 오래 걸릴 수 있습니다. 이전 새로고침이 초과되면 현재 새로고침을 건너뛰고 다음 새로고침은 다음 간격으로 예약됩니다. 쿼리는 가장 최근에 동기화된 카탈로그 메타데이터를 사용하므로 새 테이블, 스키마 업데이트, 새로 커밋된 데이터와 같은 원격 카탈로그의 변경사항은 다음 백그라운드 메타데이터 새로고침이 완료될 때까지 Lakehouse에 표시되지 않습니다.
  • 레이크하우스 캐싱: 크로스 클라우드 캐싱은 기본적으로 사용 중지되어 있습니다 (--cross-cloud-cache=disabled). 페더레이션 카탈로그 또는 연결 수준에서 캐싱을 사용 설정하거나 사용 중지할 수 있습니다. 고객 관리 암호화 키 (CMEK)는 캐싱에 지원되지 않습니다. 캐시된 파일은 Google-owned and Google-managed encryption keys를 사용하여 암호화됩니다. 쿼리의 테이블에 constraints/gcp.restrictNonCmekServices 조직 정책 제약조건이 적용되면 해당 쿼리에 대해 캐싱이 자동으로 사용 중지됩니다. 자세한 내용은 지능형 캐싱을 참조하세요.
  • 데이터 레지던시 및 규정 준수: 페더레이션 카탈로그 또는 연결에서 크로스 클라우드 캐싱을 사용 설정하면 Lakehouse는 쿼리가 실행되는 Google Cloud 리전에 캐시된 파일을 저장 상태로 임시 저장합니다. 원격 클라우드 파일이 다른 관할권에 있는 경우 교차 리전 캐싱을 사용 설정하기 전에 조직의 데이터 레지던시 및 규정 준수 요구사항을 충족하는지 확인하세요.

일반 워크플로

크로스 클라우드 데이터에 액세스하려면 다음 일반 단계를 따르세요.

  • Cross-Cloud Interconnect 설정 (선택사항): Google Cloud VPC 네트워크와 AWS VPC 간에 비공개 연결을 구성합니다.
  • 제휴 설정: AWS에서 자리표시자 신뢰 정책을 사용하여 IAM 역할을 만들어 인증을 구성합니다. 그런 다음 Lakehouse에서 제휴 카탈로그를 만들고 트러스트 정책을 업데이트합니다.
  • 연결 확인: Lakehouse가 원격 카탈로그에 연결할 수 있는지 확인합니다.
  • 데이터 쿼리: 4부분으로 구성된 PROJECT_ID.CATALOG_NAME.NAMESPACE.TABLE 이름 지정 규칙을 사용하여 BigQuery 또는 Managed Service for Apache Spark를 통해 통합 데이터에 대해 쿼리를 실행합니다. 원하는 경우 페더레이션 카탈로그에서 크로스 클라우드 캐싱을 사용 설정하여 크로스 클라우드 이그레스 비용을 줄이고 후속 쿼리를 가속화할 수 있습니다. 자세한 내용은 원격 데이터 쿼리를 참조하세요.
  • 권한 구성: IAM을 사용하여 제휴 데이터를 보고 쿼리할 수 있는 사용자를 관리합니다.

Cross-Cloud Interconnect 설정 (선택사항)

기본적으로 쿼리 데이터 읽기와 백그라운드 메타데이터 새로고침은 모두 TLS를 사용하여 공개 인터넷을 통해 이동합니다. 네트워크 격리를 강화하고, 예측 가능한 지연 시간을 제공하고, 데이터 전송 비용을 줄이려면 Google CloudVPC 네트워크와 원격 클라우드 네트워크 (AWS VPC) 간에 비공개 상호 연결을 구성하면 됩니다.

다음 Private Interconnect 옵션 중 하나를 프로비저닝할 수 있습니다.

Google Cloud의 Cloud Router와 원격 클라우드 네트워크 간에 BGP 세션을 설정하여 경로 교환을 사용 설정합니다.

보안 및 비용 요구사항에 따라 다음 트래픽 경로 중 하나 또는 둘 다에 대해 Cross-Cloud Interconnect를 통해 비공개 라우팅을 구성할 수 있습니다.

  • 쿼리 전송 (--service-directory-name): BigQuery 또는 오픈소스 엔진의 쿼리 읽기를 원격 객체 스토리지 (Amazon S3)로 라우팅하여 교차 클라우드 이그레스 요금을 낮추고 쿼리 지연 시간을 예측 가능하게 유지합니다.
  • 백그라운드 메타데이터 새로고침(--metadata-service-directory-name): Lakehouse 런타임 카탈로그에서 원격 AWS Glue Data Catalog 비공개 엔드포인트로 컨트롤 플레인 백그라운드 메타데이터 새로고침 및 인증 요청을 라우팅합니다(예: 원격 카탈로그가 공개 인터넷 액세스를 제한하는 경우).

Cross-Cloud Interconnect를 통해 쿼리 전송과 백그라운드 메타데이터 새로고침을 모두 라우팅하는 경우 원격 스토리지 엔드포인트와 원격 카탈로그 엔드포인트에 대해 비공개 엔드포인트, 라우팅, 서비스 디렉터리 서비스 단계를 한 번씩 완료합니다. 두 서비스 디렉터리 서비스는 페더레이션 카탈로그와 동일한 Google Cloud 리전에 있어야 하며 동일한 프록시 전용 서브넷과 서비스 디렉터리 네임스페이스를 공유할 수 있습니다.

두 가지 아키텍처 흐름 중 하나를 사용하여 서비스 디렉터리에서 원격 비공개 엔드포인트로 트래픽을 라우팅할 수 있습니다.

  • 내부 리전 프록시 네트워크 부하 분산기 라우팅: Google Cloud내부 리전 프록시 네트워크 부하 분산기를 사용하여 원격 비공개 엔드포인트 IP 주소 (AWS 탄력적 네트워크 인터페이스 (ENI))를 가리키는 하이브리드 연결 네트워크 엔드포인트 그룹(NEG)에 요청을 분산합니다. 이 흐름은 Partner Cross-Cloud Interconnect에 필요하며 부하 분산, 확장성, 고가용성을 위해 Dedicated Cross-Cloud Interconnect에 권장됩니다.
  • 직접 엔드포인트 라우팅: 서비스 디렉터리를 단일 원격 비공개 엔드포인트 IP 주소에 직접 연결합니다. 이 흐름은 Dedicated Cross-Cloud Interconnect에서만 작동하며 Partner Cross-Cloud Interconnect에서는 지원되지 않습니다.

아키텍처 요구사항과 일치하는 구성 흐름을 선택합니다.

내부 리전 프록시 네트워크 부하 분산기

원격 비공개 엔드포인트 IP 주소에 요청을 분산하는 내부 리전 프록시 네트워크 부하 분산기를 구성하려면 다음 단계를 따르세요.

원격 클라우드 비공개 엔드포인트 구성

Cross-Cloud Interconnect를 통해 Google Cloud VPC 네트워크에 연결되는 원격 네트워크 및 서브넷에 비공개 엔드포인트를 만들고 각 엔드포인트에 할당된 비공개 IP 주소를 기록합니다.

  • 비공개 쿼리 전송 (원격 객체 스토리지): AWS VPC에서 Amazon S3용 인터페이스 VPC 엔드포인트(com.amazonaws.AWS_REGION.s3)를 만들고 프로비저닝된 ENI의 비공개 IP 주소를 기록합니다.
  • 비공개 백그라운드 메타데이터 새로고침 (원격 카탈로그): AWS VPC에서 AWS Glue용 인터페이스 VPC 엔드포인트(com.amazonaws.AWS_REGION.glue)를 만들고 프로비저닝된 ENI의 비공개 IP 주소를 기록합니다.
  • 인바운드 보안 규칙: 비공개 엔드포인트에 연결된 AWS 보안 그룹이 Google Cloud VPC CIDR 범위에서 포트 443의 인바운드 TCP 트래픽을 허용하는지 확인합니다. 상태 점검 및 전달된 트래픽을 허용하려면 Google Cloud 프록시 전용 서브넷의 CIDR 범위를 포함합니다.

Google Cloud 네트워킹 구성

다음 명령어를 실행하여 내부 부하 분산기를 구성합니다. Cross-Cloud Interconnect를 통해 쿼리 전송과 백그라운드 메타데이터 새로고침을 모두 라우팅하는 경우 스토리지 엔드포인트와 카탈로그 엔드포인트에 대해 별도의 백엔드 서비스, 대상 TCP 프록시, 전달 규칙을 구성합니다. 고급 구성은 하이브리드 엔드포인트용 내부 리전 프록시 네트워크 부하 분산기 설정을 참조하세요.

gcloud compute networks subnets create PROXY_SUBNET_NAME \
    --purpose=REGIONAL_MANAGED_PROXY \
    --role=ACTIVE \
    --region=REGION \
    --network=VPC_NETWORK \
    --range=PROXY_SUBNET_RANGE

다음을 바꿉니다.

  • PROXY_SUBNET_NAME: 프록시 전용 서브넷의 이름입니다.
  • PROXY_SUBNET_RANGE: VPC 네트워크 내에서 사용되지 않는 CIDR 범위 (예: 10.129.0.0/23)
  1. 리전 TCP 상태 점검을 만듭니다.

    gcloud compute health-checks create tcp HEALTH_CHECK_NAME \
        --region=REGION \
        --port=443

    다음을 바꿉니다.

    • HEALTH_CHECK_NAME: 상태 점검의 이름입니다.
    • REGION: Google Cloud 리전 (예: us-east4)
  2. 하이브리드 연결 네트워크 엔드포인트 그룹 (NEG)을 만들고 엔드포인트를 추가합니다.

    각 영역에 대해 하이브리드 NEG(NON_GCP_PRIVATE_IP_PORT)를 만듭니다.

    gcloud compute network-endpoint-groups create NEG_NAME \
        --network-endpoint-type=NON_GCP_PRIVATE_IP_PORT \
        --zone=ZONE \
        --network=VPC_NETWORK

    원격 엔드포인트 ENI의 비공개 IP 주소를 하이브리드 NEG에 추가합니다.

    gcloud compute network-endpoint-groups update NEG_NAME \
        --zone=ZONE \
        --add-endpoint="ip=REMOTE_ENDPOINT_IP,port=443"

    다음을 바꿉니다.

    • NEG_NAME: 하이브리드 NEG의 이름입니다.
    • ZONE: Google Cloud 영역 (예: us-east4-a). 이 영역은 Cross-Cloud Interconnect VLAN 연결의 리전 내에 있어야 합니다.
    • VPC_NETWORK: VPC 네트워크의 이름입니다.
    • REMOTE_ENDPOINT_IP: 해당 영역에 있는 원격 스토리지 또는 원격 카탈로그 비공개 엔드포인트의 비공개 IP 주소입니다.

    원격 엔드포인트에 여러 영역에 분산된 비공개 IP 주소가 여러 개 있는 경우 이 명령어를 반복하여 하이브리드 NEG를 만들고 각 영역에 엔드포인트를 추가합니다.

  3. 백엔드 서비스를 만들고 구성합니다.

    내부 관리형 부하 분산을 사용하여 리전 백엔드 서비스를 만듭니다.

    gcloud compute backend-services create BACKEND_SERVICE_NAME \
        --load-balancing-scheme=INTERNAL_MANAGED \
        --protocol=TCP \
        --region=REGION \
        --health-checks=HEALTH_CHECK_NAME \
        --health-checks-region=REGION

    하이브리드 NEG를 백엔드 서비스에 추가합니다.

    gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
        --region=REGION \
        --network-endpoint-group=NEG_NAME \
        --network-endpoint-group-zone=ZONE \
        --balancing-mode=CONNECTION \
        --max-connections=MAX_CONNECTIONS

    다음을 바꿉니다.

    • BACKEND_SERVICE_NAME: 백엔드 서비스의 이름입니다.
    • NEG_NAME: 이전 단계에서 만든 하이브리드 NEG의 이름입니다.
    • ZONE: Google Cloud 영역 (예: us-east4-a)
    • MAX_CONNECTIONS: 백엔드의 최대 동시 연결 수입니다 (예: 100).

    만든 하이브리드 NEG마다 add-backend 명령어를 반복합니다.

  4. 부하 분산기 프런트엔드를 구성합니다.

    대상 TCP 프록시를 만듭니다.

    gcloud compute target-tcp-proxies create TARGET_PROXY_NAME \
        --backend-service=BACKEND_SERVICE_NAME \
        --region=REGION

    대상 프록시로 트래픽을 라우팅하는 전달 규칙을 만듭니다.

    gcloud compute forwarding-rules create FORWARDING_RULE_NAME \
        --load-balancing-scheme=INTERNAL_MANAGED \
        --network=VPC_NETWORK \
        --subnet=VPC_SUBNET \
        --ports=443 \
        --region=REGION \
        --target-tcp-proxy=TARGET_PROXY_NAME \
        --target-tcp-proxy-region=REGION \
        --allow-global-access

    다음을 바꿉니다.

    • TARGET_PROXY_NAME: 대상 프록시의 이름입니다.
    • FORWARDING_RULE_NAME: 전달 규칙의 이름입니다.
    • VPC_SUBNET: VPC 서브네트워크의 이름입니다.

부하 분산기의 전달 규칙을 만든 후 여기에 할당된 내부 IP 주소를 확인합니다. ILB_IP_ADDRESS입니다.

서비스 디렉터리 구성

Lakehouse가 비공개로 검색하고 라우팅할 수 있도록 서비스 디렉터리에 내부 부하 분산기의 IP 주소를 등록합니다. 쿼리 전송 및 백그라운드 메타데이터 새로고침을 위해 별도의 부하 분산기 전달 규칙을 구성한 경우 각 전달 규칙 IP 주소에 대해 별도의 서비스 디렉터리 서비스 및 엔드포인트를 만듭니다.

  1. 원격 비공개 엔드포인트의 네임스페이스를 만듭니다.

    gcloud service-directory namespaces create NAMESPACE \
        --project=PROJECT_ID \
        --location=REGION

    다음을 바꿉니다.

    • NAMESPACE: 네임스페이스의 고유 식별자입니다.
    • PROJECT_ID: Google Cloud 프로젝트 ID입니다.
    • REGION: Google Cloud 리전 (예: us-east4). 제휴 카탈로그와 동일한 리전이어야 합니다.
  2. 서비스 디렉터리 네임스페이스에서 서비스를 만듭니다.

    gcloud service-directory services create SERVICE_NAME \
        --namespace=NAMESPACE \
        --project=PROJECT_ID \
        --location=REGION

    다음을 바꿉니다.

    • SERVICE_NAME: 서비스의 고유 식별자(백그라운드 메타데이터 새로고침 엔드포인트를 등록할 때 별도의 서비스 이름(예: METADATA_SERVICE_NAME)을 만듭니다).
  3. 서비스에서 부하 분산기 전달 규칙의 엔드포인트를 만듭니다.

    gcloud service-directory endpoints create ENDPOINT_NAME \
        --project=PROJECT_ID \
        --namespace=NAMESPACE \
        --service=SERVICE_NAME \
        --location=REGION \
        --network=projects/PROJECT_NUMBER/global/networks/VPC_NETWORK \
        --address=ILB_IP_ADDRESS \
        --port=443

    다음을 바꿉니다.

    • ENDPOINT_NAME: 엔드포인트의 고유 식별자입니다.
    • PROJECT_NUMBER: Google Cloud프로젝트 번호 --network 플래그에 프로젝트 번호를 사용합니다.
    • ILB_IP_ADDRESS: 부하 분산기 전달 규칙의 내부 IP 주소입니다.

직접 엔드포인트

Dedicated Cross-Cloud Interconnect를 통해 단일 원격 비공개 엔드포인트 IP 주소로 트래픽을 직접 라우팅하도록 서비스 디렉터리를 구성하려면 다음 단계를 따르세요.

  1. 원격 클라우드 네트워크에서 비공개 엔드포인트를 만듭니다.

    각 엔드포인트의 비공개 IP 주소와 포트 (443)를 기록하고 AWS 보안 그룹이 Google Cloud VPC 네트워크에서 포트 443의 인바운드 TCP 트래픽을 허용하는지 확인합니다.

  2. 원격 비공개 엔드포인트의 네임스페이스를 만듭니다.

    gcloud service-directory namespaces create NAMESPACE \
        --project=PROJECT_ID \
        --location=REGION

    다음을 바꿉니다.

    • NAMESPACE: 네임스페이스의 고유 식별자입니다.
    • PROJECT_ID: Google Cloud 프로젝트 ID입니다.
    • REGION: Google Cloud 리전 (예: us-east4). 제휴 카탈로그와 동일한 리전이어야 합니다.
  3. 서비스 디렉터리 네임스페이스에 서비스를 만듭니다 (쿼리 전송과 백그라운드 메타데이터 새로고침을 모두 비공개로 라우팅하는 경우 각 엔드포인트에 대해 별도의 서비스를 만듭니다).

    gcloud service-directory services create SERVICE_NAME \
        --namespace=NAMESPACE \
        --project=PROJECT_ID \
        --location=REGION

    다음을 바꿉니다.

    • SERVICE_NAME: 서비스의 고유 식별자(백그라운드 메타데이터 새로고침 엔드포인트를 등록할 때 별도의 서비스 이름(예: METADATA_SERVICE_NAME)을 만듭니다).
  4. 원격 비공개 엔드포인트의 비공개 IP 주소와 포트를 사용하여 서비스에 엔드포인트를 만듭니다.

    gcloud service-directory endpoints create ENDPOINT_NAME \
        --service=SERVICE_NAME \
        --namespace=NAMESPACE \
        --project=PROJECT_ID \
        --location=REGION \
        --address=REMOTE_ENDPOINT_IP \
        --port=REMOTE_ENDPOINT_PORT \
        --network=projects/PROJECT_NUMBER/global/networks/VPC_NETWORK

    다음을 바꿉니다.

    • ENDPOINT_NAME: 엔드포인트의 고유 식별자입니다.
    • REMOTE_ENDPOINT_IP: 원격 스토리지 또는 원격 카탈로그 비공개 엔드포인트의 비공개 IP 주소 (예: 10.0.1.45)
    • REMOTE_ENDPOINT_PORT: 원격 비공개 엔드포인트의 포트 번호입니다 (예: 443).
    • PROJECT_NUMBER: Google Cloud프로젝트 번호 --network 플래그에 프로젝트 번호를 사용합니다.
    • VPC_NETWORK: Private Interconnect와 연결된 Google CloudVPC 네트워크 이름입니다.

제휴 설정

데이터를 쿼리하려면 원격 AWS Glue Data Catalog에 연결되는 Lakehouse 페더레이션 카탈로그를 설정해야 합니다.

자리표시자 트러스트 정책으로 AWS IAM 역할 만들기

Lakehouse는 카탈로그 생성 후 Google 서비스 계정 ID를 프로비저닝합니다. 자리표시자 트러스트 정책으로 AWS IAM 역할을 만듭니다.

  1. trust_policy.json이라는 파일을 만듭니다.

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Federated": "accounts.google.com"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "accounts.google.com:aud": [
                "PLACEHOLDER_VALUE"
              ],
              "accounts.google.com:sub": [
                "PLACEHOLDER_VALUE"
              ]
            }
          }
        }
      ]
    }
  2. AWS CLI 명령어를 실행하여 자리표시자 트러스트 정책으로 역할을 만듭니다. 장기 실행 작업 중에 사용자 인증 정보가 만료되는 것을 방지하려면 최대 세션 시간을 12시간 (43200초)으로 설정하는 것이 좋습니다.

    aws iam create-role \
      --role-name AWS_ROLE_NAME \
      --assume-role-policy-document file://trust_policy.json \
      --max-session-duration 43200

    다음을 바꿉니다.

    • AWS_ROLE_NAME: AWS IAM 역할의 이름입니다. 예를 들면 lakehouse_glue_federation_role입니다.

권한 정책 연결

Lakehouse가 AWS 리전의 Glue Data Catalog 및 S3 버킷에 액세스할 수 있도록 하는 권한 정책을 IAM 역할에 연결합니다. 이 정책은 AWS Lake Formation S3 테이블 통합을 사용하는 경우 S3 테이블 버킷에 대한 액세스 권한도 부여합니다. 기본 AWS Glue 데이터 권한에서 AWS Lake Formation 모델로 업그레이드한 경우 Lake Formation에서 추가 권한을 부여해야 할 수 있습니다.

  1. 다음 정책 구성으로 permissions_policy.json이라는 파일을 만듭니다.

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "GlueRead",
          "Effect": "Allow",
          "Action": [
            "glue:GetCatalog",
            "glue:GetDatabase",
            "glue:GetDatabases",
            "glue:GetTable",
            "glue:GetTables"
          ],
          "Resource": "arn:aws:glue:AWS_REGION:AWS_ACCOUNT_ID:*"
        },
        {
          "Sid": "S3Read",
          "Effect": "Allow",
          "Action": [
            "s3:ListBucket",
            "s3:GetObject"
          ],
          "Resource": [
            "arn:aws:s3:::*"
          ]
        },
        {
          "Sid": "S3TablesRead",
          "Effect": "Allow",
          "Action": [
            "s3tables:GetTableBucket",
            "s3tables:ListNamespaces",
            "s3tables:GetNamespace",
            "s3tables:ListTables",
            "s3tables:GetTable",
            "s3tables:GetTableMetadataLocation",
            "s3tables:GetTableData"
          ],
          "Resource": [
            "arn:aws:s3tables:AWS_REGION:AWS_ACCOUNT_ID:*"
          ]
        }
      ]
    }

    AWS Key Management Service(KMS)에 호스팅된 고객 관리 키를 사용하여 AWS Glue, Amazon S3 또는 Amazon S3 테이블 리소스를 암호화하는 경우 리소스를 복호화할 수 있는 KMS 키 액세스 권한을 부여하는 문을 추가해야 합니다.

    # ...
    {
      "Sid": "GlueS3S3TablesKmsDecrypt",
      "Effect": "Allow",
      "Action": [
          "kms:Decrypt"
      ],
      "Resource": [
          "arn:aws:kms:AWS_REGION:AWS_ACCOUNT_ID:key/key_id_for_glue",
          "arn:aws:kms:AWS_REGION:AWS_ACCOUNT_ID:key/key_id_for_s3",
          "arn:aws:kms:AWS_REGION:AWS_ACCOUNT_ID:key/key_id_for_s3_tables"
      ]
    }
    # ...
  2. 이 권한 정책을 IAM 역할에 연결합니다.

    aws iam put-role-policy \
      --role-name AWS_ROLE_NAME \
      --policy-name AWS_POLICY_NAME \
      --policy-document file://permissions_policy.json

    다음을 바꿉니다.

    • AWS_ROLE_NAME: AWS IAM 역할의 이름입니다. 예를 들면 lakehouse_glue_federation_role입니다.
    • AWS_POLICY_NAME: 권한 정책의 이름입니다. 예를 들면 lakehouse_glue_federation_policy입니다.
    • AWS_REGION: Glue 카탈로그 또는 S3 테이블이 있는 AWS 리전입니다. 예를 들면 us-east-1입니다.
    • AWS_ACCOUNT_ID: 12자리 AWS 계정 ID 문자열입니다. 예를 들면 123456789012입니다.

페더레이션 카탈로그 만들기

Google Cloud 콘솔 또는 Google Cloud CLI를 사용하여 페더레이션 카탈로그를 만듭니다.

AWS 트러스트 관계가 전파되는 동안 백그라운드 메타데이터 새로고침이 너무 일찍 실행되어 실패하는 것을 방지하려면 새로고침 일정을 지정하지 않고 카탈로그를 초기화합니다 (기본값은 0s).

콘솔

페더레이션 카탈로그를 만들려면 다음 안내를 따르세요.

  1. Google Cloud 콘솔에서 Lakehouse로 이동합니다.

    레이크하우스로 이동

  2. 카탈로그 만들기를 클릭합니다.

  3. 페더레이션 카탈로그를 클릭합니다.

    카탈로그 구성 섹션이 표시됩니다.

  4. 페더레이션 카탈로그 소스에서 AWS Glue를 선택합니다.

  5. 데이터 위치에서 페더레이션 카탈로그를 만들 Lakehouse 리전을 선택합니다. 예를 들면 us-east4입니다. 공개 인터넷을 통해서도 지연 시간을 최소화하려면 AWS 리전과 가장 가까운 Google Cloud 리전을 선택하세요.

  6. 계속을 클릭합니다.

    연결 세부정보 섹션이 표시됩니다.

  7. 원격 카탈로그 세부정보 섹션의 AWS 웨어하우스 필드에 AWS 계정 ID 또는 S3 테이블 버킷 카탈로그를 입력합니다. 예를 들면 123456789012 또는 123456789012:s3tablescatalog/my-table-bucket입니다.

  8. AWS 리전 필드에 AWS 리전을 입력합니다. 예를 들면 us-east-1입니다.

  9. AWS 역할 ARN 필드에 AWS 역할 ARN을 입력합니다. arn:aws:iam::AWS_ACCOUNT_ID:role/AWS_ROLE_NAME 형식을 사용합니다.

  10. 전송 계층에서 공개 인터넷(기본값) 또는 전용 비공개 상호 연결을 선택합니다. Dedicated Private Interconnect를 선택한 경우 다음 필드를 구성합니다.

    • 서비스 디렉터리 이름 필드에 전송 서비스 디렉터리 서비스의 경로를 projects/PROJECT_ID/locations/REGION/namespaces/SERVICE_DIRECTORY_NAMESPACE/services/SERVICE_NAME 형식으로 입력합니다.
    • 선택사항: Cross-Cloud Interconnect를 통해 카탈로그 메타데이터를 비공개로 동기화하려면 메타데이터 서비스 디렉터리 이름 필드에 메타데이터 서비스 디렉터리 서비스의 경로를 projects/PROJECT_ID/locations/REGION/namespaces/METADATA_SERVICE_DIRECTORY_NAMESPACE/services/METADATA_SERVICE_NAME 형식으로 입력합니다.
  11. 만들기를 클릭합니다.

기존 페더레이션 카탈로그에서 전송 계층, 서비스 디렉터리 이름 또는 메타데이터 서비스 디렉터리 이름을 업데이트하려면 Lakehouse에서 카탈로그를 열고 카탈로그 수정을 클릭하고 필드를 수정한 후 저장을 클릭합니다.

gcloud

공개 인터넷(CCI 없음)

Cross-Cloud Interconnect를 구성하지 않으면 연결은 TLS를 사용하여 공개 인터넷을 통해 이동합니다.

gcloud biglake iceberg catalogs create FEDERATED_CATALOG_NAME \
    --project="PROJECT_ID" \
    --primary-location="REGION" \
    --catalog-type="federated" \
    --federated-catalog-type="glue" \
    --glue-warehouse="GLUE_OR_S3_TABLE_BUCKET_WAREHOUSE" \
    --glue-aws-region="AWS_REGION" \
    --glue-aws-role-arn="arn:aws:iam::AWS_ACCOUNT_ID:role/AWS_ROLE_NAME" \
    --namespace-filters="NAMESPACE_FILTERS" \
    --cross-cloud-cache="CROSS_CLOUD_CACHE_MODE"

고객 소유(CCI)

비공개 상호 연결 (Dedicated 또는 Partner Cross-Cloud Interconnect)을 구성한 경우 비공개 쿼리 전송 (--service-directory-name), 비공개 백그라운드 메타데이터 새로고침 (--metadata-service-directory-name) 또는 둘 다에 대한 서비스 디렉터리 서비스 참조를 제공합니다. gcloud biglake iceberg catalogs update를 실행하여 기존 카탈로그에서 플래그를 추가하거나 업데이트할 수도 있습니다.

gcloud biglake iceberg catalogs create FEDERATED_CATALOG_NAME \
    --project="PROJECT_ID" \
    --primary-location="REGION" \
    --catalog-type="federated" \
    --federated-catalog-type="glue" \
    --glue-warehouse="GLUE_OR_S3_TABLE_BUCKET_WAREHOUSE" \
    --glue-aws-region="AWS_REGION" \
    --glue-aws-role-arn="arn:aws:iam::AWS_ACCOUNT_ID:role/AWS_ROLE_NAME" \
    --namespace-filters="NAMESPACE_FILTERS" \
    --cross-cloud-cache="CROSS_CLOUD_CACHE_MODE" \
    --service-directory-name="projects/PROJECT_ID/locations/REGION/namespaces/SERVICE_DIRECTORY_NAMESPACE/services/SERVICE_NAME" \
    --metadata-service-directory-name="projects/PROJECT_ID/locations/REGION/namespaces/METADATA_SERVICE_DIRECTORY_NAMESPACE/services/METADATA_SERVICE_NAME"

다음을 바꿉니다.

  • FEDERATED_CATALOG_NAME: 페더레이션 카탈로그의 이름입니다.
  • PROJECT_ID: Google Cloud 프로젝트 ID입니다.
  • REGION: 페더레이션 카탈로그가 생성되는 Lakehouse 리전입니다. 서비스 디렉터리 네임스페이스 및 리전 보안 비밀과 동일한 리전이어야 합니다.
  • GLUE_OR_S3_TABLE_BUCKET_WAREHOUSE: 대상 웨어하우스 카탈로그 식별자입니다. AWS 리전의 Glue Data Catalog의 경우 12자리 AWS 계정 ID 문자열을 입력합니다. 예를 들면 123456789012입니다. 리전에서 S3 테이블 버킷을 사용하려면 AWS_ACCOUNT_ID:s3tablescatalog/S3_TABLE_BUCKET를 입력합니다. 예를 들면 123456789012:s3tablescatalog/my-table-bucket입니다.
  • AWS_ACCOUNT_ID: 12자리 AWS 계정 ID 문자열입니다. 예를 들면 123456789012입니다.
  • AWS_REGION: Glue 카탈로그 또는 S3 테이블 버킷이 있는 AWS 리전입니다. 예를 들면 us-east-1입니다.
  • AWS_ROLE_NAME: AWS IAM 역할의 이름입니다. 예를 들면 lakehouse_glue_federation_role입니다.
  • NAMESPACE_FILTERS: (선택사항) 제휴할 네임스페이스의 쉼표로 구분된 목록입니다. 예를 들면 ns1,ns2입니다. 생략하면 Lakehouse에 모든 네임스페이스가 포함됩니다.
  • CROSS_CLOUD_CACHE_MODE: (선택사항) 페더레이션 카탈로그에서 크로스 클라우드 캐싱을 사용 설정할지 여부입니다(enabled 또는 disabled). 기본값은 disabled입니다. enabled로 설정하면 Lakehouse는 카탈로그의Google Cloud 리전에 원격 파일을 캐시합니다. 자세한 내용은 지능형 캐싱을 참조하세요.
  • 비공개 상호 연결(Cross-Cloud Interconnect)을 사용하는 경우 다음 서비스 디렉터리 참조 중 하나 또는 둘 다를 지정합니다 (Cross-Cloud Interconnect를 통해 해당 트래픽 레이어를 라우팅하지 않는 경우 두 플래그 중 하나를 생략).
    • SERVICE_DIRECTORY_NAMESPACE 및 SERVICE_NAME: 원격 객체 스토리지로의 비공개 쿼리 전송을 위해 만든 서비스 디렉터리 네임스페이스 및 서비스 이름입니다.
    • METADATA_SERVICE_DIRECTORY_NAMESPACE 및 METADATA_SERVICE_NAME: 비공개 백그라운드 메타데이터 새로고침을 위해 만든 서비스 디렉터리 네임스페이스 및 서비스 이름입니다.

트러스트 정책 업데이트

카탈로그가 생성되면 Lakehouse는 카탈로그에 대한 고유한 서비스 계정을 프로비저닝하며, 이 계정은 카탈로그 생성 응답에서 biglake-service-account-id 필드로 반환됩니다. 이 서비스 계정을 사용하여 트러스트 관계를 설정합니다.

  1. 다음 명령어를 실행하여 biglake-service-account-id 값을 활성 bash 변수로 추출합니다.

    LAKEHOUSE_SA_ID=$(gcloud biglake iceberg catalogs describe FEDERATED_CATALOG_NAME \
      --project="PROJECT_ID" \
      --format="value(biglake-service-account-id)")
  2. AWS IAM 역할의 신뢰 정책을 업데이트하여 자리표시자를 확인된 Google 서비스 에이전트 ID로 바꿉니다. 조건 블록은 sub 및 aud 일치를 모두 검사합니다. trust_policy_comprehensive.json 파일에 정책을 작성합니다.

    cat > trust_policy_comprehensive.json << EOF
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Federated": "accounts.google.com"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "accounts.google.com:aud": [
                "$LAKEHOUSE_SA_ID"
              ],
              "accounts.google.com:sub": [
                "$LAKEHOUSE_SA_ID"
              ]
            }
          }
        }
      ]
    }
    EOF
  3. 완료된 정책을 AWS 역할에 적용합니다.

    aws iam update-assume-role-policy \
      --role-name AWS_ROLE_NAME \
      --policy-document file://trust_policy_comprehensive.json

백그라운드 메타데이터 새로고침 사용 설정

이제 두 플랫폼 모두에서 보안 신뢰 관계가 성공적으로 설정되었으므로 카탈로그를 업데이트하여 백그라운드 메타데이터 새로고침 (5분마다 또는 300s 이상)을 활성화합니다.

gcloud

gcloud biglake iceberg catalogs update FEDERATED_CATALOG_NAME \
  --project="PROJECT_ID" \
  --refresh-interval="300s"

REST

curl -s -X PATCH \
  -H "x-goog-user-project: PROJECT_ID" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  "https://biglake.googleapis.com/iceberg/v1/restcatalog/extensions/projects/PROJECT_ID/catalogs/FEDERATED_CATALOG_NAME?updateMask=federated_catalog_options.refresh_options.refresh_schedule" \
  -d '{
    "federated_catalog_options": {
      "refresh_options": {
        "refresh_schedule": {
          "refresh_interval": "300s"
        }
      }
    }
  }'

비공개 상호 연결 설정 완료(Cross-Cloud Interconnect만 해당)

비공개 상호 연결 (Dedicated 또는 Partner Cross-Cloud Interconnect)을 통해 쿼리 전송, 백그라운드 메타데이터 새로고침 또는 둘 다를 라우팅하는 경우 Lakehouse 카탈로그 서비스 계정에 서비스 디렉터리를 통해 연결을 검색하고 승인할 수 있는 권한을 부여해야 합니다. 전송 서비스 디렉터리 서비스와 메타데이터 서비스 디렉터리 서비스가 서로 다른 Google Cloud 프로젝트에서 호스팅되는 경우 서비스 디렉터리 서비스를 호스팅하는 각 프로젝트에 이러한 역할을 부여합니다.

콘솔

  1. Google Cloud 콘솔에서 IAM 페이지로 이동합니다.

    IAM으로 이동

  2. 액세스 권한 부여 (또는 추가)를 클릭합니다.

  3. 새 주 구성원 필드에 Lakehouse 카탈로그 서비스 계정 이메일 주소를 입력합니다. 카탈로그를 설명하여 이 이메일 주소를 검색할 수 있습니다(gcloud 탭 참조).

  4. 역할 메뉴에서 서비스 디렉터리 뷰어(roles/servicedirectory.viewer)를 선택합니다.

  5. 다른 역할 추가를 클릭한 후 서비스 디렉터리 PSC 승인 서비스 (roles/servicedirectory.pscAuthorizedService)를 선택합니다.

  6. 저장을 클릭합니다.

gcloud

서비스 디렉터리 서비스를 호스팅하는 프로젝트의 카탈로그 서비스 계정에 필요한 역할을 부여합니다.

# Grant Service Directory Viewer
gcloud projects add-iam-policy-binding PROJECT_ID \
--member="serviceAccount:$(gcloud biglake iceberg catalogs describe FEDERATED_CATALOG_NAME \
    --project="PROJECT_ID" \
    --format='value(biglake-service-account)')" \
--role="roles/servicedirectory.viewer"

# Grant Service Directory PSC Authorized Service
gcloud projects add-iam-policy-binding PROJECT_ID \
--member="serviceAccount:$(gcloud biglake iceberg catalogs describe FEDERATED_CATALOG_NAME \
    --project="PROJECT_ID" \
    --format='value(biglake-service-account)')" \
--role="roles/servicedirectory.pscAuthorizedService"

연결 확인하기

카탈로그 백그라운드 메타데이터 새로고침 주기가 성공적으로 완료되고 네임스페이스가 동기화되었는지 확인합니다.

  1. 새로고침 상태가 성공으로 표시되는지 확인합니다.

    gcloud biglake iceberg catalogs describe FEDERATED_CATALOG_NAME \
      --project="PROJECT_ID"
  2. 네임스페이스가 동기화되었는지 확인합니다.

    gcloud biglake iceberg namespaces list \
      --project="PROJECT_ID" \
      --catalog="FEDERATED_CATALOG_NAME"

다음 단계