Как исправить AccessDenied, вызвав CopyObject
Я пытаюсь скопировать файлы из корзины в учетной записи A в другую корзину, но в учетной записи B. Когда я пытаюсь синхронизировать файлы с командой
aws s3 sync s3://BUCKET_A s3://BUCKET_B
Возвращает следующий вывод:
copy failed: s3://BUCKET_A to s3://BUCKET_B An error occurred (AccessDenied) when calling the CopyObject operation: Access Denied
Это политика, которая была прикреплена к пользователю, созданному в учетной записи B (куда будут скопированы файлы из корзины A):
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetObject",
"s3:PutObject",
"s3:PutObjectAcl"
],
"Resource": [
"arn:aws:s3:::BUCKET_A",
"arn:aws:s3::: BUCKET_A/*"
]
},
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetObject",
"s3:PutObject",
"s3:PutObjectAcl"
],
"Resource": [
"arn:aws:s3:::BUCKET_B",
"arn:aws:s3:::BUCKET_B/*"
]
}
]
}
Возможно, я пропустил какое-то разрешение? Я не нахожу разрешения CopyObject
добавить в мою политику пользователя / корзины
10 ответов
На стороне вашей политики ролей IAM вам потребуется следующее:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetObject",
"s3:PutObject",
"s3:PutObjectAcl"
],
"Resource": [
"arn:aws:s3:::BUCKET_A",
"arn:aws:s3::: BUCKET_A/*"
]
},
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetObject",
"s3:PutObject",
"s3:PutObjectAcl"
],
"Resource": [
"arn:aws:s3:::BUCKET_B",
"arn:aws:s3:::BUCKET_B/*"
]
}
]
}
Вам нужно добавить эти разрешения в BUCKET_B
{
"Sid": "Example permissions",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::your_iam_policy"
},
"Action": [
"s3:ListBucket",
"s3:GetObject",
"s3:PutObject",
"s3:PutObjectAcl"
],
],
"Resource": [
"arn:aws:s3:::BUCKET_B"
]
}
В моем случае у меня не было проблем с некоторыми объектами, однако у одного из них была та же ошибка CopyObject, указанная в вопросе. Я также использовал команду синхронизации между сегментами кросс-аккаунтов.
Итак, я взглянул на историю событий в AWS CloudTrail (поскольку у меня была настроена облачная трасса) - это помогает увидеть, какие вызовы API вызываются. Однако у меня не было включено ведение журнала событий для сегментов S3 и объектов , поэтому я попробовал внести несколько изменений, начиная с put *, и это сработало. Затем я быстро сузился до того, что мне было нужно.
В конечном итоге это позволило мне добавить это разрешение в мою политику корзины : s3:PutObjectTagging .
Надеюсь, это тоже поможет вам!
Вам не хватает
s3:GetObjectTagging
и
s3:PutObjectTagging
разрешения, указанные здесь: https://medium.com/collaborne-engineering/s3-copyobject-access-denied-5f7a6fe0393e .
В моем случае это сработало.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:PutObject",
"s3:GetObjectAcl",
"s3:GetObject",
"s3:PutObjectVersionAcl",
"s3:GetObjectTagging",
"s3:DeleteObject",
"s3:GetBucketLocation",
"s3:PutObjectAcl"
],
"Resource": [
"arn:aws:s3:::source-bucket/*",
"arn:aws:s3:::destination-bucket/*",
"arn:aws:s3:::source-bucket",
"arn:aws:s3:::destination-bucket"
]
},
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "*"
}
]
}
Я следовал этому подходу
https://aws.amazon.com/premiumsupport/knowledge-center/copy-s3-objects-account/
для копирования/синхронизации объектов из исходной корзины учетной записи aws в целевую корзину учетной записи aws. Это сработало хорошо для меня.
Вам необходимо настроить AWS CLI на локальном компьютере с пользователем IAM в учетной записи B.
Вы можете иметь столько профилей, сколько хотите в вашей локальной конфигурации cli. Дополнительные сведения см. В разделе Конфигурация интерфейса командной строки AWS.
Теперь при копировании добавьте параметр --profile в команду синхронизации. например.
aws s3 sync s3://BUCKET_A s3://BUCKET_B --profile <NEW-AWS-CLI-PROFILE-FOR-ACCOUNT-B>
Обратите внимание, что я основываю свой ответ на ответе Майкла .
В моем случае мне нужно было иметь в дополнение к s3:GetObject и s3:ListObject мне нужно было разрешение s3:GetObjectTagging
Для дальнейшего справки
Таким образом, моя политика корзины исходного кода выглядела следующим образом:
{
"Sid": "DelegateS3Access",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::destination-account:root"
},
"Action": [
"s3:ListBucket",
"s3:GetObject",
"s3:GetObjectTagging"
],
"Resource": [
"arn:aws:s3:::source-bucket/*",
"arn:aws:s3:::source-bucket"
]
}
Пожалуйста, имейте в виду, что у меня было
Вероятно, это связано с шифрованием объекта в целевом сегменте. Глядя на вставленную вами роль IAM, похоже, что все необходимые разрешения предоставлены.
Чтобы решить эту проблему, запустите ту же команду и добавьте к ней
--sse AES256
.
aws s3 sync s3://BUCKET_A s3://BUCKET_B --sse AES256
Чтобы проверить настройки шифрования целевого сегмента, вы должны проверить политику сегмента, которая должна иметь условие:
...
"Condition": {
"StringNotEquals": {
"s3:x-amz-server-side-encryption": "AES256"
}
}
...
Вы можете найти политику корзины на вкладке
Permissions
=>
Bucket policy
в S3 GUI, как только вы окажетесь в целевом сегменте.
1 - отключить блокировку публичного доступа 2 - оставить ведро незашифрованным 3 - найти свой общедоступный IP:4 - добавить политику ниже в корзину s3
{
"Version": "2008-10-17",
"Id": "Policy1357935677554",
"Statement": [
{
"Sid": "Stmt1357935647218",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::YOUR-S3-BUCKET-NAME",
"Condition": {
"IpAddress": {
"aws:SourceIp": "YOUR-PUBLIC-IP/32"
}
}
},
{
"Sid": "Stmt1357935676138",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::YOUR-S3-BUCKET-NAME/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "YOUR-PUBLIC-IP/32"
}
}
}
]
}
AWSS3МИГРАЦИЯ
1 . CREATECREDENTIAL для учетной записи, из которой вы запускаете команду aws_s3_sync_bucketsource_bucketdest:awsgui, mysecuritycredential, acess_keys, create_new_access_key;
1b. запустите команду: aws_configure в оболочке bash;
2. awsgui, s3, bucket_x1, overview, выбрать все каталоги, действия, make_everything_public;
3. awsgui, s3, bucket_x1, разрешение, control_list, общий доступ;
4. awsgui, s3, bucket_x1, обзор, выбор всех каталогов, действий, изменение класса хранилища на стандартный.
5. сделайте пункты 2, 3, 4 также для bucket_2.
ОБОЗНАЧЕНИЕ: bucket_x1 - источник, bucket_x2 - место назначения.