AWS Lambdaにサーバレスモジュールを載せたいけど開発はどうやって行えばいいの。。。?
そんな時に使えるのが公式から出されている、AWS SAM CLIです。
AWS SAM LOCALの後身バージョンみたいですね。
私もLambdaにモジュールを載せようとおもうので、環境構築手順とハマったことなどを載せていきます。
開発環境
・Windows 10 Pro ※Dockerインストール済み
Docker環境の構築手順をのせておきます。
環境構築
AWS SAM CLIインストール
以下よりインストーラをダウンロード
https://github.com/awslabs/aws-sam-cli/releases/download/v0.6.2/AWS_SAM_CLI_64_PY3.msi
インストーラはなりで進めればOK
インストール後、Windows PowerShellで以下の結果が得られたら成功。
sam --version
AWS SAM CLI 動作確認
実際に動作するモジュールを作って確認します。
アプリ生成
以下を実行して「c:/samTest」にアプリ生成します。
mkdir c:/samTest cd c:/samTest sam init --runtime nodejs
完了後、treeコマンドを使ってみると、以下のような構成でアプリが生成されています。
tree /a /f C:. \---sam-app | .gitignore | README.md | template.yaml | \---hello_world | app.js | package.json | \---tests \---unit test_handler.js
内容書き換え
この後、アプリを動かしますが、標準出力がどこから出てるのか把握するため、
「test_handler.js」を簡単に書き換えます。
hello worldの後に大量の「!」をつけました。
'use strict'; const app = require('../../app.js'); const chai = require('chai'); const expect = chai.expect; var event, context; describe('Tests index', function () { it('verifies successful response', async () => { const result = await app.lambdaHandler(event, context) expect(result).to.be.an('object'); expect(result.statusCode).to.equal(200); expect(result.body).to.be.an('string'); let response = JSON.parse(result.body); expect(response).to.be.an('object'); expect(response.message).to.be.equal("hello world!!!!!!!!!!!!!!!!!!!!!!!!!!"); expect(response.location).to.be.an("string"); }); });
実行確認
cd C:\samTest\sam-app\hello_world npm install npm test
結果はこんな感じ。見えづらいですが、入力した「!」が表示されてますね。
ローカル上でLambdaを動かす
API Gatewayの生成
ここでDockerが必須となります。多少時間がかかります。
cd C:\samTest\sam-app sam local generate-event apigateway aws-proxy > event_file.json sam local invoke HelloWorldFunction --event event_file.json
ここで私は以下のエラーがでました。
※ここで超絶ハマりました。
docker.errors.APIError: 500 Server Error: Internal Server Error ("OCI runtime create failed: container_linux.go:348: starting container process caused "process_linux.go:402: container init caused \"setenv: invalid argument\"": unknown")
OCIランタイムの作成に失敗したらしいですが、、、ピンときません。
OCI runtime create failed 解決方法
一応解決したので、やったことをすべて書きます。(おそらく4のみで解決します)
1.Pythonをインストール。環境変数に追加。
以下より取得できます。
https://www.python.org/downloads/
以下を環境変数のPathに追加。<ユーザー名>は適宜書き換えてください。
C:\Users\<ユーザー名>\AppData\Local\Programs\Python\Python37-32\ C:\Users\<ユーザー名>\AppData\Local\Programs\Python\Python37-32\Scripts
2.一度AWS SAM CLIをインストーラからアンインストールして、コマンド実行でインストールする
※Phytonコマンドなので、1で環境変数に通しておく必要があります。
pip install --user aws-sam-cli
3.Docker Toolboxのインストール
クリックでインストールが始まります
4.aws-sam-localのインストール
npm install -g aws-sam-local
おわったら以下で結果が得られたら成功
sam --version
この後先ほどエラーになった以下のコマンドを実行したら、成功しました。
sam local invoke HelloWorldFunction --event event_file.json
よくよく見ると、localとか書いてるから、察しろよってことかもしれないです。
もともとaws-sam-localを使用していた人はハマらないエラーかもしれないですね。
API Gatewayの起動
以下のコマンドを実行します。
sam local start-api
最新盤があるよって言われてるけど、とりあえずの動作確認なので以下でOK
実際にリクエストをとばしてみる
別ウィンドウでWindows PowerShellを起動して、以下を実行
curl https://127.0.0.1:3000/hello
StatusCode200でかえってくれば成功です。
最後に
かなりハマりましたが、動作する環境を作ることができました。
より詳しい使用方法は今後記事にしていきます。
ご意見、ご感想等ございましたら、↓よりコメントお願いします。励みになります。
以上です。今後ともよろしくお願いします。