В AWS Lambda запрещен кросс-аккаунт - PullRequest
0 голосов
/ 17 мая 2018

У меня есть 2 аккаунта AWS.У учетной записи 1 есть домен CloudSearch, который мне нужно запросить из функции Lambda в учетной записи 2. Я следовал учебнику здесь для создания роли в учетной записи 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.

В учетной записи 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"
    }
  ]
}

Моя лямбдаКод функции (Python 3) пытается выполнить запрос CloudSearch следующим образом:

client = boto3.client('cloudsearchdomain', endpoint_url=endpoint)
response = client.search(
    query="(and name:'foobar')",
    queryParser='structured',
    returnFields='curr_addr',
    size=1
)

Все вызовы лямбда-функции завершаются со следующей ошибкой:

Произошла ошибка (AccessDenied), когдавызов операции поиска: Пользователь: arn: aws: sts :: 222222222222: предполагаемая роль / my_cloudsearch_query_role / my_lambda_func не авторизован для выполнения: cloudsearch: поиск по ресурсу: myCSDomain

Я уверен, чтоЯ получил правильные идентификаторы аккаунта, так что никаких путаницЧто-то еще, что я должен сделать, чтобы заставить это работать?

1 Ответ

0 голосов
/ 17 мая 2018

Вам необходимо принять роль в учетной записи 111111111111, а затем использовать возвращенные учетные данные для создания вашего клиентского объекта. Используйте API-вызов accept_role boto3 для получения учетных данных. Вот пример кода:

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 можно найти здесь .

...