В настоящее время я работаю над проектом 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)
- arn: aws: iam :: 123456789: role / AppClient-dev-BuildProcessLambdaExecutionRole
- 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