본문으로 건너뛰기
최종 수정: 에

AWS 인증 및 권한 부여

Doris는 AWS와 연동하여 인증 및 권한 부여를 수행하는 여러 방법을 제공합니다. 이러한 방법은 S3 Load, TVF, External Catalog, Storage Vault, Export, Repository, Resource를 비롯해 AWS S3 리소스에 액세스해야 하는 모든 기능에 적용됩니다. 이 문서에서는 AWS 보안 자격 증명을 구성하고, Doris에서 이를 사용하여 AWS 서비스 리소스에 액세스하는 방법을 설명합니다.

적용 시나리오​

Doris는 다음 네 가지 AWS 인증 및 권한 부여 방법을 지원합니다. 배포 환경과 보안 규정 준수 요구 사항에 따라 적합한 방법을 선택하세요.

인증 방법적용 시나리오장점단점
IAM User (AK/SK)보안 통제가 가능한 온프레미스 배포 환경 또는 AWS 이외의 S3 호환 객체 스토리지(Load/Export/Storage Vault 등)구성이 간단합니다. AWS S3 프로토콜과 호환되는 모든 객체 스토리지에서 사용할 수 있습니다키 유출 위험이 있습니다. 키를 수동으로 교체해야 합니다
Assumed Role (IAM Role)AWS EC2에 배포된 Doris가 계정 간 S3 액세스를 필요로 하는 높은 보안 수준의 시나리오보안 수준이 높습니다. AWS 자격 증명이 자동으로 교체됩니다. 권한을 중앙에서 관리합니다신뢰 정책과 권한 정책 구성이 비교적 복잡합니다
EKS IAM Role (IRSA / Pod Identity)Amazon EKS 클러스터에 배포된 DorisKubernetes ServiceAccount를 통해 자격 증명이 자동으로 주입됩니다EKS / IAM 연동에 대한 이해가 필요합니다
Bucket Policy버킷 수가 적은 AWS EC2 환경의 Load/Export/Storage Vault 시나리오최소 권한 원칙을 따릅니다. Doris가 AWS 자격 증명을 자동으로 감지합니다권한이 개별 버킷에 분산되어 중앙 관리가 어렵습니다

사전 요구 사항​

  • Doris FE/BE가 배포되어 정상적으로 실행 중이어야 합니다
  • 대상 AWS 계정과 액세스할 S3 버킷이 있어야 합니다
  • 해당 계정의 IAM 구성 권한(User / Role 생성, 정책 수정)이 있어야 합니다
  • Assumed Role 또는 Bucket Policy를 사용하려면 Doris FE/BE가 AWS EC2 또는 EKS 클러스터에 배포되어 있어야 합니다

IAM User 인증 및 권한 부여​

Doris는 AWS IAM User의 access_key와 secret_key를 사용하여 외부 데이터 소스에 액세스할 수 있습니다. 자세한 배경 정보는 AWS 공식 문서 IAM 사용자를 참조하세요.

1단계: IAM User 생성 및 정책 구성​

  1. AWS 콘솔에 로그인하고 IAM 서비스를 연 다음 Create user를 클릭합니다.

  2. IAM User 이름을 입력합니다. Set permissions 섹션에서 정책을 직접 연결하는 옵션을 선택합니다.

  3. 정책 편집기에 해당 AWS 리소스 정책을 입력합니다. 다음 예제는 S3 버킷에 액세스할 때 사용하는 일반적인 읽기/쓰기 정책 템플릿입니다.

    참고:

    • 버킷 이름과 접두사 경로를 실제 사용할 값으로 바꾸세요
    • "/" 구분자를 추가로 넣지 마세요

    S3 버킷 읽기 정책 템플릿입니다. S3 Load, TVF, External Catalog처럼 버킷 내 객체를 읽고 나열하기만 하면 되는 Doris 기능에 사용합니다.

    {
    "Version": "2012-10-17",
    "Statement": [
    {
    "Effect": "Allow",
    "Action": [
    "s3:GetObject",
    "s3:GetObjectVersion",
    ],
    "Resource": "arn:aws:s3:::<your-bucket>/your-prefix/*"
    },
    {
    "Effect": "Allow",
    "Action": [
    "s3:ListBucket",
    "s3:GetBucketLocation"
    ],
    "Resource": "arn:aws:s3:::<your-bucket>"
    }
    ]
    }

    S3 버킷 쓰기 정책 템플릿입니다. Export, Storage Vault, Resource, Repository처럼 버킷 객체의 읽기, 나열, 쓰기가 필요한 Doris 기능에 사용합니다.

    {
    "Version": "2012-10-17",
    "Statement": [
    {
    "Effect": "Allow",
    "Action": [
    "s3:PutObject",
    "s3:GetObject",
    "s3:GetObjectVersion",
    "s3:DeleteObject",
    "s3:DeleteObjectVersion",
    "s3:AbortMultipartUpload",
    "s3:ListMultipartUploadParts"
    ],
    "Resource": "arn:aws:s3:::<your-bucket>/<your-prefix>/*"
    },
    {
    "Effect": "Allow",
    "Action": [
    "s3:ListBucket",
    "s3:GetBucketLocation",
    "s3:GetBucketVersioning",
    "s3:GetLifecycleConfiguration"
    ],
    "Resource": "arn:aws:s3:::<your-bucket>"
    }
    ]
    }
  4. IAM User를 생성한 후 이 사용자의 access_key와 secret_key 액세스 키 쌍을 생성합니다.

