amazon-web-services - AWS Lambda 和跨账户角色的问题
问题描述
我需要担任跨账户角色才能访问 ElasticSearch 域以登录 AWS。这是我所做的:
首先,我在 ACCOUNT1 中创建了一个跨账户角色。角色名称为LoggerAccessToES,信任关系如下:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": "sts:AssumeRole"
},
{
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::ACCOUNT1:root",
"arn:aws:iam::ACCOUNT2:root"
]
},
"Action": "sts:AssumeRole",
"Condition": {}
}
]
}
然后,在 ACCOUNT2 上,我使用以下代码创建了一个 Lambda 函数来承担上述角色:
sts_client = boto3.client('sts', region_name=Config.AWS_ES_REGION)
assumed_role_object=sts_client.assume_role(
RoleArn="arn:aws:iam::ACCOUNT1:role/LoggerAccessToES",
RoleSessionName="AssumeLoggerAccessToESSession1"
)
当我调用 lambda(基本上 lambda 附加到 SNS 主题)时,我收到错误:
botocore.exceptions.ClientError: An error occurred (AccessDenied) when calling the AssumeRole operation: Access denied
我已经尝试过其他人在其他问题中提出的所有建议,我也用谷歌搜索了这个问题,但我找不到解决方案。我在这里做错了什么?
解决方案
据我了解,您想使用帐户 2 中的 lambda 在帐户 1 中担任角色。
这将需要创建两个角色 -
- 第一个角色需要在要附加到 Lambda 的 Account 2 中创建。此角色需要附加以下权限 -
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::ACCOUNT1:role/LoggerAccessToES"
}
}
上述策略可以添加到您现有的 lambda 执行角色中。
- 对于第二部分,只需要在下图的Account 1中添加Role LoggerAccesstoEs的信任关系——
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::ACCOUNT2:root"
},
"Action": "sts:AssumeRole",
"Condition": {}
}
]
}
第一个角色策略允许 lambda 使用 AssumeRole。第二个策略允许账户 1 信任来自账户 2 的 AssumeRole 请求。
推荐阅读
- java - 如果我们在 java 接口中不能有构造函数,那么这是什么?
- java - Optional/Stream的中间操作中如何处理NPE?
- python - 如何在熊猫中聚合和分组
- sql - 无法将“System.String”类型的对象转换为“System.Int32”类型
- slack-api - Slack API - 获取私人频道中的成员列表
- stripe-payments - 使用 Stripe 的 Checkout 功能后如何获取资金?
- r - 如何使用 R 解决不同数据的图形编译错误
- hibernate - 如果没有活动事务,调用方法“createQuery”无效
- reactjs - 如何使用 React 测试库编写测试以获取当前时间和转换时间
- powershell - 使用 Powershell 将多行文本文件提取到单行 csv