Предоставление кода в экземпляре EC2 доступа к корзине S3 другой учетной записи - PullRequest
0 голосов
/ 09 января 2020

У меня есть две AWS учетные записи: A и B.

Я загрузил фрагмент кода Python в экземпляр Amazon EC2, работающий в учетной записи A. Я хочу поместить объект в корзину S3 учетной записи B с помощью этого Python кода.

Как его установить? Спасибо

Ответы [ 2 ]

0 голосов
/ 09 января 2020

Основным требованием является то, что код, работающий на экземпляре Amazon EC2, имеет учетные данные , которые разрешают доступ к корзине Amazon S3 в учетной записи B. (Я предполагаю, что корзина не иметь доступ publi c.)

Лучший метод предоставления учетных данных приложению, запущенному на экземпляре Amazon EC2, заключается в назначении роли IAM для экземпляра . Это автоматически предоставит набор учетных данных для приложений в экземпляре, которые используют AWS SDK. (Для Python это будет boto3 SDK.)

Роль IAM должна как минимум иметь разрешение на использование Amazon S3 в целевом сегменте:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:PutObjectACL"
            ],
            "Resource": "arn:aws:s3:::example-bucket/*"
        }
    ]
}

Однако, несмотря на то, что это позволяет роли IAM от учетной записи A вызвать ячейку в учетной записи B, учетная запись A фактически не может предоставить доступ к ресурсам учетной записи B. Только учетная запись B может разрешить доступ к ресурсам учетной записи B.

Может показаться странным, но:

  • Роль IAM в учетной записи A необходимо разрешить вызывать S3, AND
  • Учетная запись B должна разрешить роли из Учетной записи A доступ к ресурсам в Учетной записи B

Самый простой способ добиться второго маркера - это добавить политику Bucket в корзину в Учетная запись B, которая разрешает роли IAM от учетной записи A разрешение на использование корзины.

Политика корзины будет выглядеть примерно так:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111111111111:role/ROLENAME"  <-- Change this
            },
            "Action": [
                "s3:PutObject",
                "s3:PutObjectACL"
            ],
            "Resource": "arn:aws:s3:::example-bucket/*"
        }
    ]
}

Кроме того, при создании объекта в учетной записи B она жизненно важно для использовать ACL bucket-owner-full-control , Это передаточное управление объектом для учетной записи B. Если это не будет сделано, то учетная запись B не сможет получить доступ (или даже удалить!) К объекту.

Таким образом, в Python ваш код будет выглядеть примерно так:

import boto3

s3_client = boto3.client('s3')
response = s3_client.upload_file(
    Filename='/tmp/foo.txt',
    Bucket='my-bucket',
    Key='foo.txt',
    ExtraArgs={'ACL': 'bucket-owner-full-control'}
)
0 голосов
/ 09 января 2020

Вы можете сделать это несколькими способами.

Предполагается метод роли

Роль IAM в EC2A может принять roleB в AccountB для загрузки файла в S3 в AccountB. Это рекомендуемый метод. потому что учетные данные не нужно хранить или жестко кодировать.

  1. Этот метод требует, чтобы экземпляру в учетной записи A была назначена роль IAM. https://aws.amazon.com/premiumsupport/knowledge-center/assign-iam-role-ec2-instance/
  2. Разрешить роли IAM, которую мы создали на шаге 1, принять роль (назовем ее ролью B) в учетной записи B. Вам необходимо создать политику IAM и назначьте его на роль IAM.

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "AWS": "arn:aws:iam::********:role/RoleB"
          },
          "Action": "sts:AssumeRole"
        }
      ]
    }
    
  3. В учетной записи B необходимо создать роль B

  4. настроить политику доверия в роли B, чтобы разрешить любому пользователю , группа или роль в учетной записи A для принятия роли B

    {
      "Version": "2012-10-17",
      "Statement": [
      {
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam::********:root"
        },
        "Action": "sts:AssumeRole"
      }]
    }
    

    https://docs.aws.amazon.com/directoryservice/latest/admin-guide/edit_trust.html

  5. Наконец, необходимо назначить политику IAM к роли B, которая предоставляет доступ S3.

    {
      "Type": "AWS::IAM::Policy",
      "Properties": {
        "PolicyName": "S3WritePolicy",
        "PolicyDocument": {
          "Statement": [
            {
              "Action": "s3:PutObject",
              "Effect": "Allow",
              "Resource": "Fn::Sub": "arn:aws:s3:::bucket-name/*"
            }
          ]
        }
      }
    }
    

Использование прямых учетных данных

Код python может включать учетные данные, которые непосредственно дают ему разрешения для загрузки файла на S3 в учетной записи B. Для этого вы можете создать пользователя в IAM учетной записи B и использовать учетные данные непосредственно для кода python.

client = boto3.client('s3', aws_access_key_id='access key',
    aws_secret_access_key='secret key')

Ссылка: как создать пользователя iam - https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...