2단계: Doris SQL에서 액세스 키 사용​

1단계를 완료하면 access_key와 secret_key를 얻게 됩니다. 이 키 쌍으로 Doris의 모든 기능을 사용할 수 있습니다. 다음 SQL 예제는 일반적인 사용 방법을 보여 줍니다. 핵심 필드는 다음과 같습니다.

"s3.access_key" = "<your-access-key>",
"s3.secret_key" = "<your-secret-key>"

S3 Load

  LOAD LABEL s3_load_2022_04_01
(
DATA INFILE("s3://your_bucket_name/s3load_example.csv")
INTO TABLE test_s3load
COLUMNS TERMINATED BY ","
FORMAT AS "CSV"
(user_id, name, age)
)
WITH S3
(
"provider" = "S3",
"s3.endpoint" = "https://s3.us-east-1.amazonaws.com",
"s3.region" = "us-east-1",
"s3.access_key" = "<your-access-key>",
"s3.secret_key" = "<your-secrety-key>"
)
PROPERTIES
(
"timeout" = "3600"
);

TVF

  SELECT * FROM S3 (
'uri' = 's3://your_bucket/path/to/tvf_test/test.parquet',
'format' = 'parquet',
's3.endpoint' = 'https://s3.us-east-1.amazonaws.com',
's3.region' = 'us-east-1',
"s3.access_key" = "<your-access-key>",
"s3.secret_key"="<your-secret-key>"
)

External Catalog

  CREATE CATALOG iceberg_catalog PROPERTIES (
'type' = 'iceberg',
'iceberg.catalog.type' = 'hadoop',
'warehouse' = 's3://your_bucket/dir/key',
's3.endpoint' = 'https://s3.us-east-1.amazonaws.com',
's3.region' = 'us-east-1',
"s3.access_key" = "<your-access-key>",
"s3.secret_key"="<your-secret-key>"
);

Storage Vault

CREATE STORAGE VAULT IF NOT EXISTS s3_demo_vault
PROPERTIES (
"type" = "S3",
"s3.endpoint" = "https://s3.us-east-1.amazonaws.com",
"s3.region" = "us-east-1",
"s3.bucket" = "<your-bucket>",
"s3.access_key" = "<your-access-key>",
"s3.secret_key"="<your-secret-key>",
"s3.root.path" = "s3_demo_vault_prefix",
"provider" = "S3",
"use_path_style" = "false"
);

Export

EXPORT TABLE s3_test TO "s3://your_bucket/a/b/c"
PROPERTIES (
"column_separator"="\\x07",
"line_delimiter" = "\\x07"
) WITH S3 (
"s3.endpoint" = "https://s3.us-east-1.amazonaws.com",
"s3.region" = "us-east-1",
"s3.access_key" = "<your-access-key>",
"s3.secret_key"="<your-secret-key>",
)

Repository

CREATE REPOSITORY `s3_repo`
WITH S3
ON LOCATION "s3://your_bucket/s3_repo"
PROPERTIES
(
"s3.endpoint" = "https://s3.us-east-1.amazonaws.com",
"s3.region" = "us-east-1",
"s3.access_key" = "<your-access-key>",
"s3.secret_key"="<your-secret-key>"
);

Resource

CREATE RESOURCE "remote_s3"
PROPERTIES
(
"s3.endpoint" = "https://s3.us-east-1.amazonaws.com",
"s3.region" = "us-east-1",
"s3.bucket" = "<your-bucket>",
"s3.access_key" = "<your-access-key>",
"s3.secret_key"="<your-secret-key>"
);

비즈니스 로직마다 서로 다른 IAM User의 access_key와 secret_key를 지정하여 외부 데이터에 대한 액세스를 세밀하게 제어할 수 있습니다.


