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

Amazon web services 如何从帐户A中的Lambda(VPC中的Lambda)调用帐户B(VPC中的此Lambda)中的AWS Lambda函数,amazon-web-services,aws-lambda,Amazon Web Services,Aws Lambda,我所做的: 我在这些帐户之间创建了VPC对等连接 互联网网关也连接到每个专有网络 还配置了路由表(允许来自两侧的流量) 案例1: 当这两个VPC在同一个帐户中时,我成功地测试了从另一个Lambda函数(在VPC A中)调用Lambda函数(在VPC B中) 但是,当我在另一个帐户(帐户B)中创建类似的VPC(作为VPC B)时,我得到以下错误: “errorMessage”:“调用调用调用操作时发生错误(AccessDeniedException):用户:arn:aws:sts::Account

我所做的:

  • 我在这些帐户之间创建了VPC对等连接
  • 互联网网关也连接到每个专有网络
  • 还配置了路由表(允许来自两侧的流量)
  • 案例1:

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

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

    “errorMessage”:“调用调用调用操作时发生错误(AccessDeniedException):用户:arn:aws:sts::Account-A:虚拟专用网对等测试的假定角色/角色/lambda1_未授权vpc在资源上执行:lambda:InvokeFunction:arn:aws:lambda:us-east-1:Account-B:函数:lambda vpc

    我的足迹:

    我使用以下权限为帐户B中的帐户a创建了跨帐户IAM角色:

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

    仅将策略添加到上述角色:

    {
        "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吗

    我想我只是在交叉帐户角色中缺少了一些内容(
    拒绝访问错误

    lambda-代码:

    导入json 进口boto3

    client=bot3.client('lambda')

    def lambda_处理程序(事件、上下文): 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.AWSLAMBDABASICECExecutionRole 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中。

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

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

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

    重点关注的关键要素是:

    • sts=boto3.client('sts')
    • 账户=sts.承担角色(…)
    • account_b_client=boto3.client(…)
    假设您的所有角色都设置正确,您的代码应该看起来像blow。显然,您必须根据自己的需要对其进行调整,但它应该让您大致了解在帐户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') 
    
    导入json
    进口boto3
    client=bot3.client('lambda')
    sts=boto3.client('sts')
    def lambda_处理程序(事件、上下文):
    inputForInvoker={'CustomerId':'123','Amount':50}
    账户=sts.承担角色(
    RoleArn=“”,
    RoleSessionName=“交叉账户”
    )
    访问密钥=帐户密钥['Credentials']['AccessKeyId']
    SECRET\u KEY=account\u b['Credentials']['SecretAccessKey']
    会话令牌=帐户令牌['Credentials']['SessionToken']
    #使用假定的角色凭据创建服务客户端
    #来自B账户
    account_b_client=boto3.client(
    “lambda”,
    aws\u访问密钥\u id=访问密钥,
    aws_secret_access_key=secret_key,
    aws_会话_令牌=会话_令牌)
    response=account\u b_client.invoke(FunctionName='arn:aws:lambda:us-east-1:AccountB id:function:lambda vpc peering',InvocationType='RequestResponse')
    responseJson=json.load(响应['Payload'])
    打印('\n')打印(应答)打印('\n'))
    
    p、 美国

  • 我在这些帐户之间创建了VPC对等连接

  • 这是不需要的。不管怎样,从函数A调用函数B都将通过internet进行。因此,如果您不将对等连接用于其他任何东西,那么它就不会用于lambda。

    您在A中的lambda代码是什么?您必须在B中承担角色,使用,例如
    sts。承担\u角色(…)
    boto3 call.yaa我在帐户b中创建了cross accout角色,只用于帐户AI will和answer,因为我不想在注释中粘贴代码。嘿,Marcin,你能看看这个吗?我仍然面临着同样的拒绝访问错误(我在最后提到了更新的内容)@MaldannaGk的角色可能不正确。您能否在问题中添加以下名称:Acc A中功能的执行角色、Acc B中功能的执行角色以及Acc A中由lambda承担的B中的交叉账户角色?