Antwort

13

Bearbeiten: die Antwort für Serverless Framework 1.x aktualisiert. Die Lösung besteht darin, iamRoleStatements so einzustellen, dass Lambda auf die DynamoDB-Ressourcen zugreifen kann. Hinweis: Die vom Serverless Framework verwendeten Anmeldeinformationen müssen über Berechtigungen für dieselben DynamoDB-Ressourcen verfügen.

  1. fügen Sie den iamRoleStatements in Ihrem serverless.yml:

    provider: 
        name: aws 
        runtime: nodejs4.3 
        stage: dev 
        region: us-east-1 
        iamRoleStatements: 
        - Effect: "Allow" 
         Action: 
         - "dynamodb:*" 
         Resource: "arn:aws:dynamodb:${self:provider.region}:*:table/*" 
    
  2. die Änderungen implementieren:

    > serverless deploy 
    

Um Berechtigungen in einer Funktionsebene zu geben (anstatt zu erlauben alle Funktionen, um auf DynamoDB zuzugreifen), siehe meine andere Antwort here.

+1

Danke für das Beispiel. Ich habe arn: aws: dynamodb: $ {region}: *: table/* –

+0

Aktualisiert für serverlose Version 1.x – Zanon

4

Obwohl ich nicht weiß, wie Serverless funktioniert, suchen Sie nach einem IAM Role.

Sie können einer EC2-Instanz oder einer AWS Lambda-Funktion eine Rolle zuweisen, sodass der von Ihnen geschriebene Code, der das AWS SDK verwendet, automatisch AWS-Anmeldeinformationen mit den mit dieser Rolle verknüpften Berechtigungen abrufen kann. Für AWS Lambda und Ihren Anwendungsfall möchten Sie der Rolle, der Sie den AWS Lambda-Zugriff zuweisen, die erforderlichen DynamoDB-Tabellen für die Ausführung zuweisen.

Dies kann täuschend einfach zu bedienen sein, Sie geben einfach keine Anmeldeinformationen und es funktioniert einfach (solange die Rolle die richtigen Berechtigungen hat)! Das AWS SDK kümmert sich um alles, indem es automatisch Anmeldeinformationen abruft, die mit der Rolle verknüpft sind.

Von dem Link, den Sie angegeben haben, ist die spezifische Frage, auf die in der Best Practice verwiesen wird, Credentials from IAM Roles for EC2 Instances, wo es sich auf EC2-Instanzen bezieht, dies gilt jedoch auch für AWS Lambda.