Перейти к содержимому
Последнее обновление

Аутентификация и авторизация в AWS

Doris поддерживает несколько способов интеграции с AWS для аутентификации и авторизации. Эти способы применимы к S3 Load, TVF, External Catalog, Storage Vault, Export, Repository, Resource и любым другим функциям, которым требуется доступ к ресурсам AWS S3. В этом документе описано, как настроить учётные данные безопасности AWS и использовать их для доступа к ресурсам сервисов AWS из Doris.

Сценарии применения​

Doris поддерживает следующие четыре способа аутентификации и авторизации в AWS. Выберите подходящий способ с учётом среды развёртывания и требований безопасности:

Способ аутентификацииСценарий примененияПреимуществаНедостатки
IAM User (AK/SK)Локальные развёртывания с контролируемой безопасностью или совместимые с S3 объектные хранилища вне AWS (Load/Export/Storage Vault и т. д.)Простая настройка. Работает с любым объектным хранилищем, совместимым с протоколом AWS S3Риск утечки ключей. Ключи необходимо менять вручную
Assumed Role (IAM Role)Сценарии с высокими требованиями к безопасности, когда Doris развёрнут на AWS EC2 и ему нужен доступ к S3 из другой учётной записиВысокий уровень безопасности. Учётные данные AWS меняются автоматически. Разрешения управляются централизованноОтносительно сложная настройка политик доверия и разрешений
EKS IAM Role (IRSA / Pod Identity)Doris развёрнут в кластере Amazon EKSУчётные данные автоматически предоставляются через Kubernetes ServiceAccountТребуется знание интеграции EKS / IAM
Bucket PolicyСценарии Load/Export/Storage Vault на AWS EC2 с небольшим числом бакетовСоблюдается принцип минимальных привилегий. Doris автоматически обнаруживает учётные данные AWSРазрешения распределены по отдельным бакетам, что затрудняет централизованное управление

Предварительные требования​

  • Doris FE/BE развёрнуты и работают нормально
  • У вас есть целевая учётная запись AWS и бакет S3, к которому требуется доступ
  • У вас есть права на настройку IAM в этой учётной записи (создание User / Role, изменение политик)
  • Для Assumed Role или Bucket Policy компоненты Doris FE/BE должны быть развёрнуты на AWS EC2 (или в кластере EKS)

Аутентификация и авторизация с помощью IAM User​

Doris поддерживает доступ к внешним источникам данных с использованием access_key и secret_key пользователя AWS IAM User. Дополнительные сведения см. в официальной документации AWS Пользователи IAM.

Шаг 1: создание IAM User и настройка политики​

  1. Войдите в консоль AWS, откройте сервис IAM и нажмите Create user.

  2. Введите имя IAM User. В разделе Set permissions выберите непосредственное присоединение политики.

  3. В редакторе политик введите соответствующую политику доступа к ресурсам 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, Resource и Repository:

    {
    "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: использование ключа доступа в SQL Doris​

После выполнения шага 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>"
);

Вы можете указывать access_key и secret_key разных IAM User в разных частях бизнес-логики, чтобы детально управлять доступом к внешним данным.


Аутентификация и авторизация с помощью Assumed Role​

Assumed Role обеспечивает аутентификацию и авторизацию доступа к внешним источникам данных путём принятия роли AWS IAM Role. Дополнительные сведения см. в официальной документации AWS Переключение на роль IAM. На следующей схеме показан общий порядок настройки Assumed Role:

Определения терминов​

ТерминЗначение
Исходная учётная записьУчётная запись AWS, которая инициирует Assume Role (в этом примере это учётная запись, которой принадлежат машины EC2 с Doris FE/BE)
Целевая учётная записьУчётная запись AWS, которой принадлежит целевой бакет S3
ec2_roleРоль, созданная в исходной учётной записи; её необходимо привязать к каждой машине EC2 с Doris FE/BE
bucket_roleРоль, созданная в целевой учётной записи; ей необходимо предоставить разрешения на целевой бакет

Примечание:

  1. Исходная и целевая учётные записи могут быть одной и той же учётной записью AWS.
  2. Убедитесь, что к каждой машине EC2 с Doris FE/BE привязана роль ec2_role, особенно при горизонтальном масштабировании.

Ниже представлена демонстрация настройки:

AWS IAM Role

