s3 bucket policy например для чтения из двух разных аккаунтов - PullRequest
0 голосов
/ 11 ноября 2018

У меня есть экземпляр, который должен считывать данные из двух разных учетных записей s3.

  1. Корзина в DataAccount с именем корзины " dataaccountlogs "
  2. Bucket in UserAccount с именем корзины " userlogs "

У меня есть консольный доступ к обеим учетным записям, поэтому теперь мне нужно настроить политику корзинычтобы позволить экземплярам читать данные s3 из сегментов dataaccountlogs и userlogs , и мой экземпляр работает в UserAccount .

Мне нужно получить доступ к этимдва ведра как из командной строки , так и с использованием spark job .

1 Ответ

0 голосов
/ 09 февраля 2019

Вам понадобится роль в UserAccount, которая будет использоваться для доступа к указанным сегментам, скажем RoleA. Роль должна иметь разрешения для требуемых операций S3.

Тогда вы сможете настроить политику сегментов для каждого сегмента:

  1. Для DataAccount :

    {        
    "Version": "2012-10-17",
    "Id": "Policy1",
    "Statement": [
        {
            "Sid": "test1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::DataAccount:role/RoleA"
            },
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::dataaccountlogs",
                "arn:aws:s3:::dataaccountlogs/*"
            ]
        }
    ]
    }
    
  2. Для UserAccount :

    {
    "Version": "2012-10-17",
    "Id": "Policy1",
    "Statement": [
        {
            "Sid": "test1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::DataAccount:role/RoleA"
            },
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::userlogs",
                "arn:aws:s3:::userlogs/*"
            ]
        }
    ]
    } 
    

Для доступа к ним из командной строки:

Сначала вам необходимо настроить инструмент CLI AWS: https://docs.aws.amazon.com/polly/latest/dg/setup-aws-cli.html

Тогда вам нужно будет настроить профиль для использования вашей роли. Для начала вам необходимо создать профиль для входа в систему:

aws configure --profile YourProfileAlias ​​

И следуйте инструкциям по настройке учетных данных.

Затем вам нужно будет отредактировать конфиг и добавить профиль для роли: ~ / .Aws / конфигурации

Добавить в конец блок:

[profile YourRoleProfileName]
role_arn = arn:aws:iam::DataAccount:role/RoleA
source_profile = YourProfileAlias

После этого вы сможете использовать aws s3api ... --profile YourRoleProfileName для доступа к обоим сегментам от имени созданной роли.

Для доступа от искры:

  1. Если вы запускаете кластер в EMR, вам следует использовать SecurityConfiguration и заполнить раздел для настройки роли S3. Можно указать разные роли для каждого конкретного сегмента. Вы должны использовать ограничение «Префикс» и перечислить все префиксы назначения после. Например, "s3: // dataaccountlogs /, s3: // userlogs".

Примечание: для этого следует строго использовать протокол s3, а не s3a. Также есть ряд ограничений, вы можете найти здесь: https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-spark-s3-optimized-committer.html

  1. Другой способ с помощью spark - настроить Hadoop для выполнения вашей роли. Ввод

    spark.hadoop.fs.s3a.aws.credentials.provider = "org.apache.hadoop.fs.s3a.AssumedRoleCredentialProvider, org.apache.hadoop.fs.s3a.auth.AssumedRoleCredentialProvider"

И настройка вашей роли для использования

spark.hadoop.fs.s3a.assumed.role.arn = arn: aws: iam :: DataAccount: роль / RoleA

Этот способ является более общим, поскольку коммитер EMR имеет различные ограничения. Вы можете найти больше информации для настройки этого в документации Hadoop: https://hadoop.apache.org/docs/r3.1.1/hadoop-aws/tools/hadoop-aws/assumed_roles.html

...