티스토리 뷰

개발/Cloud (GCP)

BigQuery Omni with AWS

Jaeyeon Baek 2023. 2. 13. 20:56

Google Cloud Platform(GCP)하면 역시 빅쿼리(BigQuery)를 빼놓을 수 없습니다. 타사 어떤 DW(Data Warehouse)와 비교해도 더 우수한 성능을 자랑하며 사용성도 뛰어나니까요. 실례로 Redshift는 파티셔닝을 지원하지 않아서 데이터 관리에 불편함이 있는데 빅쿼리는 이를 지원합니다. 혹자는 Redshift는 데이터/비즈니스에 맞게 튜닝을 해야 성능이 나오지만 빅쿼리는 그냥 그 상태로 성능을 낸다고도 합니다.

각설하고, DW 때문에 혹은 빅쿼리의 강력함 때문에 AWS에 쌓아둔 데이터를 Google Cloud에 Cloud Storage로 옮기려고 하시는 분들도 계신데요. 이런 상황을 타개하기 위해 빅쿼리 옴니(BigQuery Omni)를 사용할 수 있습니다. 빅쿼리 옴니는 다양한 데이터 소스로부터 쿼리를 지원합니다. "빅쿼리가 아무리 뛰어나다고 한 들 클라우드를 넘어서면 성능이 떨어지는거 아냐?" 라고 생각하실 수 있는데요. 구글은 AWS의 인프라 일부를 빅쿼리를 위해 사용합니다. 임대해버린거죠. 사실상 AWS 리소스를 컴퓨팅 자원으로 사용하기 때문에 지연은 크게 느끼지 못하실겁니다.

BigQuery Omni

 

위에 그림은 빅쿼리 옴니의 구조를 이해하기 위해 좋지만, 어렵게 느껴지실 수 있습니다. 그렇다면 아래 이미지를 봐주세요. 훨씬 더 추상화된 이미지입니다. BigQuery control plane이 각 클라우드사에 빅쿼리 컴퓨트 클러스터를 보여하고 데이터를 핸들링하는 구조입니다. 이건 마치 Kubernetes에 control plane 느낌이죠.

AWS, Azure 지원

 

자, 그럼 AWS와 연동해서 실제 동작하는 예제를 살펴보겠습니다. AWS와 빅쿼리 연동이므로 두 개의 클라우드 화면이 모두 첨부되어 있으니 헷갈리지 않도록 잘 따라오셔야 합니다. 먼저 빅쿼리에서 사용할 AWS의 IAM(Identity and Access Management)을 생성해줍니다. 여기서는 적당히 BigqueryOmniAccess라는 이름을 지어줬습니다. 생성하고 아래 화면에 ARN을 뒤쪽에서 사용할 것이니 확인해주세요.

AWS에서 BigqueryOmniAccess 라는 IAM을 생성

 

그리고 Add permissions에서 Create inline policy를 통해 아래와 같은 Json 타입의 권한을 추가해줍니다. 아래 파일에서 bigquery-omni-test-bucket 은 각자의 환경에 맞는 버킷 이름을 써주시면 됩니다. 이렇게 만들어준 policy 이름이 bigquery-omni-connection-policy 입니다. 

{
    "Statement": [
        {
            "Action": [
                "s3:ListBucket"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::bigquery-omni-test-bucket"
            ],
            "Sid": "BucketLevelAccess"
        },
        {
            "Action": [
                "s3:GetObject"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::bigquery-omni-test-bucket",
                "arn:aws:s3:::bigquery-omni-test-bucket/*"
            ],
            "Sid": "ObjectLevelGetAccess"
        },
        {
            "Action": [
                "s3:PutObject"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::bigquery-omni-test-bucket",
                "arn:aws:s3:::bigquery-omni-test-bucket/*"
            ],
            "Sid": "ObjectLevelPutAccess"
        }
    ],
    "Version": "2012-10-17"
}

 

이제 화면을 Google Cloud로 옮겨갑니다. AWS IAM 화면은 잠시후에 돌아올겁니다. Trust relationships을 설정해야 하는데 거기 필요한 값이 Google Cloud 에 External connections을 생성하면 얻을 수 있거든요. Google Cloud 콘솔로 이동했으면 빅쿼리 페이지로 갑니다.

빅쿼리 페이지

 

그리고 상단에 보이는 +ADD DATA 버튼을 눌러줍니다. 그리고 우측에 보이는 Connections to external data sources를 차례로 눌러줍니다.

Connections to external data sources를 선택

 

