簡體   English   中英

AWS Lambda跨賬戶訪問被拒絕

[英]AWS Lambda cross-account access denied

我有2個AWS賬戶。 帳戶1具有一個CloudSearch域,我需要從帳戶2的Lambda函數中進行查詢。我已經按照此處教程在帳戶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:assumed-role / my_cloudsearch_query_role / my_lambda_func未經授權執行:cloudsearch:對資源的搜索:myCSmain

我很確定自己的帳戶ID正確無誤,因此不會混淆。 為了使它正常工作,我還需要做其他事情嗎?

您需要承擔帳戶111111111111中的角色,然后使用返回的憑據創建您的客戶端對象。 使用hypok_role 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(...)

請使用正確的詳細信息更新role_arn。 有關Session對象的文檔可以在這里找到。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM