メインコンテンツまでスキップ
バージョン: 4.x

AWS認証と認可

DorisはAWSサービスリソースへのアクセスを2つの認証方法でサポートします:IAM UserAssumed Role。この記事では、両方の方法におけるセキュリティクレデンシャルの設定方法と、DorisのフィーチャーをAWSサービスとの連携に使用する方法について説明します。

認証方法の概要

IAM User認証

DorisはAWS IAM Userクレデンシャル(access_keysecret_keyに相当)を設定することで外部データソースへのアクセスを可能にします。以下は詳細な設定手順です(詳細については、AWSドキュメントIAM usersを参照してください):

Step1 IAM Userを作成してポリシーを設定する

  1. AWS ConsoleにログインしてIAM Userを作成します

create iam user

  1. IAM User名を入力して、ポリシーを直接アタッチします

iam user attach policy1

  1. ポリシーエディターでAWSリソースポリシーを定義します。以下は、S3バケットにアクセスするための読み取り/書き込みポリシーのテンプレートです

iam user attach policy2

S3読み取りポリシーテンプレート。読み取り/リストアクセスが必要なDorisフィーチャー(例:S3 Load、TVF、外部カタログ)に適用されます

注意:

  1. を実際の値に置き換えてください。

  2. 余分な/セパレーターを追加しないでください。

{
"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書き込みポリシーテンプレート(読み書きアクセスを必要とするDoris機能に適用されます。例:Export、Storage Vault、Repository)

注意事項:

  1. your-bucketyour-prefixを実際の値に置き換えてください。

  2. 余分な/セパレータを追加しないでください。

{
"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>"
}
]
}
  1. IAM Userの作成に成功した後、access/secret keyペアを作成します

iam user create ak sk

Step2 SQLを通じてaccess/secret keyペアでdoris機能を使用する

ステップ 1のすべての設定を完了すると、access_keysecret_keyを取得できます。以下の例に示すように、これらの認証情報を使用してdoris機能にアクセスします:

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" = "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' = 's3.us-east-1.amazonaws.com',
's3.region' = 'us-east-1',
"s3.access_key" = "<your-access-key>",
"s3.secret_key"="<your-secret-key>"
)

