Как получить доступ к aws ресурсам, созданным в другой учетной записи - PullRequest
0 голосов
/ 25 января 2020

В моем случае я хочу получить доступ к DynamoDB таблице, созданной в AWS учетной записи A и Lambda, созданной в учетной записи B. Для этого я следовал много ссылок на Inte rnet, который предлагает мне использовать AWS взять на себя роль функции. Я добавил следующее разрешение в роли выполнения Lambda

{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Action": "sts:AssumeRole",
    "Resource": "arn:aws:iam::aws-account-A-number:role/test-db-access"
   }
}

Ниже приведены доверительные отношения Lambda

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
           "Service": "lambda.amazonaws.com"
       },
      "Action": "sts:AssumeRole"
    },
    {
      "Effect": "Allow",
      "Principal": {
      "AWS": "arn:aws:iam::aws-account-A-number:root"
       },
     "Action": "sts:AssumeRole"
    }
  ]
}

В учетной записи A я создал роль (test-db-access) для разрешив другим доступ к этой учетной записи и добавили AmazonDynamoDBFullAccess и политики AdministratorAccess. Ниже приведены доверительные отношения, которые я добавил в эту учетную запись

{
  "Version": "2012-10-17",
   "Statement": [
     {
        "Effect": "Allow",
        "Principal": {
        "AWS": "arn:aws:iam::aws-account-B-number:role/sam-dev-test- 
            TestLambda-LambdaRole-1FH5IC18J0MYT"
         },
       "Action": "sts:AssumeRole"
     },
     {
       "Effect": "Allow",
       "Principal": {
           "Service": "lambda.amazonaws.com"
         },
       "Action": "sts:AssumeRole"
     }
  ]
}

Ниже приведен код Java, который я добавил для доступа к экземпляру Dynamo DB

AssumeRoleRequest assumeRequest = new AssumeRoleRequest()
            .withRoleArn("arn:aws:iam::aws-account-A-number:role/test-db-access").withRoleSessionName("cross_acct_lambda").withDurationSeconds(900);
final AWSSecurityTokenService sts = AWSSecurityTokenServiceClientBuilder.standard().withRegion("eu-west-1").build();
final Credentials credentials = sts.assumeRole(assumeRequest).getCredentials();

Ниже приведен шаблон sh лог при выполнении лямбды

{ "errorMessage": "User: arn:aws:sts::aws-account-B-number:assumed-role/sam-dev-test-TestLambda-LambdaRole-1FH5IC18J0MYT/sam-dev-test-TestLambda-LambdaFunction-73TVOBN6VXXX is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::aws-account-A-number:role/test-db-access (Service: AWSSecurityTokenService; Status Code: 403; Error Code: AccessDenied; Request ID: 100bd3a3-3f9c-11ea-b642-d3b4d9ff35de)", "errorType": "com.amazonaws.services.securitytoken.model.AWSSecurityTokenServiceException" }

1 Ответ

3 голосов
/ 28 января 2020

Похоже, ваши требования:

  • Из AWS лямбда-функции в Account-B откройте таблицу DynamoDB в Account-A

Чтобы воспроизвести ваш Я сделал следующее:

  • Создание таблицы DynamoDB в Account-A
  • Создание роли IAM (Role-A) в Account-A со следующей политикой:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "dynamodb:*",
            "Resource": "arn:aws:dynamodb:ap-southeast-2:<Account-A>:table/Inventory"
        }
    ]
}

И эти доверительные отношения (указывающие на роль, созданную на следующем шаге):

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<Account-B>:role/role-b"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
  • Создание роли IAM (Role-B) в Account-B для использования с функцией Lambda, с этой политикой:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::<Account-A>:role/role-a"
        }
    ]
}

И с этим доверительным отношением:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
  • Создана AWS функция Lambda в Account-B, что будет:
    • Предположим Role-A в Account-A
    • Доступ к таблице DynamoDB в Account-A

I ' m Python человек, поэтому моя функция:

import boto3

def lambda_handler(event, context):

    # Assume Role
    sts_client = boto3.client('sts')

    response = sts_client.assume_role(
        RoleArn='arn:aws:iam::<Account-A>:role/stack-role-a', 
        RoleSessionName='bar')

    session = boto3.Session(
        aws_access_key_id=response['Credentials']['AccessKeyId'],
        aws_secret_access_key=response['Credentials']['SecretAccessKey'],
        aws_session_token=response['Credentials']['SessionToken']
    )

    # Update DynamoDB
    dynamodb_client = session.client('dynamodb')

    dynamodb_client.update_item(
        TableName='Inventory',
        Key={'Item': {'S': 'foo'}},
        UpdateExpression="ADD #count :increment",
        ExpressionAttributeNames = {
            '#count': 'count'
        },
        ExpressionAttributeValues = {
            ':increment': {'N': '1'},
        }
    ) 

Я проверил это, нажав Test на функции Lambda в Account-B. Он успешно обновил таблицу DynamoDB в Account-A.

Я подозреваю, что разница в ваших политиках доверия, которые выглядят немного по-другому.

...