Boto3设置自定义用户代理以测试S3访问策略

时间:2017-05-17 20:55:42

标签: amazon-s3 boto3 amazon-iam

我正在使用boto3创建一些测试来验证S3存储桶上的微服务访问策略。

铲斗设置:

test-bucket/
  service/
    micro-a/
    micro-b/    

此存储桶策略旨在限制对具有指定角色的用户的访问权限:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowAccessIfInThisRole",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::test-bucket/*",
            "Condition": {
                "StringNotLike": {
                    "aws:userid": "*role-id*"
                }
            }
        }
    ]
}

角色ID引用此IAM角色,该角色基于微服务用户代理授予对存储桶中每个微服务特定文件夹的访问权限,即微服务A的用户代理可能是微观'微型&#39 ;因此应该可以访问test-bucket/service/micro-a/*但不能访问test-bucket/service/micro-b/*

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "arn:aws:s3:::as-bucket-test/service/${aws:useragent}/*"
            ]
        },
        {
            "Sid": "AllowListingOfUserFolder",
            "Action": [
                "s3:ListBucket"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::as-bucket-test"
            ],
            "Condition": {
                "StringLike": {
                    "s3:prefix": [
                        "service/${aws:useragent}/*"
                    ]
                }
            }
        }
    ]
}

我不了解如何创建boto3客户端,以便我可以设置用户代理多个项目来验证不同的访问策略。这就是我到目前为止所做的:

import boto3
import botocore

session = botocore.session.Session(
    user_agent_name="something"
)

session = boto3.session.Session(botocore_session=session)
print session

导致:

AttributeError: 'str' object has no attribute 'user_agent_name'

1 个答案:

答案 0 :(得分:2)

S3客户端采用配置对象,您可以在其中设置自定义配置选项,包括设置自定义用户代理

from boto3 import client
import botocore

# Create a config
session_config = botocore.config.Config(
  user_agent="new_user_agent"
)

s3 = client(
  's3',
  config=session_config
)

# Make an API call
response = s3.put_object(
  ...
)