[英]Invoke an AWS lambda across regions
我有三个 lambda 函数:boss、worker1、worker2。 使用 boto3.client.invoke 时,我可以从老板那里呼叫 worker1。 这两个在同一个地区。
worker2 位于一个单独的区域。 尝试从老板调用 worker2 时,返回以下错误:
“调用 Invoke 操作时发生错误 (ResourceNotFoundException):在此区域 ('us-west-2') 中无法访问来自 'us-east-1' 的函数”。 boss 具有执行角色,具有以下权限:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"lambda:InvokeFunction"
],
"Effect": "Allow",
"Resource": "arn:aws:lambda:*:*:*"
}
]
}
请帮助澄清需要如何传达权限才能使其工作。 谢谢
编辑:master 和 worker1 在 us-west-2 中,worker1 在 us-east-1 中。
这是用于从 master 调用 worker 的代码:
def lambda_handler(event, context):
function_name = "arn:aws:lambda:us-east-1-...:function:worker_2"
lambda_client = boto3.client('lambda')
payload = json.dumps({"body-json": "payload string")
response = lambda_client.invoke(
FunctionName = function_name,
Payload = payload
)
response_payload = response['Payload'].read()
response_arr = json.loads(response_payload)
return response_arr['answer']
谢谢大家的意见。 @Michael-sqlbot 关于 AWS 客户端库默认向本地区域发送请求的评论帮助我找到了解决方案。 对于 Python,库是 boto3。 阅读文档后,不清楚如何设置区域。 正是这篇博客文章提供了(简单的)答案:
client = boto3.client('lambda', region_name='us-west-2')
您是对的 Michael,区域之间从一个 lambda 到另一个 lambda 的用例是复杂的。 如果任何其他不熟悉 boto3 的人在尝试获取其他资源(从 lambda 到 ec2、从 lambda 到 s3 等)跨区域工作时遇到相同的错误,我将在此处留下这个答案。
谢谢
您需要设置worker2
lambda 函数的区域如下:
arn:aws:lambda:us-east-1-...:function:worker_2
因此,代码将如下所示:
function_name = "arn:aws:lambda:us-east-1-...:function:worker_2"
lambda_client = boto3.client('lambda')
payload = json.dumps({"body-json": "payload string")
response = lambda_client.invoke(
FunctionName = function_name,
Payload = payload
)
太好了,现在您需要通过master
lambda 函数的 IAM 角色向您的 Lambda master
授予权限。
您可以创建一个 API 网关端点,该端点在us-east-1
区域中执行 lambda 函数。 此端点只能使用特定的 API 密钥执行以提供安全层。
并从master
lambda 函数执行对该端点的请求。
let lambda = new AWS.Lambda({region: region})
之后你应该做lambda.invoke
,它会lambda.invoke
!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.