外部カタログ

  CREATE CATALOG iceberg_catalog PROPERTIES (
'type' = 'iceberg',
'iceberg.catalog.type' = 'hadoop',
'warehouse' = 's3://your_bucket/dir/key',
's3.endpoint' = '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" = "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 TABLE s3_test TO "s3://your_bucket/a/b/c" 
PROPERTIES (
"column_separator"="\\x07",
"line_delimiter" = "\\x07"
) WITH S3 (
"s3.endpoint" = "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" = "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" = "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_keysecret_key)を指定して、外部データのアクセス制御を実装できます。

Assumed Role認証

Assumed RoleはAWS IAM Roleを引き受けることで外部データソースにアクセスします(詳細については、AWSドキュメントのassume roleを参照してください)。以下の図は設定ワークフローを示しています:

assumed role flow

用語:

Source Account:Assume Roleアクションを開始するAWSアカウント(Doris FE/BE EC2インスタンスが存在する場所);

Target Account:対象のS3バケットを所有するAWSアカウント;

ec2_role:ソースアカウントで作成され、Doris FE/BEを実行するEC2インスタンスにアタッチされるロール;

bucket_role:対象バケットにアクセスする権限を持つ、ターゲットアカウントで作成されるロール;

注意事項:

  1. ソースアカウントとターゲットアカウントは同じAWSアカウントでも構いません;
  2. Doris FE/BEがデプロイされているすべてのEC2インスタンスがec_roleにアタッチされていることを確認してください。特にスケーリング操作時にご注意ください。

詳細な設定手順は以下のとおりです:

Step1 前提条件

  1. ソースアカウントがec2_roleを作成し、Doris FE/BEを実行するすべてのEC2 instancesにアタッチしていることを確認してください;

  2. ターゲットアカウントがbucket_roleと対応するバケットを作成していることを確認してください;

ec2_roleEC2 instancesにアタッチした後、以下のようにrole_arnを確認できます:

ec2 instance

Step2 ソースアカウントIAM Role(EC2インスタンスロール)の権限設定

  1. AWS IAM Consoleにログインし、Access management > Rolesに移動します;
  2. EC2インスタンスロールを見つけて、その名前をクリックします;
  3. ロールの詳細ページで、Permissionsタブに移動し、Add permissionsをクリックしてからCreate inline policyを選択します;
  4. Specify permissionsセクションで、JSONタブに切り替え、以下のポリシーを貼り付けて、Review policyをクリックします:

source role permission

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

Step3 ターゲットアカウントIAMロールの信頼ポリシーと権限を設定する

  1. AWS IAM Consoleにログインし、​​Access management > Roles​​に移動して、ターゲットロール(bucket_role)を見つけ、その名前をクリックします。

  2. ​​Trust relationships​​タブに移動し、​​Edit trust policy​​をクリックして、以下のJSONを貼り付けます(<ec2_iam_role_arn>をあなたのEC2インスタンスロールARNに置き換えてください)。​​アップデート policy​​をクリックします。

target role trust policy

注意: ConditionセクションのExternalIdは、複数のソースユーザーが同じロールをassumeする必要があるシナリオを区別するために使用されるオプションの文字列パラメータです。設定した場合は、対応するDoris SQLステートメントに含めてください。ExternalIdの詳細な説明については、aws docを参照してください。

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "<ec2_iam_role_arn>"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"sts:ExternalId": "1001"
}
}
}
]
}
  1. ロールの詳細ページで、Permissionsタブに移動し、Add permissionsをクリックして、Create inline policyを選択します。JSONタブで、要件に基づいて以下のポリシーのいずれかを貼り付けます。

target role permission2

S3読み取りポリシーテンプレート、読み取り/リストアクセスが必要なDoris機能に適用されます。例:S3 Load、TVF、外部カタログ

注意:

  1. your-bucketyour-prefixを実際の値に置き換えてください。

  2. 余分な/区切り文字を追加しないでください。

{
"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書き込みポリシーテンプレート(読み書きアクセスを必要とするDoris機能に適用されます。例:Export、Storage Vault、Repository)

注意事項:

  1. your-bucketyour-prefixを実際の値に置き換えてください。

  2. 余分な/セパレーターを追加しないでください。

{
"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>"
}
]
}

Step4 role_arnexternal_id フィールドに従って、SQL経由でAssumed Roleを使用したdoris機能を使用する

上記の設定を完了した後、対象アカウントの role_arnexternal_id(該当する場合)を取得します。 以下に示すように、これらのパラメータをdoris SQLステートメントで使用します:

重要な共通キーパラメータ:

"s3.role_arn" = "<your-target-role-arn>",
"s3.external_id" = "<your-external-id>" -- option 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" = "s3.us-east-1.amazonaws.com",
"s3.region" = "us-east-1",
"s3.role_arn" = "<your-target-role-arn>",
"s3.external_id" = "<your-external-id>" -- option parameter
)
PROPERTIES
(
"timeout" = "3600"
);

TVF

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

外部カタログ

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

Storage Vault

CREATE STORAGE VAULT IF NOT EXISTS s3_demo_vault
PROPERTIES (
"type" = "S3",
"s3.endpoint" = "s3.us-east-1.amazonaws.com",
"s3.region" = "us-east-1",
"s3.bucket" = "<your-bucket>",
"s3.role_arn" = "<your-target-role-arn>",
"s3.external_id" = "<your-external-id>", -- option 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" = "s3.us-east-1.amazonaws.com",
"s3.region" = "us-east-1",
"s3.role_arn" = "<your-target-role-arn>",
"s3.external_id" = "<your-external-id>"
)

リポジトリ

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

リソース

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