BigQuery AWS 연결 만들기

BigQuery Omni는 연결을 통해 Amazon S3 데이터에 액세스합니다. 각 연결에는 고유한 Amazon Web Services(AWS) ID 및 액세스 관리(IAM) 사용자가 있습니다. AWS IAM 역할을 통해 사용자에게 권한을 부여합니다. AWS IAM 역할의 정책에 따라 BigQuery가 각 연결에서 액세스할 수 있는 데이터가 결정됩니다.

시작하기 전에

다음 리소스를 만들었는지 확인합니다.

BigQuery용 AWS IAM 역할 만들기

Amazon S3의 보안 권장사항을 따르세요. 다음을 수행하는 것이 좋습니다.

  • HTTP를 통해 S3 버킷에 액세스하지 못하도록 하는 AWS 정책을 설정합니다.
  • S3 버킷에 대한 공개 액세스를 방지하는 AWS 정책을 설정합니다.
  • S3 서버 측 암호화를 사용합니다.
  • Google 계정에 부여되는 권한을 필요한 최소 수준으로 제한합니다.
  • CloudTrails를 설정하고 S3 데이터 이벤트를 사용 설정합니다.

AWS IAM 역할을 만들려면 다음 단계를 따르세요.

  1. AWS Identity and Access Management(IAM) 콘솔로 이동합니다. 액세스하려는 S3 버킷을 소유한 계정에 로그인되어 있는지 확인합니다.
  2. 역할 > 역할 만들기를 선택합니다.
  3. Select type of trusted entity(신뢰할 수 있는 기관 유형 선택)에서 Another AWS account(다른 AWS 계정)를 선택합니다.
  4. Account ID(계정 ID)에 AWS 계정의 숫자 ID를 입력합니다. 나중에 이 값을 연결의 AWS IAM 사용자 ID 번호로 바꿉니다.
  5. Require External ID(외부 ID 필요)를 선택하고 자리표시자 값으로 00000을 입력합니다. 나중에 이 값을 연결의 외부 ID로 바꿉니다.
  6. Next: Permissions(다음: 권한)를 클릭합니다.
  7. AWS 데이터에 대한 액세스 권한을 역할에 부여하려면 IAM 정책을 만들어 역할에 연결합니다. 예를 들어 버킷에 대한 읽기 전용 액세스 권한을 제공하는 IAM 정책을 만듭니다.

    1. Policies(정책) > Create policy(정책 만들기)를 선택합니다(새 탭에서 열림).
    2. JSON을 클릭하고 다음을 편집기에 붙여넣습니다.
    {
    "Version": "2012-10-17",
    "Statement": [
      {
        "Effect": "Allow",
        "Action": ["s3:ListBucket"],
        "Resource": ["arn:aws:s3:::BUCKET_NAME"]
      },
      {
        "Effect": "Allow",
        "Action": [
          "s3:GetObject"
        ],
        "Resource": ["arn:aws:s3:::BUCKET_NAME/*"]
      }
    ]
    }
    

    다음을 바꿉니다.

    • BUCKET_NAME: BigQuery에서 액세스하도록 할 S3 버킷입니다.
  8. Name(이름) 필드에 정책 이름을 입력합니다.

  9. S3 액세스 정책을 만들려면 Create policy(정책 만들기)를 클릭합니다.

  10. 역할에 정책을 연결하려면 Create role(역할 만들기) 탭에서 정책을 선택합니다.

  11. Name(이름) 필드에 역할 이름을 입력합니다.

  12. Create role(역할 만들기)을 클릭합니다.

정책은 다음 형식의 Amazon 리소스 이름(ARN)을 사용하여 생성됩니다.

  arn:aws:iam::AWS_ACCOUNT_ID:role/ROLE_NAME
  

다음을 바꿉니다.

  • AWS_ACCOUNT_ID: 연결의 AWS IAM 사용자 ID 번호입니다.
  • ROLE_NAME: 선택한 역할 이름입니다.

데이터를 Amazon S3 버킷으로 내보내야 하는 경우에는 s3:PutObject 권한도 필요합니다. 액세스 제어를 분리하려면 별도의 AWS IAM 역할로 다른 연결을 만들고 해당 역할에 쓰기 전용 액세스 권한을 부여하는 것이 좋습니다. 액세스를 더 세부적으로 제어하려면 버킷의 특정 경로로 역할의 액세스 권한을 제한할 수도 있습니다.

BigQuery AWS 연결 만들기

BigQuery AWS 연결을 만들려면 Cloud Console, bq 명령줄 도구 또는 클라이언트 라이브러리를 사용합니다.

