2016-08-26 2 views
1

Я пытаюсь настроить карту источника событий, чтобы функция Lambda получала вызов каждый раз, когда запись фиксируется в моей таблице dynamodb. Я пытаюсь следить инструкции отКак создать EventSourceMapping с serverless 1.0?

https://github.com/serverless/serverless/blob/master/docs/guide/overview-of-event-sources.md

Мой текущий serverless.yml использует:

service: sl-pipeline 

provider: 
    name: aws 
    runtime: python2.7 
    memorySize: ${memoryVar} 
    iamRoleStatements: 
    - Effect: "Allow" 
     Action: 
     - "dynamodb:*" 
     Resource: "arn:aws:dynamodb:*:*:table/MyTable*" 
    - Effect: "Allow" 
     Action: 
     - "dynamodb:GetRecords" 
     - "dynamodb:GetShardIterator" 
     - "dynamodb:DescribeStream" 
     - "dynamodb:ListStreams" 
     Resource: "arn:aws:dynamodb:*:*:table/MyTable*/stream/*" 

# you can overwrite defaults here 
defaults: 
    stage: dev 
    region: us-east-1 

functions: 
    main: 
    handler: handler.main 

# Add event trigger from dynamodb Stream Table 
resources: 
    Resources: 
    mapping: 
     Type: AWS::Lambda::EventSourceMapping 
     Properties: 
     BatchSize: 10 
     EventSourceArn: "arn:aws:dynamodb:us-east-1:XXXXXXXXX:table/MyTable/stream" 
     FunctionName: "sl-pipeline-dev-main" 
     StartingPosition: LATEST 

И каждый раз, когда я называю serverless deploy, я получаю:

Serverless Error --------------------------------------- 

An error occurred while provisioning your cloudformation: 
The following resource(s) failed to create: [IamRoleLambda, 
mapping]. 

Я предполагая, что это связано с разрешениями роли IAM, но не может понять, как это исправить. Для той роли, которую я использую для сервера без сервера, я попытался использовать только:

Action: "*" 
Resource: "*" 

так что он должен быть в состоянии сделать что угодно.

Обратите внимание, что если я удалю раздел resources из serverless.yml, я смогу установить его правильно. Я даже могу пойти в таблицу dynamodb и вручную добавить триггер в функцию лямбда, и все это работает.

Заранее благодарен

ответ

1

Первый раз; посмотрите, почему IamRoleLambda не может быть создан. Перейдите в веб-консоль AWS и перейдите в CloudFormation. Нажмите на свой стек (возможно, он говорит, что он провалился). Прокрутите до отказа и посмотрите, почему. Обычно он точно указывает, что не удалось.

Второй; вам не нужна роль выполнения lambda, чтобы иметь разрешения для потока. Попробуйте удалить часть из политики iam в отношении потока. Таким образом, это выглядит следующим образом:

provider: 
    name: aws 
    runtime: python2.7 
    memorySize: ${memoryVar} 
    iamRoleStatements: 
    - Effect: "Allow" 
     Action: 
     - "dynamodb:*" 
     Resource: "arn:aws:dynamodb:*:*:table/MyTable*"