Amazon web services 定义工作角色的困难

Amazon web services 定义工作角色的困难,amazon-web-services,amazon-s3,aws-lambda,Amazon Web Services,Amazon S3,Aws Lambda,我正在尝试构造一个AWS Lambda函数,它可以下载一些数据并将其写入S3存储桶。我遇到的问题是,对S3的写入操作本身会引发PermissionDenied错误 这反过来意味着我没有正确地编写角色。然而,我不确定我做错了什么 我有五个桶,都是mta-gtfs-N上的一些变体。我已将以下角色分配给Lambda函数: { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action"

我正在尝试构造一个AWS Lambda函数,它可以下载一些数据并将其写入S3存储桶。我遇到的问题是,对S3的写入操作本身会引发
PermissionDenied
错误

这反过来意味着我没有正确地编写角色。然而,我不确定我做错了什么

我有五个桶,都是mta-gtfs-N上的一些变体。我已将以下角色分配给Lambda函数:

{   "Version": "2012-10-17",   "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents",
        "s3:*"
      ],
      "Resource": [ 
"arn:aws:s3:::mta-gtfs-1", 
"arn:aws:s3:::mta-gtfs-21", 
"arn:aws:s3:::mta-gtfs-11", 
"arn:aws:s3:::mta-gtfs-16", 
"arn:aws:s3:::mta-gtfs-2" 
]
    }   
] }

有人能发现我的错误吗?

您需要在资源字符串的末尾添加一个
/*
,以便访问bucket中的操作。示例:
arn:aws:s3::mta-gtfs-1/*

因此,您的
资源
数组应该是

"Resource": [ 
  "arn:aws:s3:::mta-gtfs-1/*", 
  "arn:aws:s3:::mta-gtfs-21/*", 
  "arn:aws:s3:::mta-gtfs-11/*", 
  "arn:aws:s3:::mta-gtfs-16/*", 
  "arn:aws:s3:::mta-gtfs-2/*" 
]
上面资源部分的策略将允许像
Get
Put
对象这样的操作。如果要执行诸如
S3:ListBucket
之类的bucket级操作,则需要省略
/*
,并以当前使用的方式使用资源名称,但对于诸如
S3:*Object:
之类的操作,则需要
/*
(它也可以是
/home/*
之类的“文件夹”前缀)

这是一个用于
测试的
存储桶。注意
/*

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:ListBucket"],
      "Resource": ["arn:aws:s3:::test"]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:GetObject",
        "s3:DeleteObject"
      ],
      "Resource": ["arn:aws:s3:::test/*"]
    }
  ]
}

您需要在资源字符串的末尾添加一个
/*
,以便访问bucket中的操作。示例:
arn:aws:s3::mta-gtfs-1/*

因此,您的
资源
数组应该是

"Resource": [ 
  "arn:aws:s3:::mta-gtfs-1/*", 
  "arn:aws:s3:::mta-gtfs-21/*", 
  "arn:aws:s3:::mta-gtfs-11/*", 
  "arn:aws:s3:::mta-gtfs-16/*", 
  "arn:aws:s3:::mta-gtfs-2/*" 
]
上面资源部分的策略将允许像
Get
Put
对象这样的操作。如果要执行诸如
S3:ListBucket
之类的bucket级操作,则需要省略
/*
,并以当前使用的方式使用资源名称,但对于诸如
S3:*Object:
之类的操作,则需要
/*
(它也可以是
/home/*
之类的“文件夹”前缀)

这是一个用于
测试的
存储桶。注意
/*

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:ListBucket"],
      "Resource": ["arn:aws:s3:::test"]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:GetObject",
        "s3:DeleteObject"
      ],
      "Resource": ["arn:aws:s3:::test/*"]
    }
  ]
}

您的政策应改写为:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::mta-gtfs-*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:PutObject",
        "s3:DeleteObject",
        "s3:AbortMultipartUpload",
        "s3:ListMultipartUploadParts",
        "s3:ListBucketMultipartUploads"
      ],
      "Resource": [
        "arn:aws:s3:::mta-gtfs-*/*"
      ]
    }
  ]
}

您的政策应改写为:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::mta-gtfs-*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:PutObject",
        "s3:DeleteObject",
        "s3:AbortMultipartUpload",
        "s3:ListMultipartUploadParts",
        "s3:ListBucketMultipartUploads"
      ],
      "Resource": [
        "arn:aws:s3:::mta-gtfs-*/*"
      ]
    }
  ]
}

接受这个答案是因为当哈立德的答案起作用时,这个解释了为什么它起作用。接受这个答案是因为当哈立德的答案起作用时,这个解释了为什么它起作用。