Console

  1. 연결 리소스를 만들려면 Cloud Console에서 BigQuery 페이지로 이동합니다.

    BigQuery 페이지로 이동

  2. 데이터 추가 메뉴에서 외부 데이터 소스를 선택합니다.

  3. 외부 데이터 소스 창에서 다음 정보를 입력합니다.

    • 연결 유형AWS를 선택합니다.
    • 연결 ID에는 연결 리소스의 식별자를 입력합니다. 문자, 숫자, 대시, 밑줄을 사용할 수 있습니다.
    • 연결 위치에서 aws-us-east-1을 선택합니다.
    • 선택사항: 별칭에 사용자 친화적인 연결 이름(예: My connection resource)을 입력합니다. 사용자 친화적인 이름으로 나중에 수정해야 하는 경우 연결 리소스를 식별하는 데 도움이 되는 모든 값을 사용할 수 있습니다.
    • 선택사항: 설명에 이 연결 리소스에 대한 설명을 입력합니다.
    • AWS 역할 ID에 생성한 전체 IAM 역할 ID를 arn:aws:iam:: AWS_ACCOUNT_ID:role/ROLE_NAME 형식으로 입력합니다.
  4. 연결 만들기를 클릭합니다. 명령줄은 다음 출력을 표시합니다.

        IAM user: USER_ID
        External Id: EXTERNAL_ID
      

    출력에는 다음이 포함됩니다.

    • USER_ID: Google Cloud가 각 연결과 관련하여 제어하는 AWS 사용자입니다.
    • EXTERNAL_ID: 각 연결에 할당되는 고유한 문자열입니다.

      USER_IDEXTERNAL_ID 값을 기록해 둡니다.

bq

bq mk --connection --connection_type='AWS' \
--iam_role_id=arn:aws:iam::AWS_ACCOUNT_ID:role/ROLE_NAME \
--location=AWS_LOCATION \
CONNECTION_NAME

다음을 바꿉니다.

  • AWS_ACCOUNT_ID: 연결의 AWS IAM 사용자 ID 번호입니다.
  • ROLE_NAME: 선택한 역할 정책 이름입니다.
  • AWS_LOCATION: Google Cloud의 AWS 위치입니다. aws-us-east-1로 설정해야 합니다.
  • CONNECTION_NAME: 이 연결 리소스에 지정한 이름입니다.

명령줄은 다음 출력을 표시합니다.

  IAM user: USER_ID
  External Id: EXTERNAL_ID

출력에는 다음이 포함됩니다.

  • USER_ID: Google Cloud가 각 연결과 관련하여 제어하는 AWS 사용자입니다.
  • EXTERNAL_ID: 각 연결에 할당되는 고유한 문자열입니다.

USER_IDEXTERNAL_ID 값을 기록해 둡니다.

자바

import com.google.cloud.bigquery.connection.v1.AwsCrossAccountRole;
import com.google.cloud.bigquery.connection.v1.AwsProperties;
import com.google.cloud.bigquery.connection.v1.Connection;
import com.google.cloud.bigquery.connection.v1.CreateConnectionRequest;
import com.google.cloud.bigquery.connection.v1.LocationName;
import com.google.cloud.bigqueryconnection.v1.ConnectionServiceClient;
import java.io.IOException;

// Sample to create aws connection
public class CreateAwsConnection {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "MY_PROJECT_ID";
    // Note: As of now location only supports aws-us-east-1
    String location = "MY_LOCATION";
    String connectionId = "MY_CONNECTION_ID";
    // Example of role id arn:aws:iam::accountId:role/myrole
    String iamRoleId = "MY_AWS_ROLE_ID";
    AwsCrossAccountRole role = AwsCrossAccountRole.newBuilder().setIamRoleId(iamRoleId).build();
    AwsProperties awsProperties = AwsProperties.newBuilder().setCrossAccountRole(role).build();
    Connection connection = Connection.newBuilder().setAws(awsProperties).build();
    createAwsConnection(projectId, location, connectionId, connection);
  }

  public static void createAwsConnection(
      String projectId, String location, String connectionId, Connection connection)
      throws IOException {
    try (ConnectionServiceClient client = ConnectionServiceClient.create()) {
      LocationName parent = LocationName.of(projectId, location);
      CreateConnectionRequest request =
          CreateConnectionRequest.newBuilder()
              .setParent(parent.toString())
              .setConnection(connection)
              .setConnectionId(connectionId)
              .build();
      Connection response = client.createConnection(request);
      AwsCrossAccountRole role = response.getAws().getCrossAccountRole();
      System.out.println(
          "Aws connection created successfully : Aws userId :"
              + role.getIamUserId()
              + " Aws externalId :"
              + role.getExternalId());
    }
  }
}

AWS 역할에 트러스트 관계 추가

트러스트 관계를 사용하면 BigQuery AWS 연결이 역할을 가정하고 역할 정책에 지정된 S3 데이터에 액세스할 수 있습니다.

트러스트 관계 추가:

  1. AWS IAM 콘솔로 이동합니다. 액세스하려는 S3 버킷을 소유한 계정에 로그인되어 있는지 확인합니다.
  2. Roles(역할)를 선택합니다.
  3. 만든 ROLE_NAME을 선택합니다.
  4. Maximum CLI/API session duration(최대 CLI/API 세션 시간)12 시간으로 설정합니다.
  5. Trust Relationships(트러스트 관계)를 선택하고 Edit trust relationship(트러스트 관계 수정)을 클릭합니다. 정책 콘텐츠를 다음으로 바꿉니다.

    {
    "Version": "2012-10-17",
    "Statement": [{
        "Effect": "Allow",
        "Principal": {
          "AWS": "GOOGLE_AWS_USER"
        },
        "Action": "sts:AssumeRole",
        "Condition": {
          "StringEquals": {
            "sts:ExternalId": "EXTERNAL_ID"
          }
        }
    }]
    }
    
  6. Update Trust Policy(트러스트 정책 업데이트)를 클릭합니다.

이제 연결을 사용할 수 있습니다.

다음 단계

  • 연결 작업에 대한 자세한 내용은 연결 작업을 참조하세요.