Assumed Role 인증 및 권한 부여​

Assumed Role은 AWS IAM Role을 수임하여 외부 데이터 소스에 대한 액세스를 인증하고 권한을 부여합니다. 배경 정보는 AWS 공식 문서 IAM Role로 전환을 참조하세요. 다음 다이어그램은 Assumed Role의 전체 구성 흐름을 보여 줍니다.

용어 정의​

용어의미
소스 계정Assume Role을 시작하는 AWS 계정(이 예제에서는 Doris FE/BE를 호스팅하는 EC2 머신을 소유한 계정)
대상 계정대상 S3 버킷을 소유한 AWS 계정
ec2_role소스 계정에서 생성한 Role로, Doris FE/BE를 호스팅하는 모든 EC2 머신에 연결해야 합니다
bucket_role대상 계정에서 생성한 Role로, 대상 버킷에 대한 권한을 연결해야 합니다

참고:

  1. 소스 계정과 대상 계정은 동일한 AWS 계정이어도 됩니다.
  2. 특히 스케일 아웃 시, Doris FE/BE를 호스팅하는 모든 EC2 머신에 ec2_role이 연결되어 있는지 확인하세요.

다음은 구성 작업을 보여 주는 데모입니다.

AWS IAM Role

1단계: 준비​

  1. 소스 계정에서 ec2_role을 생성하고 Doris FE/BE를 호스팅하는 모든 EC2 머신에 연결합니다.
  2. 대상 계정에서 bucket_role과 해당 S3 버킷을 생성합니다.

EC2 머신에 ec2_role을 연결하면 다음과 같이 콘솔에서 role_arn을 확인할 수 있습니다.

2단계: 소스 계정의 IAM Role에 권한 정책 추가​

EC2 인스턴스에 연결된 소스 계정의 Role에 sts:AssumeRole을 허용하는 인라인 정책을 추가합니다.

  1. AWS IAM 콘솔에 로그인하고 왼쪽 탐색 창에서 Access management > Roles를 선택합니다.
  2. EC2 인스턴스에 연결된 Role을 찾아 이름을 클릭합니다.
  3. Role 세부 정보 페이지의 Permissions 섹션에서 Add permissions를 클릭하고 Create inline policy를 선택합니다.
  4. Specify permissions 단계에서 JSON 탭으로 전환하고 다음 정책을 입력한 후 Review policy를 클릭하여 저장합니다.

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["sts:AssumeRole"],
"Resource": "*"
}
]
}

3단계: 대상 계정의 IAM Role에 신뢰 정책 및 권한 정책 구성​

3.1 신뢰 정책 구성​

  1. AWS IAM 콘솔에 로그인하고 왼쪽 탐색 창에서 Access management > Roles를 선택합니다. Assumed Target Role(즉, bucket_role)을 찾아 이름을 클릭하여 세부 정보 페이지로 이동합니다.
  2. Trust relationships 탭으로 전환하고 Edit trust policy를 클릭합니다. 편집 페이지에서 다음 JSON을 입력하고 <ec2_iam_role_arn>을 EC2 인스턴스에 연결된 Role의 ARN으로 바꾼 후 Update policy를 클릭합니다.

참고: Condition의 ExternalId 필드는 선택 사항입니다. 여러 소스 사용자가 동일한 Role을 수임하는 경우를 구분하는 데 사용합니다. ExternalId를 구성했다면 해당 Doris SQL 문에도 이 값을 전달해야 합니다. ExternalId에 대한 자세한 내용은 AWS 공식 문서를 참조하세요.

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "<ec2_iam_role_arn>"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"sts:ExternalId": "1001"
}
}
}
]
}

3.2 권한 정책 구성​

Role 세부 정보 페이지의 Permissions 섹션에서 Add permissions를 클릭하고 Create inline policy를 선택합니다. Specify permissions 단계에서 JSON 탭으로 전환하고 아래 정책을 입력한 후 Review policy를 클릭하여 저장합니다.

참고:

  • 버킷 이름과 접두사 경로를 실제 사용할 값으로 바꾸세요
  • "/" 구분자를 추가로 넣지 마세요

S3 버킷 읽기 정책 템플릿입니다. S3 Load, TVF, External Catalog처럼 버킷 내 객체를 읽고 나열하기만 하면 되는 Doris 기능에 사용합니다.

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:GetObjectVersion"
],
"Resource": "arn:aws:s3:::<bucket>/<prefix>/*"
},
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Resource": "arn:aws:s3:::<bucket>",
}
]
}

