Step1: Install

本機環境:Windows10

========注意! 2019/10/28 updated========

在 Windows 環境中使用 pip 安裝 sam ,在執行時會發生 「NpipeHTTPAdapter 沒有定義」的錯誤 ref。 解決方式是使用 msi 方式安裝 ref

==================================

  • 安裝 Docker for windows

    這是Option選項,要用 sam 做本機測試的話需要安裝 docker, sam 會用近似 AWS Lambda 的執行環境去執行你的程式。

  • 安裝 python 3.6+ download

    python –version

  • 確認將 python 的執行檔加入環境變數 PATH

  • 安裝 pip (或是說確認 pip,python 3 >= 3.4, python 2 >= 2.7.9 預設 python 裝好就會有)

1
pip3 --version
  • 安裝 aws-sam-cli
1
pip install --user aws-sam-cli
  • 確認 aws 安裝完成
1
aws --version

當前的版本輸出為:aws-cli/1.16.263 Python/3.7.4 Windows/10 botocore/1.12.253

  • 更新 aws-sam-cli
1
pip install --user --upgrade aws-sam-cli
  • 確認 sam 安裝完成
1
sam --version

當前的版本輸出為:SAM CLI, version 0.22.0

若在執行上述指令 sam or aws 出現找不到該指令的話,請確定環境變數中有將套件的路徑放在 Path 中(使用者變數即可)。

aws 路徑的位置可以參考官方說明

sam 的安裝也有兩種官方說明

若是使用 pip 的方式安裝基本上可以在 %USERPROFILE%\AppData\Roaming\Python\{python version}\Scripts 這個地方找到

Step2: Develop

使用 SAM 的方法:

執行以下指令,使用SAM來初始化你的專案

1
sam init --runtime nodejs10.x --name your_project_name

Ps1. sam init --help

Ps2. sam init official doc

這個指令可以調出這個指令的說明文件

官方的 template 可以從這裡取得

預設會產生 hellow_world 這個資料夾,且路徑名稱會使用 hello,可依據個人使用情境做更動。

執行以下指令:

1
sam local start-api

上述指令會下載 docker 並將你的 lambda 程式放上去跑,所以第一次啟用時間會有點久,而且若沒有安裝 docker 會失敗。

接下來使用 POSTMAN 發送 request (預設會使用 http://127.0.0.1:3000 這個位址和阜)

預設會是 Get 方法,所以用 Get 去打 http://127.0.0.1:3000/hello 就會得到回應。

========2020/06/20 補充========

因為 AWS Serverless 也開始支援 dotnet core 3.1 了,所以這邊也稍微提一下 AWS SAM 如何支援 dotnet core 在 AWS Serverless 的開發與本機測試。

  • mkdir your\_folder_name

    建立一個資料夾將你的程式擺在那裡

  • sam init

    直接呼叫初始化 command ,除了官方提供的 template 之外還可以支援自定義的 template

    Which template source would you like to use?

    1 - AWS Quick Start Templates
    2 - Custom Template Location
    
  • 選擇 Quick Start 後就可以選擇目前他能支援的語言

    Which runtime would you like to use?

    1 - nodejs12.x
    2 - python3.8
    3 - ruby2.7
    4 - go1.x
    5 - java11
    6 - dotnetcore3.1
    7 - nodejs10.x
    8 - python3.7
    9 - python3.6
    10 - python2.7
    11 - ruby2.5
    12 - java8
    13 - dotnetcore2.1
    

目前(2020/06)官方版本可以支援就這 13 種語言與版本,當然每種語言跟版本提供的 template 並不相同,支援度最高的依然是 nodejs,而目前看下來 dotnet core 支援的 template 應該是最少的。選擇 6 之後他會去 github 抓 template 這邊會需要等一下。

選擇 Hello World Example 後輸入 project 名稱即可。

進去剛建立好的 project 裡,因為是編譯式語言的關係可以先 dotnet build 一下才不會讓 VS Code 跳紅字。然後就可以先去看看 template.yaml,這邊會有等一下測試時會需要改的地方。

Resources 層級下的第一個值就是等一下要啟動方法的名稱,以 template 預設來講就是 HelloWorldFunction,然後 CodeUri 也是最好要改一下的地方,因為 SAM 是會把 Code 丟去 Docker 跑,所以這個路徑最好不要是放 source code 的地方,而是編譯後的檔案位置比較好。

可以簡單的執行這語法來試試 donet publish your_csproject_path -o your_artifact_path 這樣你就可以在 artifact path 看到你的 build 了(其實不改 CodeUri 路徑的話就要確保路徑中要包含 deps.json 檔案)。

然後接下來最好要改一下 sample code 不然就算改了 event.json 檔案你也看不到變化。

1
2
3
4
5
6
    var body = new Dictionary<string, string>
    {
        { "message", "hello world" },
        { "location", location },
        { "apigProxyEvent", apigProxyEvent.Body}
    };

在 dotnet core 裡 APIGatewayProxyRequest 這個類別就是用來接傳入 function 的 request data entity 類別,當然改好 code 後不要忘記再 publish 一次。然後我們可以進去 events 資料夾內的 event.json 來修改送入 request 的資料了。這邊我們要改的就只有 body 這個欄位的內容就好。改好之後我們就可以來實際在本機測試看看我們寫的 function 了。

sam local invoke HelloWorldFunction -e your_event.json_path -t your_template.yaml_path

這邊的 HelloWorldFunction 就是看 template.yaml 裡 Resources 的名稱,執行後你應該就可以看看到測試的結果了,在 local invoke 的情況下他會把所有輸出都顯示在 console 裡。

===================================

使用 SAM 來進行 local debug,我覺得最不方便的地方就是它不能設定中斷點來看當下的狀態,不過 SAM 除了用來開發與本機除錯之外,其實還有發布功能,看在瑞士刀的份上,就原諒它功能沒這麼強悍吧~

Reference

  • SAM Repo: ref
  • SAM Template: ref
  • AWS SAM local debug: ref
  • VS Code Toolkit: ref
  • AWS Cli: ref
  • AWS SAM Cli: ref