【问题标题】:Circular dependency in AWS lambda functionAWS lambda 函数中的循环依赖
【发布时间】:2018-01-29 15:33:36
【问题描述】:

以下是 lambda 函数的 template.yaml。我正在尝试添加访问status 数据库的权限。但是,它需要数据库存在,反之亦然,因此我收到DynamoDBIamPolicy 的循环依赖错误。我该如何解决这个问题?

AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Description: An AWS Serverless Specification template describing your function.
Resources:
  friendTeachers:
    Type: 'AWS::Serverless::Function'
    Properties:
      Handler: friendTeachers/index.handler
      Runtime: nodejs6.10
      Description: ''
      MemorySize: 128
      Timeout: 15
  status:
    Type: 'AWS::DynamoDB::Table'
    Properties:
      TableName: status
      AttributeDefinitions:
        - AttributeName: screenName
          AttributeType: S
      KeySchema:
        - AttributeName: screenName
          KeyType: HASH
      ProvisionedThroughput:
        ReadCapacityUnits: 1
        WriteCapacityUnits: 1
  # A policy is a resource that states one or more permssions. It lists actions, resources and effects.
  DynamoDBIamPolicy: 
    Type: 'AWS::IAM::Policy'
    DependsOn: status
    Properties:
      PolicyName: lambda-dynamodb
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Action:
              - dynamodb:DescribeTable
              - dynamodb:Query
              - dynamodb:Scan
              - dynamodb:GetItem
              - dynamodb:PutItem
              - dynamodb:UpdateItem
              - dynamodb:DeleteItem
              - dynamodb:batchWriteItem
            Resource: arn:aws:dynamodb:*:*:table/status
      Roles:
        - Ref: IamRoleLambdaExecution

【问题讨论】:

    标签: amazon-web-services aws-lambda


    【解决方案1】:

    您缺少指定 lambda 服务可以AssumeRole 的角色。该角色需要有一个关联的策略,该策略指定可以在 DynamoDb 表中执行的操作。在下面找到一个示例,说明您要完成的工作:

    ---
    AWSTemplateFormatVersion: '2010-09-09'
    Transform: 'AWS::Serverless-2016-10-31'
    Description: An AWS Serverless Specification template describing your function.
    Resources:
      friendTeachersFunction:
        Type: AWS::Lambda::Function
        Properties:
          Code:
            S3Bucket:
              Ref: LambdaCodeBucket
            S3Key:
              Ref: LambdaCodePath
          Handler: friendTeachers/index.handler
          Runtime: "nodejs6.10"
          Description: ''
          MemorySize: 128
          Timeout: 15
          Role:
            Fn::GetAtt:
            - friendTeachersExecutionRole
            - Arn
      friendTeachersExecutionRole:
        Type: AWS::IAM::Role
        Properties:
          AssumeRolePolicyDocument:
            Version: '2012-10-17'
            Statement:
            - Effect: Allow
              Principal:
                Service:
                - lambda.amazonaws.com
              Action:
              - sts:AssumeRole
          Policies:
          - PolicyName: UseDBPolicy
            PolicyDocument:
              Version: '2012-10-17'
              Statement:
              - Effect: Allow
                Action:
                  - dynamodb:DescribeTable
                  - dynamodb:Query
                  - dynamodb:Scan
                  - dynamodb:GetItem
                  - dynamodb:PutItem
                  - dynamodb:UpdateItem
                  - dynamodb:DeleteItem
                  - dynamodb:batchWriteItem
                Resource: arn:aws:dynamodb:*:*:table/status
      APIDynamoDBTable:
        Type: AWS::DynamoDB::Table
        Properties:
          TableName: status
          AttributeDefinitions:
            - AttributeName: screenName
              AttributeType: S
          KeySchema:
            - AttributeName: screenName
              KeyType: HASH
          ProvisionedThroughput:
            ReadCapacityUnits: 1
            WriteCapacityUnits: 1
    

    注意 Code.S3Bucket 和 Code.S3Key 被定义为参数。当您在 AWS 控制台中创建堆栈时,您可以在那里指定路径。

    【讨论】:

    • 你说得对。但是,他使用的是serverless application model。在这里,您不需要为 Code 属性设置 S3 存储桶的 Lambda 函数。您还可以使用CodeUri 指向本地工件并使用aws cloudformation package 准备您的堆栈。此外,还可以内联声明策略see example
    • @shesse 是对的,我不需要存储桶(或参数部分)。请删除该部分/澄清你的答案,我会接受你的答案......否则它会起作用。
    • @UAvalos 我错过了那部分。我已经修改了答案。
    猜你喜欢
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    • 2019-05-05
    • 2011-04-08
    • 2013-09-30
    相关资源
    最近更新 更多