跨区域调用AWS lambda

时间:2018-01-14 14:12:57

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

我有三个lambda函数:boss,worker1,worker2。当使用boto3.client.invoke时,我可以从boss调用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']

3 个答案:

答案 0 :(得分:5)

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

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

你是对的迈克尔,区域之间一个lambda到另一个lambda的用例是错综复杂的。我将在这里留下这个答案,以防其他任何新的boto3在尝试获取其他资源(lambda到ec2,lambda到s3等)以跨区域工作时遇到相同的错误。
感谢

答案 1 :(得分:0)

您需要将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函数执行对该端点的请求。

资源

答案 2 :(得分:-1)

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