Основным требованием является то, что код, работающий на экземпляре 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'}
)