Amazon web services 如何在SAM模板中从Lambda访问DynamoDB表?

Amazon web services 如何在SAM模板中从Lambda访问DynamoDB表?,amazon-web-services,aws-lambda,amazon-dynamodb,aws-sam-cli,Amazon Web Services,Aws Lambda,Amazon Dynamodb,Aws Sam Cli,我一直在一个网站上工作,该网站显示了我的简历,并且在使用AWS服务时有一个访问者。我已经有了一种“硬编码”的方式,但是现在如果我想改变的话,我希望能够一次性部署API网关、Lambda代码和DynamoDB。SAM CLI模板似乎非常适合它。我从网上和我自己的网站上搜到了一些代码,但现在还没有完全找到。lambda函数由APIGateway触发,然后将访问DynamoDB中的访问者计数,向其中添加1,然后将其发送到网站,然后将新的数字存储在DynamoDB中 我意识到我的旧Lambda函数将无法

我一直在一个网站上工作,该网站显示了我的简历,并且在使用AWS服务时有一个访问者。我已经有了一种“硬编码”的方式,但是现在如果我想改变的话,我希望能够一次性部署API网关、Lambda代码和DynamoDB。SAM CLI模板似乎非常适合它。我从网上和我自己的网站上搜到了一些代码,但现在还没有完全找到。lambda函数由APIGateway触发,然后将访问DynamoDB中的访问者计数,向其中添加1,然后将其发送到网站,然后将新的数字存储在DynamoDB中

我意识到我的旧Lambda函数将无法工作,因为DynamoDB名称将随SAM模板而更改。有没有办法使用全局变量并将其实现到Lambda函数中?我还意识到我创建了一个额外的列来存储当前dynamoDB表中名为“visions”的计数,但不知道如何在SAM模板中添加一个列

template.yaml

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
  resume_backend

  Sample SAM Template for resume_backend

# More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst
Globals:
  Function:
  Runtime: python3.8 # language used at runtime
  Timeout: 180 # timeout for a given lambda function execution
  Environment:
      Variables: # these will be important later
          DYNAMO_TABLE: !Ref DynamoVisitorTable
          DB_ENDPOINT: http://dynamodb.us-east-1.amazonaws.com
          REGION_NAME: us-east-1


Resources:
  VisitorCountFunction:
    Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
    Properties:
      CodeUri: visitorCount/
      Handler: app.lambda_handler
      Policies: AmazonDynamoDBFullAccess # default IAM policy 
      Runtime: python3.8
      Events:
        # Api:
        #   Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
        #   Properties:
        #     Path: /visitorCount
        #     Method: GET
        cors: true
        ApiGatewayApi:
          Type: AWS::Serverless::Api
          Properties:
            StageName: Prod
            Cors:
              AllowMethods: "'POST, GET'"
              AllowHeaders: "'X-Forwarded-For'"
              AllowOrigin: "'www.example.com'"
              MaxAge: "'600'"
              AllowCredentials: True
              Path: /visitorCount
              Method: GET


  DynamoVisitorTable:
    Type: AWS::Serverless::SimpleTable # if you want to define a more complex table, use AWS::DynamoDB::Table
    TableName: websiteVisitorTable
    PrimaryKey:
        Name: webPageCounted
        Type: S
    ProvisionedThroughput:
        ReadCapacityUnit: 5
        WriteCapacityUnits: 5
    Tags:
        AppType: Serverless
lambda_函数:app.py

##
##aws SDK for python
import boto3

def lambda_handler(event, context):
    TABLE_NAME="websiteCounter"
    KEYPAIR = {'visitsMain'}
    client = boto3.resource("dynamodb")
    table = client.Table(TABLE_NAME)
    
    response = table.get_item(
        Key={
            "visitsMain":"mainPage",
        }
        )
    item = response['Item']
    table.update_item(
        Key={
            "visitsMain":"mainPage",
        },
        UpdateExpression='SET visits = :val1',
        ExpressionAttributeValues={
            ':val1': item['visits'] + 1
        }
    )
    return (item['visits'] + 1)


正如模板中的注释所建议的,对于这部分,您应该使用Serverless语法而不是SAM。区别在于SAM是无服务器的简化,它适用于小堆栈或无状态函数,但它只能帮助您实现这一点。好的方面是,您可以将无服务器语句直接混合到SAM模板中,因为SAM编译为无服务器

将帮助您准确地定义表格。但是在第一次部署之后,您需要添加以检查表是否存在,否则进一步的部署将失败,因为它们将再次尝试创建表。为了避免这种复杂性,有些人会争论创建两个不同的模板,一个用于表,另一个用于函数。不管是哪种方式,您都可能希望使用无服务器语法定义表,并确保向函数添加策略以允许它们访问正确的表


退一步,因为这是为您的简历,您应该考虑使用山姆/ Server,因为这是最新的基础设施定义,并大大优于文本模板,在我看来(打字稿YAY!)。此外,教程、示例和资源也更好。AWS CDK是AWS特定的,而Serverless是平台无关的,但是我不认为有足够的理由不使用它。

< P>您检查lambda函数是否有权访问DyDoDB?< /P> 下面是一篇关于如何分配权限的有趣文章。可以手动或在SAM模板内完成:

Resources:
  MyFunction:
    Type: 'AWS::Serverless::Function'
    Properties:
      Handler: index.handler
      Runtime: nodejs8.10
      CodeUri: 's3://my-bucket/function.zip'
      Policies:
      # Give DynamoDB Full Access to your Lambda Function
      - AmazonDynamoDBFullAccess
链接:

SAM模板内的语法:

Resources:
  MyFunction:
    Type: 'AWS::Serverless::Function'
    Properties:
      Handler: index.handler
      Runtime: nodejs8.10
      CodeUri: 's3://my-bucket/function.zip'
      Policies:
      # Give DynamoDB Full Access to your Lambda Function
      - AmazonDynamoDBFullAccess