AWS認証と認可
DorisはAWSサービスリソースへのアクセスを2つの認証方法でサポートしています:IAM UserとAssumed Role。この記事では、両方の方法のセキュリティ認証情報の設定方法と、Dorisの機能を使用してAWSサービスと連携する方法について説明します。
認証方法の概要
IAM User認証
DorisはAWS IAM User認証情報(access_keyとsecret_keyに相当)を設定することで外部データソースへのアクセスを可能にします。以下に詳細な設定手順を示します(詳細情報については、AWSドキュメントのIAM usersを参照してください):
Step1 IAM Userを作成してポリシーを設定する
AWS ConsoleにログインしてIAM Userを作成する

- IAM User名を入力してポリシーを直接アタッチする

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

S3読み取りポリシーテンプレート。読み取り/リストアクセスが必要なDorisの機能(例:S3 Load、TVF、External Catalog)に適用されます
注意:
-
と を実際の値に置き換えてください。 -
余分な / 区切り文字を追加しないでください。
{
"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)
注意:
-
your-bucketとyour-prefixを実際の値に置き換えてください。 -
余分な
/区切り文字を追加しないでください。
{
"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>"
}
]
}
- IAMユーザーの作成が正常に完了したら、access/secret keyペアを作成します

Step2 access/secret keyペアを使用してSQLでdoris機能を利用する
Step1のすべての設定が完了すると、access_keyとsecret_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>",
)
リポジトリ
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>"
);
リソース
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ユーザー認証情報(access_keyとsecret_key)を指定することで、外部データのアクセス制御を実装できます。
Assumed Role認証
Assumed Roleは、AWS IAM Roleを引き受けることで外部データソースにアクセスすることを可能にします(詳細については、AWSドキュメントassume roleを参照してください)。以下の図は設定ワークフローを示しています:

用語:
Source Account:Assume Roleアクションを開始するAWSアカウント(Doris FE/BE EC2インスタンスが存在する場所);
Target Account:対象のS3バケットを所有するAWSアカウント;
ec2_role:ソースアカウントで作成され、Doris FE/BEを実行するEC2インスタンスにアタッチされたロール;
bucket_role:ターゲットアカウントで作成され、対象バケットへのアクセス権限を持つロール;
注意:
- ソースアカウントとターゲットアカウントは同じAWSアカウントでも構いません;
- Doris FE/BEがデプロイされているすべてのEC2インスタンスが
ec_roleにアタッチされていることを確認してください。特にスケーリング操作時に注意が必要です。
より詳細な設定手順は以下の通りです:
Step1 前提条件
-
ソースアカウントが
ec2_roleを作成し、Doris FE/BEを実行するすべてのEC2 instancesにアタッチしていることを確認してください; -
ターゲットアカウントが
bucket_roleと対応するバケットを作成していることを確認してください;
ec2_roleをEC2 instancesにアタッチした後、以下に示すようにrole_arnを確認できます:

Step2 ソースアカウントIAMロール(EC2インスタンスロール)の権限設定
- AWS IAM Consoleにログインし、
Access management>Rolesに移動します; - EC2インスタンスロールを見つけて、その名前をクリックします;
- ロール詳細ページで、
Permissionsタブに移動し、Add permissionsをクリックして、Create inline policyを選択します; Specify permissionsセクションで、JSONタブに切り替え、以下のポリシーを貼り付けて、Review policyをクリックします:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["sts:AssumeRole"],
"Resource": "*"
}
]
}
Step3 ターゲットアカウントIAMロールの信頼ポリシーと権限の設定
-
AWS IAM Consoleにログインし、Access management > Rolesに移動して、ターゲットロール(bucket_role)を見つけ、その名前をクリックします;
-
Trust relationshipsタブに移動し、Edit trust policyをクリックして、以下のJSON(<ec2_iam_role_arn>をあなたのEC2インスタンスロールARNに置き換えてください)を貼り付けます。Update policyをクリックします

注意:ConditionセクションのExternalIdは、複数のソースユーザーが同じロールを引き受ける必要があるシナリオを区別するために使用されるオプションの文字列パラメータです。設定する場合は、対応する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"
}
}
}
]
}
- ロール詳細ページで、
Permissionsタブに移動し、Add permissionsをクリックしてから、Create inline policyを選択します。JSONタブで、要件に基づいて以下のポリシーのいずれかを貼り付けます。

S3読み取りポリシーテンプレート、読み取り/リストアクセスが必要なDoris機能に適用されます。例:S3 Load、TVF、External Catalog
注意:
-
your-bucketとyour-prefixを実際の値に置き換えてください。 -
余分な
/セパレータを追加しないでください。
{
"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)
注記:
-
your-bucketとyour-prefixを実際の値に置き換えてください。 -
余分な
/セパレータの追加は避けてください。
{
"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_arnとexternal_idフィールドに基づいて、SQLでAssumed Roleを使用してdoris機能を使用する
上記の設定を完了した後、ターゲットアカウントのrole_arnとexternal_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 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>"
);