如何通过Lambda别名限制执行角色的S3写入权限?
问题:通过Lambda别名限制S3写入权限
希望设计AWS Lambda执行角色策略,通过Lambda别名限制访问权限:仅带有“Prod”别名的Lambda函数可向特定S3存储桶写入数据。尝试使用
lambda:SourceFunctionArn条件,但该条件不包含别名或使用方式有误。需求是所有函数变体可写入my-bucket-test,仅Prod别名可写入my-bucket-data,请问是否可行?附原策略示例:
{ "Version": "2012-10-17", "Statement": [{ "Sid": "Logging", "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "arn:aws:logs:*:*:log-group:/aws/lambda/MyLambda_*" }, { "Sid": "S3", "Effect": "Allow", "Action": "s3:PutObject", "Resource": [ "arn:aws:s3:::my-bucket-test/*" ] }, { "Sid": "S3Prod", "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::my-bucket-data/*", "Condition": { "StringLike": { "lambda:SourceFunctionArn": "*Prod" } } } ] }
解决方案
这个需求完全可行,但原策略的问题在于**lambda:SourceFunctionArn条件不会包含Lambda别名信息**,正确的做法是使用lambda:SourceAlias条件来识别调用的别名。
以下是修正后的策略:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Logging", "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "arn:aws:logs:*:*:log-group:/aws/lambda/MyLambda_*" }, { "Sid": "S3AllVariants", "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::my-bucket-test/*" }, { "Sid": "S3OnlyProdAlias", "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::my-bucket-data/*", "Condition": { "StringEquals": { "lambda:SourceAlias": "Prod" } } } ] }
关键说明:
lambda:SourceAlias是AWS专门用于识别Lambda调用时使用的别名的条件键,当通过别名触发Lambda时,该值会被设置为对应的别名名称。- 使用
StringEquals而非StringLike可以精准匹配别名,避免误匹配其他包含"Prod"字符的内容。 - 所有Lambda变体(包括无别名的版本、其他别名)都能正常写入
my-bucket-test,只有通过"Prod"别名触发的Lambda才能写入my-bucket-data。
注意:如果Lambda是直接通过版本ARN调用而非别名,lambda:SourceAlias不会有值,这类调用将无法通过第三个Statement的权限检查,符合需求。
内容的提问来源于stack exchange,提问作者Aleksandr Krymskiy
相关产品推荐
相关产品推荐

