Amazon web services 如何在SAM模板中从Lambda访问DynamoDB表?
我一直在一个网站上工作,该网站显示了我的简历,并且在使用AWS服务时有一个访问者。我已经有了一种“硬编码”的方式,但是现在如果我想改变的话,我希望能够一次性部署API网关、Lambda代码和DynamoDB。SAM CLI模板似乎非常适合它。我从网上和我自己的网站上搜到了一些代码,但现在还没有完全找到。lambda函数由APIGateway触发,然后将访问DynamoDB中的访问者计数,向其中添加1,然后将其发送到网站,然后将新的数字存储在DynamoDB中 我意识到我的旧Lambda函数将无法工作,因为DynamoDB名称将随SAM模板而更改。有没有办法使用全局变量并将其实现到Lambda函数中?我还意识到我创建了一个额外的列来存储当前dynamoDB表中名为“visions”的计数,但不知道如何在SAM模板中添加一个列 template.yamlAmazon 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函数将无法
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