S3 버킷 쓰기 정책 템플릿입니다. Export, Storage Vault, Resource, Repository처럼 버킷의 읽기와 쓰기가 필요한 Doris 기능에 사용합니다.

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:GetObjectVersion",
"s3:DeleteObject",
"s3:DeleteObjectVersion",
"s3:AbortMultipartUpload",
"s3:ListMultipartUploadParts"
],
"Resource": "arn:aws:s3:::<bucket>/<prefix>/*"
},
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Resource": "arn:aws:s3:::<bucket>"
}
]
}

4단계: Doris SQL에서 role_arn 및 external_id 사용​

이전 단계를 완료하면 대상 계정의 role_arn과 선택 사항인 external_id를 얻게 됩니다. Doris SQL에서 핵심이 되는 두 필드는 다음과 같습니다.

"s3.role_arn" = "<your-bucket-role-arn>",
"s3.external_id" = "<your-external-id>" -- Optional parameter

S3 Load

  LOAD LABEL s3_load_2022_04_01
(
DATA INFILE("s3://your_bucket_name/s3load_example.csv")
INTO TABLE test_s3load
COLUMNS TERMINATED BY ","
FORMAT AS "CSV"
(user_id, name, age)
)
WITH S3
(
"provider" = "S3",
"s3.endpoint" = "https://s3.us-east-1.amazonaws.com",
"s3.region" = "us-east-1",
"s3.role_arn" = "<your-bucket-role-arn>",
"s3.external_id" = "<your-external-id>" -- Optional parameter
)
PROPERTIES
(
"timeout" = "3600"
);

TVF

  SELECT * FROM S3 (
"uri" = "s3://your_bucket/path/to/tvf_test/test.parquet",
"format" = "parquet",
"s3.endpoint" = "https://s3.us-east-1.amazonaws.com",
"s3.region" = "us-east-1",
"s3.role_arn" = "<your-bucket-role-arn>",
"s3.external_id" = "<your-external-id>" -- Optional parameter
)

External Catalog

  CREATE CATALOG iceberg_catalog PROPERTIES (
"type" = "iceberg",
"iceberg.catalog.type" = "hadoop",
"warehouse" = "s3://your_bucket/dir/key",
"s3.endpoint" = "https://s3.us-east-1.amazonaws.com",
"s3.region" = "us-east-1",
"s3.role_arn" = "<your-bucket-role-arn>",
"s3.external_id" = "<your-external-id>" -- Optional parameter
);

Storage Vault

CREATE STORAGE VAULT IF NOT EXISTS s3_demo_vault
PROPERTIES (
"type" = "S3",
"s3.endpoint" = "https://s3.us-east-1.amazonaws.com",
"s3.region" = "us-east-1",
"s3.bucket" = "<your-bucket>",
"s3.role_arn" = "<your-bucket-role-arn>",
"s3.external_id" = "<your-external-id>", -- Optional parameter
"s3.root.path" = "s3_demo_vault_prefix",
"provider" = "S3",
"use_path_style" = "false"
);

Export

EXPORT TABLE s3_test TO "s3://your_bucket/a/b/c"
PROPERTIES (
"column_separator"="\\x07",
"line_delimiter" = "\\x07"
) WITH S3 (
"s3.endpoint" = "https://s3.us-east-1.amazonaws.com",
"s3.region" = "us-east-1",
"s3.role_arn" = "<your-bucket-role-arn>",
"s3.external_id" = "<your-external-id>"
)

Repository

CREATE REPOSITORY `s3_repo`
WITH S3
ON LOCATION "s3://your_bucket/s3_repo"
PROPERTIES
(
"s3.endpoint" = "https://s3.us-east-1.amazonaws.com",
"s3.region" = "us-east-1",
"s3.role_arn" = "<your-bucket-role-arn>",
"s3.external_id" = "<your-external-id>"
);

Resource

CREATE RESOURCE "remote_s3"
PROPERTIES
(
"s3.endpoint" = "https://s3.us-east-1.amazonaws.com",
"s3.region" = "us-east-1",
"s3.bucket" = "<your-bucket>",
"s3.role_arn" = "<your-bucket-role-arn>",
"s3.external_id" = "<your-external-id>"
);

EKS 클러스터에서의 IAM Role 인증 및 권한 부여​

Amazon EKS는 EKS 클러스터에서 실행되는 Apache Doris에 AWS Identity and Access Management(IAM) 권한을 부여하는 두 가지 주요 방법을 제공합니다.

  1. IAM Roles for Service Accounts (IRSA)
  2. EKS Pod Identity