그리고 필요한 정보를 넣어줍니다. AWS role id는 앞에서 만든 AWS의 IAM의 ARN을 정확히 입력해주시면 됩니다. 여기서 주의하셔야 할 것은 Connection location입니다. 지금 만드는 컨넥터와 데이터셋(dataset), 그리고 S3의 리전이 모두 일치해야 합니다. 한 개라도 다른 리전을 사용하는 경우 정상적으로 설정되지 않으니 참고하세요. ( 2023-02-13 기준으로 빅쿼리 옴니를 사용할 수 있는 AWS 리전은 us-east-1, ap-northeast-2 두 개 입니다 )

Connection location을 잘 살펴봅니다

 

컨넥션을 생성하는 과정에서 해당 기능을 처음 사용하시는 거라면 API 활성화가 필요할 수 있습니다. 화면의 안내에 따라 아래 페이지로 이동해서 ENABLE 시켜주시면 됩니다.

BigQuery Connection API 활성화

 

생성이 끝났으면 아래와 같이 External connections 항목에 커넥션 정보가 보일겁니다. 여기서 숫자로 된 BigQuery Google identity 항목을 복사하고 화면을 AWS로 이동합시다.

BigQuery Google identity 복사

 

앞서 설정했던 IAM에 Trust relationships 으로 이동해서 아래 정보를 입력해줍니다. 여기서 account.google.com:sub 항목에 BigQuery Google identity를 복사해주시면 됩니다. 나머지는 전부 동일하게 입력해주세요. ( 이미지 아래 복사 붙여넣기 용도로 json을 첨부했습니다 )

account.google.com:sub 항목에 BigQuery Google identity 입력

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Federated": "accounts.google.com"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringEquals": {
                    "accounts.google.com:sub": "113763730177341772303"
                }
            }
        }
    ]
}

 

이제 AWS쪽 설정은 끝났습니다. 화면을 다시 Google Cloud 빅쿼리로 이동합니다. 이제 데이터셋과 테이블을 순서대로 만들어봅시다. 각자의 프로젝트 이름(여기서는 toy-project-119) 옆에 kebab menu(...) 아이콘을 클릭하고 Create dataset을 선택합니다.

Create dataset

 

Dataset ID를 적당히 입력하고 Location type에서 리전을 선택하고, 다음으로 aws-us-east-1을 선택합니다. 선택이 끝났으면 CREATE DATASET을 클릭합니다.

리전이 다르면 정상동작하지 않습니다

 

데이터셋이 생성됐으면 이제 데이터셋 하위에 테이블을 생성해줍니다. 이번에는 bq_omni_demo 항목 우측에 kebab menu(...) 아이콘 버튼을 눌러 Create table을 해줍니다. 아래 이미지처럼 값을 넣어줍니다. 앞에서 이야기한 것처럼 혹시 데이터셋의 리전과 컨넥터의 리전이 다르면 여기서 Connection ID에 보이지 않으니 주의하세요. S3 경로에는 예제를 위해 실제 데이터를 넣어뒀습니다. 모든 설정이 끝났으면 하단에 CREATE TABLE을 클릭합니다. 

Source를 Amazon S3로 선택

 

이제 다 왔습니다. 생성된 테이블에 스키마를 확인하실 수 있습니다. 

스키마가 확인되면 데이터를 정상적으로 가져왔다는 겁니다

 

이제 쿼리를 통해 데이터가 불러와지는 것을 확인해줍니다.

쿼리 결과 확인

 

 

# 마치며

여기까지 빅쿼리 옴니를 사용하기 위한 기본적인 설정을 살펴봤습니다. 분명한건 빅쿼리 옴니가 우리의 모든 문제를 풀어주진 못할거라는 겁니다. 그리고 실제 프로덕션 환경에서는 고려해야 할 것도 많고요. 예를들어 S3에 난잡하게 흩어져있는 우리의 데이터를 스마트하게 긁어와서 보여주진 못합니다. 빅쿼리를 사용하기 위한 버킷을 만들고 데이터를 전처리 하는 과정이 AWS 내에서 필요할겁니다. 그건 AWS Athena를 사용하더라도 마찬가지입니다. 우리 문제를 풀기 위해 빅쿼리 옴니를 어떻게 스마트 하게 운영할 수 있을지는 비즈니스 환경에 맞는 고민이 필요합니다. 그럼 건투를 빕니다!

 

# reference

- https://cloud.google.com/bigquery/docs/omni-introduction?hl=ko 

- https://www.cloudskillsboost.google/focuses/49746?parent=catalog 

 

댓글
최근에 올라온 글
최근에 달린 댓글
글 보관함
Total
Today
Yesterday