使用Boto3编写S3桶策略

3

我正在编写一个boto脚本来收集日志并将其存储到S3存储桶中,但是我遇到了一个错误:“botocore.errorfactory.NoSuchBucket:在调用PutBucketPolicy操作时发生错误(NoSuchBucket):指定的存储桶不存在”。我先创建存储桶,然后尝试将策略附加到存储桶,存储桶也出现在控制台中,但我不明白可能是什么原因导致这个问题。

import boto3
import sys
import json
import time 
iam = boto3.client('iam')
sts = boto3.client('sts')
ec2 = boto3.resource('ec2')
cloudtrail = boto3.client('cloudtrail')
s3  = boto3.client('s3')


s3.create_bucket(Bucket='goodbucket3')
# Create a bucket policy
bucket_name = 'goodbucket3'
bucket_policy = {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {"Service": "cloudtrail.amazonaws.com"},
            "Action": "s3:GetBucketAcl",
            "Resource": f"arn:aws:s3:::{bucket_name}"
        },
        {
            "Effect": "Allow",
            "Principal": {"Service": "cloudtrail.amazonaws.com"},
            "Action": 
            "s3:PutObject",
            "s3:PutObjectAcl"
            "s3:GetObject"
            "s3:GetObjectAcl"
            "s3:DeleteObject"
            "Resource": f"arn:aws:s3:::{bucket_name}/AWSLogs/XXXXXXXX/*",
            "Condition": {"StringEquals": {"s3:x-amz-acl": "bucket-owner-full-control"}}
        }
    ]
}

# Convert the policy from JSON dict to string
bucket_policy = json.dumps(bucket_policy)

# Set the new policy
s3.put_bucket_policy(Bucket='bucket_name', Policy=bucket_policy)
result = s3.get_bucket_policy(Bucket='bucket_name')

logs = cloudtrail.create_trail(
    Name='GoodTrail',
    S3BucketName='bucket_name',
)
print(logs)
1个回答

3
您可能需要等待存储桶创建完全传播。您可以使用 waiter 完成这一过程。请参阅 低级客户端 文档或如何在 boto3 中使用 waiters

通过使用客户端的 get_waiter() 方法,您可以从可能的 waiters 列表中获取特定的 waiter:

# Retrieve waiter instance that will wait till a specified bucket exists
s3_bucket_exists_waiter = s3.get_waiter('bucket_exists')

然后,要开始等待,您必须使用适当的参数调用wait()方法来调用服务员的wait()方法:
# Begin waiting for the S3 bucket, mybucket, to exist
s3_bucket_exists_waiter.wait(Bucket='mybucket')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接