当前位置: 首页 > 知识库问答 >
问题:

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

谭昱
2023-03-14

我所做的:

  1. 我在这些帐户之间创建了VPC对等连接
  2. 还连接到每个VPC的Internet网关
  3. 路由表也已配置(允许来自两侧的流量)

案例1:

“ErrorMessage”:“调用Invoke操作时发生错误(AccessDeniedException):User:arn:aws:sts::Account-a:Assumed-Role/Role-for-VPC-peering-test/lambda1_in_VPC无权对资源执行:lambda:InvokeFunction:arn:aws:lambda:us-East-1:Account-b:function: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?

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')

有什么建议吗?

{
  "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不在vpc中。

共有1个答案

苏鸿羽
2023-03-14

以下AWS博客中列出了在帐户a中承担角色以在帐户B中做某事(例如调用B中的lambda函数)所需的一般步骤:

  • 如何配置Lambda函数以承担另一个AWS帐户的角色?

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

  • sts=boto3.client('sts')
  • account_b=sts.assume_role(...)
  • 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') 

附注。

    null

这是不需要的。从函数A调用函数B无论如何都要通过internet。因此,如果您不将对等连接用于其他任何内容,那么它也不用于lambdas。

 类似资料:
  • 希望将一个位于VPC中的AWS lambda连接到另一个不在VPC中但位于同一区域和帐户中的lambda。 > 调用方lambda“lambda_1”的代码: @override public String handleRequest(final Object input,final Context Context){logger.log(Context.getFunctionName()+“in

  • 甚至,API网关资源策略是这样写的: 和VPCendpoint策略进行完全访问。

  • 有没有办法在AWS帐户中找到未使用的VPC? 我指的是没有任何EC2实例、RDS和其他相关服务的VPC。 一种方法是在正在运行的实例、RDS和其他服务中使用VPC ID进行搜索,以确定它是否在使用中。有没有其他方法或AWS CLI来查找未使用的VPC?

  • 在过去的几个小时里,我一直在调试、配置和命名它,我似乎不明白为什么会发生这种情况。 我正在尝试调用一个 lambda 函数,该函数只是从 ec2 中检索基本信息。当我在aws控制台中测试此lambda函数时,它似乎工作正常。但是,使用以下代码在另一个lambda中调用它; 它只是超时了。没有任何反应…两个Lambda都连接到VPC和所有子网 我认为是我的新VPC导致了这个问题。我的VPC包括: 1

  • 对于从lambda跨帐户访问SQS,我需要允许附加到lambda的IAM角色具有SQS权限,还是允许IAM角色在SQS的访问策略中具有权限?(或者两者都做?) 更新:基本上,我已经按照下面一些答案中的建议设置了SQS访问策略。 我得到一份工作 尝试向队列boto3.resource('sqs')发送内容时。队列(“某个队列url”)。send_message(**kwargs))`从lambda,

  • 我有两个AWS帐户(A和B)。在我的帐户A上,我有一个lambda功能,需要访问帐户B的资源。确切地说,我的帐户A上的lambda需要更新我帐户B上托管的Route53区域中的记录。 与S3相反,我在Route53中没有看到任何资源访问策略。所以我有点迷路了。我试图扮演IAM的跨账户角色,但这似乎对lambda不起作用。 如何允许帐户a上的lambda函数访问我的帐户B的资源?