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
{
"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函数):
- sts=boto3.client('sts')
- 账户=sts.承担角色(…)
- account_b_client=boto3.client(…)
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、 美国
这是不需要的。不管怎样,从函数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中的交叉账户角色?