SAM命令生成项目

本节我们将使用SAM init命令创建项目


执行sam init, 选择AWS Quick Start TemplatesHello World Example:

image-20220306222057077

这里不使用默认的Python,而是使用nodejs, 选择Zip方式部署:

image-20220306222118065

为避免与上一节项目名称冲突,这里命名为sam-app2

进行创建:

image-20220306222141000

创建完成后,目录结构如下:

kongpingfan:~/environment/sam-app2 $ tree
.
├── events
│   └── event.json
├── hello-world
│   ├── app.js
│   ├── package.json
│   └── tests
│       └── unit
│           └── test-handler.js
├── README.md
└── template.yaml

项目说明

hello-world/app.js声明了Lambda代码,它返回一个固定的json体:

exports.lambdaHandler = async (event, context) => {
    try {
        // const ret = await axios(url);
        response = {
            'statusCode': 200,
            'body': JSON.stringify({
                message: 'hello world',
                // location: ret.data.trim()
            })
        }
    } catch (err) {
        console.log(err);
        return err;
    }

    return response
};

template.yaml文件结构和上一节基本类似,注意到其中有额外的Events模块:

      Events:
        HelloWorld:
          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: /hello
            Method: get

如果有Lambda的使用经历,可能会注意到Lambda有Trigger配置

image-20220306225542047

Events字段描述了触发Lambda的资源(Api对应AWS API Gateway), 并支持以下选项:

Type: S3 | SNS | Kinesis | DynamoDB | SQS | Api | Schedule | CloudWatchEvent | EventBridgeRule | CloudWatchLogs | IoTRule | AlexaSkill | Cognito | HttpApi | MSK | MQ | SelfManagedKafka


所以,本项目不仅会部署Lambda函数,而且会一同部署API Gateway。架构如下

image-20220306174514253

参考: https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-function-eventsource.html