Шаг 1: подготовка​

  1. В исходной учётной записи создайте ec2_role и привяжите её к каждой машине EC2 с Doris FE/BE.
  2. В целевой учётной записи создайте bucket_role и соответствующий бакет S3.

После привязки машины EC2 к ec2_role вы можете посмотреть role_arn в консоли, как показано ниже:

Шаг 2: добавление политики разрешений к IAM Role исходной учётной записи​

Добавьте встроенную политику, разрешающую sts:AssumeRole, к роли исходной учётной записи, привязанной к экземпляру EC2:

  1. Войдите в консоль AWS IAM и выберите 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": "*"
}
]
}

Шаг 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> на ARN роли, связанной с экземпляром EC2, затем нажмите Update policy.

Примечание: Поле ExternalId в Condition необязательно. Оно используется для различения случаев, когда несколько исходных пользователей принимают одну и ту же роль. Если ExternalId задан, передайте это значение и в соответствующем операторе SQL Doris. Подробнее о 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 Настройка политики разрешений​

На странице сведений о роли в разделе Permissions нажмите Add permissions и выберите Create inline policy. На этапе Specify permissions перейдите на вкладку JSON, введите приведённую ниже политику и нажмите Review policy, чтобы сохранить её.

Примечание:

  • Замените имя бакета и путь префикса своими значениями
  • Не добавляйте лишние разделители "/"

Шаблон политики чтения для бакета S3. Используйте его для функций Doris, которым достаточно чтения объектов и получения их списка в бакете, например S3 Load, TVF и External Catalog:

{
"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, Resource и Repository:

{
"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: использование role_arn и external_id в SQL Doris​

После выполнения предыдущих шагов у вас есть role_arn целевой учётной записи и, при необходимости, external_id. В SQL Doris ключевыми являются следующие два поля:

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

Аутентификация и авторизация с помощью IAM Role в кластерах EKS​

Для Apache Doris, работающего в кластере Amazon EKS, Amazon EKS предоставляет два основных способа назначения разрешений AWS Identity and Access Management (IAM):

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

Оба способа требуют правильной настройки IAM Role, её политики доверия и политики IAM в кластере EKS. Подробные инструкции по настройке см. в официальной документации AWS Предоставление разрешений AWS Identity and Access Management рабочим нагрузкам в кластерах Amazon Elastic Kubernetes Service.

После завершения настройки на стороне EKS компоненты Doris FE/BE автоматически получают учётные данные через AWSCredentialsProviderChain. Явно указывать access_key / secret_key или role_arn в SQL не требуется.


Аутентификация и авторизация с помощью Bucket Policy​

Если машинам с Doris назначена IAM Role, в сценариях Load, Export, TVF и аналогичных также можно использовать Amazon S3 Bucket Policy для защиты доступа к объектам в S3. Этот способ ограничивает доступ к бакету: обращаться к нему может только учётная запись, которой принадлежит машина EC2.

Шаг 1: установка Bucket Policy для целевого бакета​

Замените arn:aws:iam::111122223333:root в приведённой ниже политике на ARN учётной записи или роли, привязанной к машине EC2:

{
"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: прямой доступ к S3 из SQL Doris (без AK/SK или ARN)​

После установки Bucket Policy указывать access_key, secret_key или role_arn в SQL не требуется. Компоненты 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Локальные развёртывания с контролируемой безопасностью или Load/Export/Storage Vault в объектных хранилищах S3 вне AWSПростая настройка. Работает с любым объектным хранилищем, совместимым с протоколом AWS S3Риск утечки ключей. Ключи необходимо менять вручную
Авторизация IAM RoleСценарии Load/Export/Storage Vault в публичном облаке AWS S3 с повышенными требованиями к безопасностиВысокий уровень безопасности. Учётные данные AWS меняются автоматически. Разрешения управляются централизованноСложный процесс настройки Bucket Policy/Trust
Авторизация Bucket PolicyСценарии Load/Export/Storage Vault в публичном облаке AWS S3 с небольшим числом бакетовУмеренная сложность настройки. Соблюдается принцип минимальных привилегий. Учётные данные AWS обнаруживаются автоматическиРазрешения распределены по политикам отдельных бакетов

Часто задаваемые вопросы​

Вопрос: как включить журналы AWS SDK уровня DEBUG для BE и Recycler?​

В 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
На этой странице