使用 AWS SAM 建置與執行無伺服器應用程式

安裝套件

首先,到 AWS Serverless Application Model 頁面,手動下載並安裝 SAM CLI 執行檔。

建立專案

建立工作目錄。

1
2
mkdir aws-sam-example
cd aws-sam-example

使用以下指令,初始化工作目錄。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
sam init

Which template source would you like to use?
1 - AWS Quick Start Templates
2 - Custom Template Location
Choice: 1

Choose an AWS Quick Start application template
1 - Hello World Example
2 - Multi-step workflow
3 - Serverless API
4 - Scheduled task
5 - Standalone function
6 - Data processing
7 - Hello World Example With Powertools
8 - Infrastructure event management
9 - Serverless Connector Hello World Example
10 - Multi-step workflow with Connectors
11 - Lambda EFS example
12 - DynamoDB Example
13 - Machine Learning
Template: 1

Use the most popular runtime and package type? (Python and zip) [y/N]: y

Would you like to enable X-Ray tracing on the function(s) in your application? [y/N]: ENTER

Would you like to enable monitoring using CloudWatch Application Insights?
For more info, please view https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch-application-insights.html [y/N]: ENTER

Project name [sam-app]: ENTER

進入 sam-app 資料夾。

1
cd sam-app

建置應用程式

若電腦為 ARM 架構,則修改 sam-app/template.yaml 檔如下:

1
2
3
4
5
6
7
8
9
Resources:
HelloWorldFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: hello_world/
Handler: app.lambda_handler
Runtime: python3.9
Architectures:
- arm64 # 改成 arm64

使用以下指令,建置應用程式。

1
sam build

完成後,會產生一個 .aws-sam 目錄,用來處理函式相依性、專案程式碼和專案檔案。

部署應用程式

使用以下指令,部署應用程式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
sam deploy --guided

Configuring SAM deploy
======================

Looking for config file [samconfig.toml] : Found
Reading default arguments : Success

Setting default arguments for 'sam deploy'
=========================================
Stack Name [sam-app]: ENTER
AWS Region [us-west-2]: ENTER
#Shows you resources changes to be deployed and require a 'Y' to initiate deploy
Confirm changes before deploy [Y/n]: n
#SAM needs permission to be able to create roles to connect to the resources in your template
Allow SAM CLI IAM role creation [Y/n]: ENTER
#Preserves the state of previously provisioned resources when an operation fails
Disable rollback [y/N]: ENTER
HelloWorldFunction may not have authorization defined, Is this okay? [y/N]: y
Save arguments to configuration file [Y/n]: ENTER
SAM configuration file [samconfig.toml]: ENTER
SAM configuration environment [default]: ENTER

執行應用程式

使用以下指令,列出應用程式 API 端點。

1
sam list endpoints --output json

從本機呼叫。

1
2
3
curl https://fv3hvx5iyk.execute-api.ap-northeast-1.amazonaws.com/Prod/hello

{"message":"hello world"}

使用以下指令,從遠端呼叫。

1
sam remote invoke HelloWorldFunction --stack-name sam-app

同步應用程式

使用以下指令,同步應用程式並監聽變化。

1
sam sync --watch

修改 sam-app/hello_world/app.py 檔。

1
2
3
4
5
6
7
8
9
10
11
import json
# ...
def lambda_handler(event, context):
# ...
return {
"statusCode": 200,
"body": json.dumps({
"message": "hello everyone!",
# ...
}),
}

等待變更,再從本機呼叫一次。

1
2
3
curl https://fv3hvx5iyk.execute-api.ap-northeast-1.amazonaws.com/Prod/hello

{"message":"hello everyone!"}

測試應用程式

使用以下指令,可以在本機啟動一個 Docker 容器,並且執行應用程式。

1
2
3
sam local invoke

{"statusCode": 200, "body": "{\"message\":\"hello world\"}"}

使用以下指令,在本機啟動一個 HTTP 伺服器。

1
sam local start-api

從本機呼叫。

1
2
3
curl http://127.0.0.1:3000/hello

{"message":"hello world"}

刪除應用程式

使用以下指令,刪除應用程式。

1
sam delete

程式碼

參考資料