メインコンテンツまでスキップ

Dorisは、IAM UserAssumed Roleの2つの認証方式を通じてAWSサービスリソースへのアクセスをサポートしています。この記事では、両方の方式におけるセキュリティ認証情報の設定方法と、Dorisの機能を使用してAWSサービスと連携する方法について説明します。

認証方式の概要

IAM User認証

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

Step1 IAM Userの作成とポリシーの設定

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

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

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

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

注意:

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

  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ユーザーの作成が完了したら、access/secret keyペアを作成します

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

Step 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>",
)

リポジトリ

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 Userクレデンシャル(access_keysecret_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:ターゲットアカウントで作成され、対象バケットへのアクセス権限を持つロール;

注意:

  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を確認できます:

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`​​をクリックする:

{
"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に置き換えてください)。​​Update 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タブで、要件に基づいて以下のポリシーのいずれかを貼り付けます。

S3読み取りポリシーテンプレート、読み取り/一覧表示アクセスを必要とするDoris機能に適用されます。例:S3 Load、TVF、External Catalog

注意点:

  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-bucket-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-bucket-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-bucket-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-bucket-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-bucket-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-bucket-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-bucket-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-bucket-role-arn>",
"s3.external_id" = "<your-external-id>"
);

AWS EKS Cluster IAM Role認証と認可

Amazon EKSクラスタで実行されているアプリケーション(Apache Dorisなど)にAWS Identity and Access Management (IAM)権限を付与する必要がある場合、Amazon EKSは以下の2つの主要な方法を提供します:

1.IAM Roles for Service Accounts (IRSA)​

2. EKS Pod Identity​

どちらの方法も、EKSクラスタでIAM Role、対応するtrust policy、およびIAM policyの正しい設定が必要です。具体的な設定方法については、AWSの公式ドキュメントを参照してください:

Granting AWS Identity and Access Management permissions to workloads on Amazon Elastic Kubernetes Service clusters

Doris FE/BEはAWSCredentialsProviderChainメソッドを通じて認証情報を自動的に検出し、取得することをサポートしています。

Bucket Policy認証と認可

IAM Rolesを使用してデプロイされたDorisマシンの場合、インポート、エクスポート、およびTVFシナリオでも、Amazon S3バケットポリシーを使用してAWS S3バケット内のオブジェクトへのアクセスを制御することをサポートしています。これにより、オブジェクトバケットへのアクセスをEC2マシンに関連付けられたユーザーのみに制限することができます。具体的な手順は以下の通りです:

1、対象バケットのBucket Policyを設定します。

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

arn:aws:iam::111122223333:rootをEC2マシンにバインドされたアカウントまたはRoleのARNに置き換えてください。

2、データアクセスには対応するSQL構文を使用してください。認証資格情報は自動的に検出されるため、手動でのAK/SKやARNの設定は不要です。

  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"
)

Doris FE/BEはAWSCredentialsProviderChainメソッドを使用して、認証情報の自動検出と取得をサポートしています。

参考ドキュメント: Bucket Policy

認証方式のベストプラクティス

認証方式適用シナリオ利点欠点
AK/SK認証プライベート展開された、セキュリティ制御されたストレージまたは非AWS S3オブジェクトストレージでのImport/Export/StorageVaultシナリオ。設定が簡単、AWS S3互換のオブジェクトストレージをサポート。秘密鍵の漏洩リスク、手動でのキーローテーションが必要。
IAMロール認証高セキュリティ要件を持つAWS S3パブリッククラウドでのImport/Export/StorageVaultシナリオ。高いセキュリティ、AWS認証情報の自動ローテーション、一元的な権限設定。複雑なBucket Policy/Trust設定プロセス。
Bucket Policy認証少数のbucketを持つAWS S3パブリッククラウドでのImport/Export/StorageVaultシナリオ中程度の設定複雑度、最小権限の原則に準拠、AWS認証情報を自動検出。権限設定が各種bucket policyに分散している。

FAQ

1. BEとRecyclerでAWS SDK DEBUGレベルログを設定するにはどうすればよいですか?

be.confとdoris_cloud.confでaws_log_level=5を設定し、プロセスを再起動して変更を適用してください。

  • タイプ: int32

  • 説明: AWS SDKのログレベル

       Off = 0,
    Fatal = 1,
    Error = 2,
    Warn = 3,
    Info = 4,
    Debug = 5,
    Trace = 6
  • デフォルト値: 2

2.AWS SDK DEBUGレベルログを設定した後、be.log/recycler.logに以下のエラーが表示される場合:

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

AWS VPCネットワーク設定またはファイアウォールポート設定に問題があり、対応するAWSリージョンのSTSサービスへのアクセスが阻害されていないかを確認してください(telnet host:portで接続性を検証)。