두 방법 모두 EKS 클러스터에서 IAM Role과 해당 신뢰 정책 및 IAM 정책을 올바르게 구성해야 합니다. 자세한 구성 단계는 AWS 공식 문서 Amazon Elastic Kubernetes Service 클러스터의 워크로드에 AWS Identity and Access Management 권한 부여를 참조하세요.

EKS 측 구성을 완료하면 Doris FE/BE가 AWSCredentialsProviderChain을 통해 자격 증명을 자동으로 가져옵니다. SQL에서 access_key / secret_key 또는 role_arn을 명시적으로 지정할 필요가 없습니다.


Bucket Policy 인증 및 권한 부여​

IAM Role이 연결된 머신에 Doris를 배포한 경우, Load, Export, TVF 등의 시나리오에서는 Amazon S3 Bucket Policy를 사용하여 S3 객체에 대한 액세스를 보호할 수도 있습니다. 이 방법은 EC2 머신을 소유한 계정만 버킷에 액세스할 수 있도록 제한합니다.

1단계: 대상 버킷에 Bucket Policy 설정​

아래 정책의 arn:aws:iam::111122223333:root를 EC2 머신에 연결된 계정 또는 Role의 ARN으로 바꿉니다.

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::111122223333:root"
]
},
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:GetObjectVersion",
"s3:DeleteObject",
"s3:DeleteObjectVersion",
"s3:AbortMultipartUpload",
"s3:ListMultipartUploadParts"
],
"Resource": "arn:aws:s3:::<bucket>/<prefix>/*"
},
{
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::111122223333:root"
]
},
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Resource": "arn:aws:s3:::<bucket>",
}
]
}

2단계: Doris SQL에서 S3에 직접 액세스(AK/SK 또는 ARN 불필요)​

Bucket Policy를 설정하면 SQL에서 access_key, secret_key, role_arn을 제공할 필요가 없습니다. Doris FE/BE가 AWSCredentialsProviderChain을 통해 자격 증명을 자동으로 가져옵니다.

  SELECT * FROM S3 (
"uri" = "s3://your_bucket/path/to/tvf_test/test.parquet",
"format" = "parquet",
"s3.endpoint" = "https://s3.us-east-1.amazonaws.com",
"s3.region" = "us-east-1"
)

참고: Bucket Policy 예제


권한 부여 방법별 모범 사례​

권한 부여 방법적용 시나리오장점단점
AK/SK 권한 부여보안 통제가 가능한 온프레미스 배포 환경 또는 AWS 이외의 S3 객체 스토리지에서 사용하는 Load/Export/Storage Vault구성이 간단합니다. AWS S3 프로토콜과 호환되는 모든 객체 스토리지에서 사용할 수 있습니다키 유출 위험이 있습니다. 키를 수동으로 교체해야 합니다
IAM Role 권한 부여보안 요구 사항이 높은 AWS S3 퍼블릭 클라우드의 Load/Export/Storage Vault 시나리오보안 수준이 높습니다. AWS 자격 증명이 자동으로 교체됩니다. 권한을 중앙에서 관리합니다Bucket Policy/신뢰 정책 구성 절차가 복잡합니다
Bucket Policy 권한 부여버킷 수가 적은 AWS S3 퍼블릭 클라우드의 Load/Export/Storage Vault 시나리오구성 복잡도가 보통 수준입니다. 최소 권한 원칙을 따릅니다. AWS 자격 증명이 자동으로 감지됩니다권한이 개별 버킷 정책에 분산됩니다

자주 묻는 질문​

질문: BE와 Recycler에서 AWS SDK DEBUG 수준 로그를 활성화하려면 어떻게 하나요?​

be.conf와 doris_cloud.conf에서 aws_log_level=5로 설정한 후 프로세스를 다시 시작하면 변경 사항이 적용됩니다.

aws_log_level 매개변수에 대한 설명은 다음과 같습니다.

항목설명
유형int32
설명AWS SDK 로그 수준
기본값2 (Error)

유효한 값:

Off   = 0
Fatal = 1
Error = 2
Warn = 3
Info = 4
Debug = 5
Trace = 6

질문: AWS SDK DEBUG 로그를 활성화한 후 be.log / recycler.log에 OpenSSL SSL_connect: Connection reset by peer가 보고되면 어떻게 하나요?​

오류 예제:

OpenSSL SSL_connect: Connection reset by peer in connection to sts.me-south-1.amazonaws.com:443

AWS VPC 네트워크 구성이나 방화벽 포트 구성에 해당 리전의 STS 서비스에 대한 액세스를 차단하는 문제가 있는지 확인하세요. 다음 명령으로 확인할 수 있습니다.

telnet sts.<region>.amazonaws.com 443