是否可以仅使用 IAM 角色授予 AWS 服务(例如 API 网关、Secrets Manager)调用 Lambda 函数的权限?通常这是在函数的策略(基于资源的策略)中完成的,但我想知道这是否是唯一的方法。使用 IAM 的优势在于,一个策略可以允许执行多个 Lambda,而无需为每个函数管理一个策略的开销。(请注意,我不是在问 Lambda IAM +执行角色+,它在函数执行时确定权限。)
关于Lambda 权限模型建议使用 IAM 角色代替 Lambda 函数策略:
除了使用 Lambda 函数策略外,您还可以创建另一个 IAM 角色,授予事件源(例如 Amazon S3 或 DynamoDB)调用 Lambda 函数的权限。不过,您可能会发现资源策略更易于设置,而且它们让您可以更轻松地跟踪哪些事件源有权调用您的 Lambda 函数。
然而,经过深入研究,我并没有达到宣传的效果。我尝试授予两个服务调用 Lambda 的权限:API 网关和 Secrets Manager。在这两种情况下,我发现这些服务都需要在函数策略中授予访问权限,而不是 IAM 角色。
服务 1:Secrets Manager
我正在 Secrets Manager 中轮换 RDS 凭证。通常,配置密钥的轮换计划后,Secrets Manager 会创建 Lambda 来执行轮换,但就我而言,我不喜欢 Lambda 函数的长自定义名称,因此我创建了自己的名称。我尝试授予 Secrets Manager 使用 IAM 角色调用任何 Lambda 的权限,因此我创建了以下角色:
信任关系:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowApiGatewayToAssumeRole",
"Effect": "Allow",
"Principal": {
"Service": "apigateway.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
权限:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowInvokeAnyLambda",
"Effect": "Allow",
"Action": "lambda:InvokeFunction",
"Resource": "*"
}
]
}
在撰写本文时,AWS 控制台还没有办法设置自定义 Lambda 来轮换 RDS 凭证,因此我使用了 CLI:
$ aws secretsmanager rotate-secret --secret-id 'rds/my-db/account' --rotation-lambda-arn 'arn:aws:lambda:us-east-1:xxxxxxxxxxxx:function:rotate-rds-secret' --rotation-rules AutomaticallyAfterDays=1
An error occurred (AccessDeniedException) when calling the RotateSecret operation: Secrets Manager cannot invoke the specified Lambda function. Ensure that the function policy grants access to the principal secretsmanager.amazonaws.com
因此,看起来 Secrets Manager 不使用此 IAM 角色来调用 Lambda。而且似乎没有办法配置 Secrets Manager 以使用特定的 IAM 角色。
服务2:API网关
我正在使用 API Gateway 调用我的 Lambda 函数。API Gateway 有两种不同的集成类型支持调用 Lambda:(1) Lambda 函数和 (2) AWS 服务 (https://docs.aws.amazon.com/apigateway/latest/developerguide/integrating-api-with-aws-services-lambda.html)。
使用 Lambda 函数集成时,与 Secrets Manager 的情况相同 - 您需要使用函数策略授予 API Gateway 调用访问权限。但是使用 AWS 服务集成时,您实际上指定了 API Gateway 应该使用哪个 IAM 角色来调用 Lambda。这对我来说很有意义,因为像 API Gateway 这样的服务如何知道使用哪个 IAM 角色来调用 Lambda?然而,在使用 Lambda 函数集成时,无法选择 IAM 角色。或者有...
交叉发布于:https://forums.aws.amazon.com/message.jspa?messageID=844660#844660
答案1
如果我理解正确的话。您正在寻找用于 LambdaProxy 集成的 IAM 角色。LambdaProxy 确实允许使用 IAM 角色。以下是我使用的代码片段:
Resources:
APILambdaInvokeRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Principal:
Service:
- "apigateway.amazonaws.com"
Action:
- "sts:AssumeRole"
APILambdaInvokePolicy:
Type: AWS::IAM::Policy
Properties:
PolicyName: LambdaInvokePolicy
PolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Action: "lambda:InvokeFunction"
Resource: "*"
Roles:
- !Ref APILambdaInvokeRole