我有2个AWS账户。帐户1有一个CloudSearch域,我需要从帐户2中的Lambda函数进行查询。我已经跟踪tutorial here在帐户1中创建了一个允许跨帐户访问的角色。
因此,在帐户1中,我的角色arn:aws:iam::111111111111:role/my_cloudsearch_query_role
如下所示:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "cloudsearch:search",
"Resource": "*"
}
]
}
此角色有一个受信任的实体,帐户2,我可以在“受信任的实体”部分中看到IAM控制台中角色的正确帐户ID。
在帐户2中,我创建了一个Lambda函数,其执行角色如下所示:
{
"roleName": "my_cloudsearch_query_role",
"policies": [
{
"document": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:*:*:*"
},
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::111111111111:role/my_cloudsearch_query_role"
}
]
},
"name": "oneClick_lambda_basic_execution_1526469274620",
"type": "inline"
}
]
}
我的Lambda函数(Python 3)代码尝试像这样查询CloudSearch:
client = boto3.client('cloudsearchdomain', endpoint_url=endpoint)
response = client.search(
query="(and name:'foobar')",
queryParser='structured',
returnFields='curr_addr',
size=1
)
对Lambda函数的所有调用都会失败,并显示以下错误:
调用搜索操作时发生错误(AccessDenied):用户:arn:aws:sts :: 222222222222:assume-role / my_cloudsearch_query_role / my_lambda_func无权执行:cloudsearch:搜索资源:myCSDomain
我很肯定我已经获得了正确的帐户ID,所以没有混淆。为了让它发挥作用,我还需要做些什么吗?
答案 0 :(得分:2)
您需要在帐户111111111111中担任角色,然后使用返回的凭据创建客户端对象。使用assume_role boto3 API调用来获取凭据。这是一个示例代码:
/**
* Get the password reset credentials from the request.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
protected function credentials(Request $request)
{
return [
'email_hash' => hash('sha256', $request->get('email')),
'password' => $request->get('password'),
'password_confirmation' => $request->get('password_confirmation'),
'token' => $request->get('token')
];
}
请使用正确的详细信息更新role_arn。可以找到有关Session对象的文档here。