【问题标题】:Invoke an AWS lambda across regions跨区域调用 AWS lambda
【发布时间】:2018-06-23 08:13:00
【问题描述】:

我有三个 lambda 函数:boss、worker1、worker2。使用 boto3.client.invoke 时,我可以从老板那里调用 worker1。这两个在同一个地区。
worker2 在一个单独的区域中。尝试从 boss 调用 worker2 时返回以下错误:
“调用 Invoke 操作时发生错误 (ResourceNotFoundException):来自 'us-east-1' 的函数在此区域 ('us-west-2') 中不可访问”。 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']

【问题讨论】:

  • 请分享您用来调用函数的代码。
  • 请澄清:boss和worker1在us-west-2,worker2在us-east-1。对吗?
  • @Dunedan 我已经破解了代码。
  • @Michael-sqlbot 你在这些地区是正确的。
  • @SawyerMerchant 我不是 python 人,但在 Lambda 环境中,您的 AWS 客户端库将默认向本地区域的服务端点发送请求,凭证范围为本地区域,并且您的错误消息表明您正在尝试通过将请求发送到 us-west-2 中的服务端点来调用 us-east-1 中的函数。这不是权限问题——请求被发送到错误的地方。您需要为您的客户端提供一个区域和/或端点。

标签: python amazon-web-services aws-lambda amazon-iam


【解决方案1】:

感谢大家的意见。 @Michael-sqlbot 关于 AWS 客户端库默认向本地区域发送请求的评论帮助我找到了解决方案。对于 Python,库是 boto3。阅读docs 后,不清楚如何设置区域。正是这个blog post 提供了(简单的)答案:

client = boto3.client('lambda', region_name='us-west-2')

Michael 你说得对,区域之间一个 lambda 到另一个的用例是错综复杂的。我将在此处留下这个答案,以防任何其他不熟悉 boto3 的人在尝试让其他资源(lambda 到 ec2、lambda 到 s3 等)跨区域工作时遇到相同的错误。
谢谢

【讨论】:

  • 这对你来说非常有帮助,而对 boto 来说却非常痛苦。即使提供了包含区域的完整 ARN,也会使用本地区域,例如 client.invoke(FunctionName='arn:aws:lambda:us-east-1:123455555555:function:worker')。这看起来很奇怪。
【解决方案2】:

您需要设置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 函数向该端点执行请求。

资源

【讨论】:

  • 问题的重点似乎是worker2,无论出于何种原因,但可能是故意的,位于us-east-1,与其他地区不同。所需要做的就是告诉 boto3 将请求发送到 us-east-1 中的 Lambda 服务 API,并在 Sig V4 凭证中使用 us-east-1。权限已经存在,如图所示。添加 API Gateway 来解决一个简单的问题似乎是不必要的卷积。
【解决方案3】:

let lambda = new AWS.Lambda({region: region}) 然后你应该做lambda.invoke 这会成功!

【讨论】:

    猜你喜欢
    • 2016-05-02
    • 1970-01-01
    • 2019-10-01
    • 1970-01-01
    • 2022-01-21
    • 2020-06-17
    • 2020-06-24
    • 2014-07-23
    • 1970-01-01
    相关资源
    最近更新 更多