sls развертывает несколько ролей IAM для lambda, что предполагает неверную роль с отсутствующими разрешениями - PullRequest
0 голосов
/ 07 апреля 2020

В настоящее время я работаю над проектом sls с двумя лямбда-функциями. Один толкает предмет в динамо, другой срабатывает, когда предмет толкают в динамо (поток). "Process lambda" -> DDB -> "Build lambda".

При локальном тестировании с использованием sl все вызовы PutItem работают. Когда sls deploy и тестирование выполняются на aws, я получаю проблему отказа в доступе:

assumed-role/app-client-onboarder-dev-us-east-2-lambdaRole/app-client-onboarder-dev-app_new_client_process is not authorized to perform: dynamodb:PutItem on resource: arn:aws:dynamodb:us-east-2:123456789:table/dev-app-clients 

Когда я смотрю в IAM, для этого развертывания есть 2 роли (которые, как я думал, будет только 1)

  1. arn: aws: iam :: 123456789: role / AppClient-dev-BuildProcessLambdaExecutionRole
  2. arn: aws: iam :: 123456789: роль / app-client- onboarder-dev-us-east-2-lambdaRole

Похоже, что предполагаемая роль выше assumed-role/role 1./role 2.

  • Первая определена в ресурсах (см. в внизу) с разделенными политиками
  • Второй, похоже, будет построен для этого развертывания cf / sls - у него одна политика с несколькими операторами, отсутствуют ключевые разрешения (например, Dynamodb: PutItem).

Что я пропускаю без новых ролей и политик с sl, если развернутые лямбды принимают определенные роли? Откуда взялась эта роль второго уровня «развертывания»?

выдержка из serverless.yml приведена ниже.

service: app-client-onboarder


provider:
  name: aws
  runtime: nodejs12.x
  region: us-east-2
  stage: dev

functions:
  app_new_client_process:
    handler: lambda/handler.app_new_client_process
    tracing: true
    environment:
      DynamoClientTableName: ${self:custom.client-table-name.${self:provider.stage}}
      DynamoDataTableNamePrefix: ${self:custom.client-data-table-name-prefix.${self:provider.stage}}

  app_new_client_build_resources:
    handler: lambda/handler.app_new_client_build_resources
    tracing: true
    events:
      - stream: ${self:custom.client-table-updates.${self:provider.stage}}
    environment:
      DynamoClientTableName: ${self:custom.client-table-name.${self:provider.stage}}
      DynamoDataTableNamePrefix: ${self:custom.client-data-table-name-prefix.${self:provider.stage}}


resources:
  Resources: 
    appClientBuildProcessLambdaExecutionRole:
      Type: AWS::IAM::Role
      Properties:
        RoleName: appClient-${self:provider.stage}-BuildProcessLambdaExecutionRole
        AssumeRolePolicyDocument:
          Version: '2012-10-17'
          Statement:
            - Effect: Allow
              Principal:
                Service:
                  - lambda.amazonaws.com
              Action: sts:AssumeRole
        Policies:
        - PolicyName: appClientDynamoDBIamPolicy
          PolicyDocument: 
            Version: '2012-10-17'
            Statement:
              - Effect: "Allow"
                Action:
                  - "dynamodb:DescribeTable"
                  - "dynamodb:GetItem"
                  - "dynamodb:PutItem"
                  - "dynamodb:DescribeStream"
                  - "dynamodb:ListStreams"
                  - "dynamodb:ListTables"
                Resource: "arn:aws:dynamodb:*:146449424444:table/*app-client*"
        - PolicyName: appLogsIamPolicy
          PolicyDocument: 
            Version: '2012-10-17'
            Statement:
              - Effect: "Allow"
                Action:
                  - "logs:CreateLogGroup"
                  - "logs:CreateLogStream"
                  - "logs:PutLogEvents"
                Resource: "arn:aws:logs:*:146449424444:*"
        - PolicyName: appXrayTracingPolicy
          PolicyDocument: 
            Version: '2012-10-17'
            Statement:
              - Effect: "Allow"
                Action:
                  - "xray:PutTraceSegments"
                  - "xray:PutTelemetryRecords"
                Resource: "*"

plugins: 
  - serverless-plugin-tracing

Ответы [ 2 ]

0 голосов
/ 09 апреля 2020

Установите имя роли, определенное в ресурсах, в соответствующую область.

На уровне provider:

provider:
  name: aws
  runtime: nodejs12.x
  region: us-east-2
  stage: dev
  role: AppExRole

или function уровень, если каждая функция имеет различный набор разрешений

functions
  f1:
    role: AppExRole
  f2:
    role: AppExRole2
0 голосов
/ 08 апреля 2020

Вам необходимо определить разрешения для вашего бессерверного проекта в провайдере -> iamRoleStatements как:

provider:

  iamRoleStatements:
    - Effect: "Allow"
      Action:
        - "dynamodb:Query" 
        - "dynamodb:PutItem"
        - "dynamodb:UpdateItem"
      Resource: YOUR_DYNAMODB_ARN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...