boto3.exceptions.S3UploadFailedError: 调用 PutObject 操作时发生错误 (AccessDenied):拒绝访问

Dia*_*e12 3 ubuntu amazon-s3 amazon-ec2 amazon-web-services boto3

我正在运行一个 Amazon EC2 (ubuntu) 实例,它每天输出一个 JSON 文件。我现在正在尝试将此 JSON 复制到 Amazon S3,以便我最终可以将其下载到我的本地计算机。按照此处的说明(在本地机器上从 ubuntu (AWS EC2) 读取文件?),我使用 boto3 将 JSON 从 ubuntu 复制到 S3:

import boto3
print("This script uploads the SF events JSON to s3")

ACCESS_ID = 'xxxxxxxx'
ACCESS_KEY = 'xxxxxxx'
s3 = boto3.resource('s3',
         aws_access_key_id=ACCESS_ID,
         aws_secret_access_key= ACCESS_KEY)

def upload_file_to_s3(s3_path, local_path):
    bucket = s3_path.split('/')[2]
    print(bucket)
    file_path = '/'.join(s3_path.split('/')[3:])
    print(file_path)
    response = s3.Object(bucket, file_path).upload_file(local_path)
    print(response)

s3_path = "s3://mybucket/sf_events.json"
local_path = "/home/ubuntu/bandsintown/sf_events.json"
upload_file_to_s3(s3_path, local_path)
Run Code Online (Sandbox Code Playgroud)

我在这里使用的凭证来自在 Amazon Identity and Access Management (IAM) 中创建一个新用户:附上截图。

在此处输入图片说明

但是,当我运行此脚本时,出现以下错误:

boto3.exceptions.S3UploadFailedError: Failed to upload /home/ubuntu/bandsintown/sf_events.json to mybucket/sf_events.json: An error occurred (AccessDenied) when calling the PutObject operation: Access Denied
Run Code Online (Sandbox Code Playgroud)

我还尝试将 IAM 角色附加到 EC2 实例并赋予该角色完整的 s3 权限 - 但仍然没有运气(见下图)。

在此处输入图片说明

在此处输入图片说明

这似乎是一个权限问题 - 谁能告诉我如何开始解决这个问题?我需要亚马逊 CLI 吗?我还在 boto3 文档中阅读我的脚本中可能需要一个 aws_session_token 参数。

很简单,我迷路了。谢谢。

Aru*_*han 5

由于它是 ec2,您可以为实例分配 IAM 角色并为该角色分配权限。此外,您不需要在代码中对凭据进行硬编码。

https://aws.amazon.com/premiumsupport/knowledge-center/assign-iam-role-ec2-instance/

您可以将此策略用于 S3 上传

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "statement1",
            "Effect": "Allow",
            "Action":   ["s3:PutObject","s3:PutObjectAcl"],
            "Resource": "arn:aws:s3:::examplebucket/*"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

以下是将策略附加到 IAM 角色的方法:https : //docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html

并将您的代码更改为:

s3 = boto3.resource('s3')
Run Code Online (Sandbox Code Playgroud)