gpt4 book ai didi

amazon-web-services - 如何从账户 A 中的 Lambda(VPC 中的 Lambda)调用账户 B(VPC 中的此 Lambda)中的 AWS Lambda 函数

转载 作者:行者123 更新时间:2023-12-04 09:42:47 32 4
gpt4 key购买 nike

我做了什么:

  • 我在这些账户之间创建了 VPC 对等连接
  • 互联网网关也连接到每个 VPC
  • 还配置了路由表(以允许来自双方的流量)

  • 情况1:

    当这两个 VPC 在同一个账户中时,我成功测试了从另一个 Lambda 函数(在 VPC A 中)调用 Lambda 函数(在 VPC B 中)。

    但是,当我在另一个帐户(帐户 B)中创建类似的 VPC(作为 VPC B)时,出现以下错误:

    "errorMessage": "An error occurred (AccessDeniedException) when calling the Invoke operation: User: arn:aws:sts::Account-A:assumed-role/role-for-vpc-peering-test/lambda1_in_vpc is not authorized to perform: lambda:InvokeFunction on resource: arn:aws:lambda:us-east-1:Account-B:function:lambda-vpc



    我的足迹:

    我为账户 B 中的账户 A 创建了一个具有以下权限的跨账户 IAM 角色:

    IAM Role

    然后我为在账户 A 中使用 Lambda 的角色添加了一个内联策略:

    IAM Permissions

    仅向上述角色添加了策略:
    {
    "Version": "2012-10-17",
    "Statement": {
    "Effect": "Allow",
    "Action": "sts:AssumeRole",
    "Resource": "arn:aws:iam::Account B:role/role-for-Account-A"
    }
    }

    所以我的问题是我应该做些什么来从账户 A 中的 Lambda 调用账户 B 中的 Lambda?

    我想我只是在跨账户角色( access denied error )中遗漏了一些东西。

    lambda-A 代码:

    导入json
    导入 boto3

    client = boto3.client('lambda')

    def lambda_handler(事件,上下文):
    inputForInvoker = {'CustomerId': '123', 'Amount': 50 }
    response = client.invoke(
    FunctionName='arn:aws:lambda:us-east-1:AccountB-id:function:lambda-vpc-peering',
    InvocationType='RequestResponse', # Event
    Payload=json.dumps(inputForInvoker)
    )

    responseJson = json.load(response['Payload'])

    print('\n')
    print(responseJson)
    print('\n')

    有什么建议?

    假设账户 b 中的角色是:具有以下策略: 1. AWSLambdaBasicExecutionRole
    2.信任政策:
    {
    "Version": "2012-10-17",
    "Statement": [
    {
    "Effect": "Allow",
    "Principal": {
    "AWS": "arn:aws:iam::Account-id-A:role/role-for-vpc-peering-test"
    },
    "Action": "sts:AssumeRole"
    }
    ]
    }.

    执行角色 - 附加此内联策略:
    {
    "Version": "2012-10-17",
    "Statement": {
    "Effect": "Allow",
    "Action": "sts:AssumeRole",
    "Resource": "arn:aws:iam::Account-b-id:role/role-for-7691-4701-2358"
    }
    }

    并用下面提到的代码更新了我的 lambda 函数。

    但仍然得到同样的错误

    现在 lambda 不在 vpc 中。

    最佳答案

    所需的一般步骤承担账户 A 中的角色 以下 AWS 博客中列出了在账户 B 中执行某些操作(例如,在 B 中调用 lambda 函数):

  • How can I configure a Lambda function to assume a role from another AWS account?

  • 需要注意的重要一点是,账户 A 中的 lambda 函数必须是 承担角色 在账户 B 中。 可承担的角色必须允许函数 A 的执行角色调用 B 中的函数。

    我根据上述链接中的示例修改了帐户 A 中的 lambda 代码。

    要关注的关键元素是 :
  • sts = boto3.client('sts')
  • account_b = sts.assume_role(...)
  • account_b_client = boto3.client(...)

  • 假设您的所有角色都已正确设置,您的代码应该看起来像打击。显然你必须完全根据你的需要调整它,但它应该给你 做什么的总体思路 在账户 A 中的 lambda 中。
    import json 
    import boto3

    client = boto3.client('lambda')

    sts = boto3.client('sts')

    def lambda_handler(event, context):

    inputForInvoker = {'CustomerId': '123', 'Amount': 50 }

    account_b = sts.assume_role(
    RoleArn="<arn-of-assumbale-role-in-acccount-b>",
    RoleSessionName="cross_acct_lambda"
    )

    ACCESS_KEY = account_b['Credentials']['AccessKeyId']
    SECRET_KEY = account_b['Credentials']['SecretAccessKey']
    SESSION_TOKEN = account_b['Credentials']['SessionToken']

    # create service client using the assumed role credentials
    # from account B
    account_b_client = boto3.client(
    'lambda',
    aws_access_key_id=ACCESS_KEY,
    aws_secret_access_key=SECRET_KEY,
    aws_session_token=SESSION_TOKEN)

    response = account_b_client.invoke(FunctionName='arn:aws:lambda:us-east-1:AccountB-id:function:lambda-vpc-peering', InvocationType='RequestResponse')

    responseJson = json.load(response['Payload'])
    print('\n') print(responseJson) print('\n')

    附言

    1. I created a VPC Peering connection between these accounts


    这是 并不需要。 从函数 A 调用函数 B 无论如何都会通过互联网。因此,如果您不将对等连接用于任何其他用途,则它不会用于 lambdas。

    关于amazon-web-services - 如何从账户 A 中的 Lambda(VPC 中的 Lambda)调用账户 B(VPC 中的此 Lambda)中的 AWS Lambda 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62256171/

    32 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com