【问题标题】:S3 bucket policy using Boto3使用 Boto3 的 S3 存储桶策略
【发布时间】:2021-03-29 02:59:05
【问题描述】:

我正在编写一个 boto 脚本来收集日志并将其存储到 S3 存储桶中,我收到错误“botocore.errorfactory.NoSuchBucket: An error occurred (NoSuchBucket) when calling the PutBucketPolicy operation: The specified bucket does not存在”我正在预先创建存储桶,然后尝试将策略附加到存储桶,存储桶也显示在控制台中。我不明白是什么导致了这个问题。

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)

【问题讨论】:

    标签: python amazon-web-services amazon-s3 boto3 boto


    【解决方案1】:

    您可能需要等待存储桶创建完全传播。您可以使用waiter 来执行此操作。请参阅low-level clients 文档或How to use waiters in boto3

    使用客户端的get_waiter()方法,可以获取特定的服务员 从可能的服务员列表中:

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

    然后要真正开始等待,你必须调用服务员的 wait() 传入方法的适当参数的方法:

    # Begin waiting for the S3 bucket, mybucket, to exist
    s3_bucket_exists_waiter.wait(Bucket='mybucket')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-28
      • 1970-01-01
      • 2023-03-31
      • 2011-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-26
      相关资源
      最近更新 更多