我在同一个 AWS 账户中有 2 个 python lambda 函数。函数 1 启用了函数 url 功能,并启用了 AWS_IAM 身份验证。函数 2 旨在使用 urllib 库调用函数 1。我在功能 1 上设置了以下资源策略
{
"Version": "2012-10-17",
"Id": "default",
"Statement": [
{
"Sid": "my-custom-id001",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::xxxxxxxxxxxx:role/service-role/Function-2-role"
},
"Action": "lambda:InvokeFunctionUrl",
"Resource": "arn:aws:lambda:ap-southeast-2:xxxxxxxxxxxx:function:Function-1",
"Condition": {
"StringEquals": {
"lambda:FunctionUrlAuthType": "AWS_IAM"
}
}
}
]
}
我希望这将允许函数 2 调用函数 1,但当我尝试从 AWS 控制台(通过在函数 2 上使用“test”)时,我收到 403 Forbidden。我知道这不是两端的代码,因为当我将身份验证从 AWS_IAM 更改为 NONE 时,调用工作正常。我哪里错了?我还尝试为 Function 2 提供一个明确的策略,允许它调用 Function 1 的函数 url,得到相同的结果:
功能 2 的政策
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "lambda:InvokeFunctionUrl",
"Resource": "arn:aws:lambda:ap-southeast-2:xxxxxxxxxxxx:function:Function-1"
}
]
}
您的配置正确,应该在相同和不同的账户中工作,唯一缺少的部分是将 AWS Signature V4 添加到每个请求。
如果您的函数 URL 使用 AWS_IAM 身份验证类型,则您必须对每个函数进行签名 使用 AWS 签名版本 4 (SigV4) 的 HTTP 请求。工具如 awscurl、Postman 和 AWS SigV4 代理提供内置方法来签署您的 使用 SigV4 请求。
请参阅此文档 https://docs.aws.amazon.com/lambda/latest/dg/urls-invocation.html 并选择适合您的技术的库。