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

AWS Lambda跨帐户访问被拒绝

宋瀚海
2023-03-14

我有两个AWS账户。帐户1有一个CloudSearch域,我需要从帐户2中的Lambda函数查询该域。我遵循了一个教程,在Account1中创建一个允许跨帐户访问的角色。

因此,在帐户1中,我有一个角色arn:aws:iam::111111111:role/my_cloudsearch\u query\u 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::22222:假定角色/my_cloudsearch\u query\u角色/my_lambda\u func无权执行:cloudsearch:搜索资源:myCSDomain

我确信我的帐户ID是正确的,所以没有混淆。我还需要做些什么来让它工作吗?

共有1个答案

吕征
2023-03-14

您需要承担帐户111111中的角色,然后使用返回的凭据创建客户端对象。使用假定角色boto3 API调用获取凭据。下面是一个示例代码:

role_arn = "arn:aws:iam::111111111111:role/my_cloudsearch_query_role"
sts = boto3.client('sts', region_name="us-east-1")
token = sts.assume_role(RoleArn=role_arn, RoleSessionName="Session1")
credentials = token['Credentials']
access_key = credentials['AccessKeyId']
secret_key = credentials['SecretAccessKey']
token = credentials['SessionToken']
session = boto3.session.Session(
    aws_access_key_id=access_key,
    aws_secret_access_key=secret_key,
    aws_session_token=token
)
client = session.client('cloudsearchdomain', endpoint_url=endpoint)
response = client.search(...)

请使用正确的详细信息更新角色信息。关于会话对象的文档可以在这里找到。

 类似资料:
  • 我有两个帐户(和)。 承载一个API,用于处理文件上载到的存储桶中(我们称之为)。上传触发SNS转换图像或转码视频。结果文件被放入()中的另一个桶中,这将再次触发SNS。然后,我将文件(作为user)复制到()中的最终存储桶。 中的存储桶策略 中的用户策略 我使用aws-sdk for nodejs复制文件,并将ACL设置为,以便的用户可以访问中复制的文件,尽管的用户仍然是文件的所有者。 这一切都

  • 问题内容: 我正在尝试从数据库中获取记录。但我正面临拒绝访问的问题。我尝试了在堆栈溢出中提到的其他解决方案,例如向用户授予特权。 访问数据库的代码: 错误的堆栈跟踪: 在这种情况下可能是什么问题。我尝试创建一个新的数据库,但是也没有用。 问题答案: 问题是授予表根用户的权限。’root’@’%’没有任何权限。.就像我以前用作连接地址一样,因此它给出了拒绝访问错误.. 是IP地址的通配符。所以mys

  • 我正在编写一个小型Java RMI服务器和客户端程序。我花了一些时间试图找出错误消息,但没有成功。 客户端生成以下错误: 尝试连接到:127.0.0.1:3232错误!!!:StockClient:Main:无法连接到服务器:java.rmi.UnMarshalException:解封返回头时出错;嵌套异常为:java.rmi.UnmarshalException:反封送返回头时出错;嵌套异常为:

  • 问题内容: 这是我的编辑从第27行到第39行的代码: 我认为我的问题可能与Win7教授有关:(访问被拒绝) 如何解决这个问题,或者我需要做些什么或阅读才能使它起作用? 谢谢你不燃烧。 我只是更改了文件夹选项,使我获得完整的(Access …),现在我只需要弄清楚为什么在运行javac VendingMachine.java时为什么没有得到任何输出,我想是有一个新问题。 问题答案: 您的工作目录为。

  • 问题内容: 我正在尝试读取文件夹中的文件,但是当我运行该程序时,它将引发此异常。我也尝试了其他一些文件夹。它引发相同的异常。 问题答案: 您无法打开和读取目​​录,无法使用和方法区分文件和文件夹。您可以使用和方法获取文件夹的内容(分别用于文件名和s),还可以指定一个过滤器来选择列出的文件的子集。

  • 我正在使用wamp服务器,我的phpMyAdmin页面返回了以下错误。 Wamp服务器版本:2.2 MySQL版本:5.5.24 #1045-用户“root”@“本地主机”的访问被拒绝(使用密码:是) 我编辑了我的配置文件wamp\app\phpmyadmin4.1.14\config.inc.php: 但这并没有解决问题。任何帮助都将不胜感激。