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、外部カタログ)に適用されます
注意:
-
と を実際の値に置き換えてください。 -
余分な/セパレーターを追加しないでください。
{
"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 Userの作成に成功した後、access/secret keyペアを作成します

Step2 SQLを通じてaccess/secret keyペアでdoris機能を使用する
ステップ 1のすべての設定を完了すると、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>",
)
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_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 Role(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に置き換えてください)。アップデート 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"
}
}
}
]
}
- ロールの詳細ページで、
Permissionsタブに移動し、Add permissionsをクリックして、Create inline policyを選択します。JSONタブで、要件に基づいて以下のポリシーのいずれかを貼り付けます。

S3読み取りポリシーテンプレート、読み取り/リストアクセスが必要なDoris機能に適用されます。例:S3 Load、TVF、外部カタログ
注意:
-
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
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>"
);