Amazon web services 如何使用SES主体和IAM角色主体编写AWS Bucket策略
我最初将SES设置为接收电子邮件,在此过程中,我创建了一个bucket策略,允许服务将电子邮件放入S3。我现在有一个lambda函数,它应该能够使用STS来承担角色并访问同一个bucket。不幸的是,我无法找到正确的策略来允许服务和IAM角色访问同一个bucket,现在我得到了“拒绝访问”。我使用策略模拟器来验证其他所有功能是否正常工作,例如,我添加了一个通用策略,在aim角色上执行了更多操作,如果我告诉模拟器忽略bucket策略,那么它会说它可以访问文件 我尝试过使用两个语句,一个将主体设置为“services”,另一个设置为aim角色(添加两个只是为了看看其中一个是否有效) 我还试着把它放在一句话中:Amazon web services 如何使用SES主体和IAM角色主体编写AWS Bucket策略,amazon-web-services,amazon-s3,amazon-ses,amazon-policy,Amazon Web Services,Amazon S3,Amazon Ses,Amazon Policy,我最初将SES设置为接收电子邮件,在此过程中,我创建了一个bucket策略,允许服务将电子邮件放入S3。我现在有一个lambda函数,它应该能够使用STS来承担角色并访问同一个bucket。不幸的是,我无法找到正确的策略来允许服务和IAM角色访问同一个bucket,现在我得到了“拒绝访问”。我使用策略模拟器来验证其他所有功能是否正常工作,例如,我添加了一个通用策略,在aim角色上执行了更多操作,如果我告诉模拟器忽略bucket策略,那么它会说它可以访问文件 我尝试过使用两个语句,一个将主体设置为
{
"Version": "2012-10-17",
"Id": "Policy1478013193612",
"Statement": [
{
"Sid": "Stmt1478013187203",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:sts::[id-num-with-no-dashes]:assumed-role/[role-name]/[session-name]",
"arn:aws:iam::[id-num-with-no-dashes]:role/[role-name]"
],
"Service": "ses.amazonaws.com"
},
"Action": [
"s3:PutObject",
"s3:GetObject"
],
"Resource": "arn:aws:s3:::email-01-bucket/*"
}
]
}
顺便说一句,文件路径是:
arn:aws:s3::email-01-bucket/email/[文件id]
我无法放入ListBucket,因为它会抛出错误
感谢您的帮助:D
如果我还需要补充什么,请告诉我
[更新]
为了更容易地找到正确的策略,我将描述我目前在IAM策略模拟器中设置的内容,我假设如果我们可以在这里让它工作,那么它应该在lambda函数上工作
角色:serviceDev
此角色有两个附加的策略
1) 服务项目:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:PutBucketLogging",
"s3:ListBucket"
],
"Resource": "arn:aws:s3:::email-01-bucket/*"
}
]
}
2) AWSLambdaBasic执行角色
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "*"
}
]
}
在策略模拟器中:
下拉菜单Select Service
设置为S3
下拉菜单Select Action
设置为GetObject
在Resource
Object
下,我键入现有文件的路径arn:aws:s3::email-01-bucket/email/U245HNT85UIVPFKRRLHGO0JT86GFJGNCA2FGCG1
(在仔细检查文件是否确实存在后)
一旦我这样做了,现在在左边有一个资源策略
部分,它显示了附加到我的Bucket的Bucket策略以及以下策略:
{
"Version": "2012-10-17",
"Id": "Policy1478013193612",
"Statement": [
{
"Sid": "Stmt1478013187203",
"Effect": "Allow",
"Principal": {
"Service": "ses.amazonaws.com"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::email-01-bucket/*"
}
]
}
现在这里是我迷路的地方,返回到资源对象
区域,在那里我指定现有文件的路径有一个标记为包含资源策略
的复选框,如果我取消选中该复选框,则模拟器会说允许该权限,但如果我选中该复选框,则会出现以下错误:
无法执行模拟!:模拟失败代码>据我所知,您需要一个S3 bucket策略(允许SE将对象放入S3 bucket),并且您需要一个IAM角色,您的Lambda函数将使用该角色列出该bucket并将/获取对象放入该bucket。IAM角色还需要信任关系,允许AWS Lambda服务代表您承担该角色(这样您就不必在代码中手动承担该角色)
具体而言:
- 不要将Lambda权限添加到S3 bucket策略
- 不要在Lambda中使用STS来承担角色;只需使用该角色配置Lambda
- 通常,您不必在Lambda函数中显式编写与担任角色或获取权限相关的任何代码(Lambda服务为您完成所有工作)
S3桶策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowSESPuts",
"Effect": "Allow",
"Principal": {
"Service": "ses.amazonaws.com"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::BUCKET-NAME/*",
"Condition": {
"StringEquals": {
"aws:Referer": "AWSACCOUNTID"
}
}
}
]
}
IAM角色:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "sidlist",
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::BUCKET-NAME"
},
{
"Sid": "sidputget",
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject"
],
"Resource": "arn:aws:s3:::BUCKET-NAME/*"
}
]
}
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
IAM角色上的信任关系:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
我不确定您为什么在示例中包括s3:PutBucketLogging,但如果您确实需要它,那么将其添加到Lambda的IAM角色中,以对抗arn:aws:s3:::BUCKET-NAME资源(而不是arn:aws:s3:::BUCKET-NAME/*资源——这是对BUCKET的操作,而不是对对象的操作)据我所知,您需要一个s3 BUCKET策略(允许SES将对象放入S3 bucket)并且您需要一个IAM角色,Lambda函数将使用该角色列出该bucket并在该bucket中放入/获取对象。IAM角色还需要一个信任关系,允许AWS Lambda服务代表您承担该角色(这样您就不必在代码中手动承担该角色)
具体而言:
- 不要将Lambda权限添加到S3 bucket策略
- 不要在Lambda中使用STS来承担角色;只需使用该角色配置Lambda
- 通常,您不必在Lambda函数中显式编写与担任角色或获取权限相关的任何代码(Lambda服务为您完成所有工作)
S3桶策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowSESPuts",
"Effect": "Allow",
"Principal": {
"Service": "ses.amazonaws.com"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::BUCKET-NAME/*",
"Condition": {
"StringEquals": {
"aws:Referer": "AWSACCOUNTID"
}
}
}
]
}
IAM角色:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "sidlist",
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::BUCKET-NAME"
},
{
"Sid": "sidputget",
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject"
],
"Resource": "arn:aws:s3:::BUCKET-NAME/*"
}
]
}
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
IAM角色上的信任关系:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
我不确定您为什么在示例中包括s3:PutBucketLogging,但如果您确实需要它,请将其添加到Lambda的IAM角色中,以对抗arn:aws:s3::BUCKET-NAME资源(而不是arn:aws:s3:::BUCKET-NAME/*资源——这是对BUCKET的操作,而不是对对象的操作)向Lambda函数授予权限的典型方式是,与Lambda函数的IAM角色关联的策略授予权限。通常情况下,您不会通过S3 bucket策略执行此操作(除非您特别尝试拒绝除IAM角色以外的所有主体)。正如我在开始时提到的,bucket策略是为SES服务添加的,我仍然需要此服务才能工作,因此无法删除它。我还尝试使用bucket策略,其中只有SES作为主体,然后在IAM角色上使用一个单独的策略,但仍然得到“拒绝访问”。bucket策略确实需要SES权限,但它不需要,通常也不应该有Lambda权限。独立于bucket策略调试Lambda权限。@jarmod我做了,在验证其他一切正常工作时,我创建了一个IAM角色策略,包含所有必需的S3 bucket相关操作。在策略模拟器中切换“Include Resourc”时e Policy“option“off”它可以工作,但如果我将其打开则不行。bucket策略似乎与角色权限冲突。bucket策略不会与IAM策略冲突,除非