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

Aak*_*eth 5 amazon-s3 amazon-iam boto3

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

铲斗设置:

test-bucket/
  service/
    micro-a/
    micro-b/    
Run Code Online (Sandbox Code Playgroud)

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

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

角色 ID 引用此 IAM 角色,该角色根据微服务用户代理授予对存储桶中每个微服务特定文件夹的访问权限,即微服务 A 的用户代理可能是“micro-a”,因此应该有权访问但不能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}/*"
                    ]
                }
            }
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

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

import boto3
import botocore

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

session = boto3.session.Session(botocore_session=session)
print session
Run Code Online (Sandbox Code Playgroud)

导致:

AttributeError: 'str' object has no attribute 'user_agent_name'
Run Code Online (Sandbox Code Playgroud)

Aak*_*eth 6

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(
  ...
)
Run Code Online (Sandbox Code Playgroud)