AWS

AWS SAM CLI x Windows10 環境構築

AWS Lambdaにサーバレスモジュールを載せたいけど開発はどうやって行えばいいの。。。?

そんな時に使えるのが公式から出されている、AWS SAM CLIです。

AWS SAM LOCALの後身バージョンみたいですね。

私もLambdaにモジュールを載せようとおもうので、環境構築手順とハマったことなどを載せていきます。

開発環境

・Windows 10 Pro ※Dockerインストール済み

Docker環境の構築手順をのせておきます。

Docker環境構築 Windows10で仮想環境を楽々構築

環境構築

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でかえってくれば成功です。

最後に

かなりハマりましたが、動作する環境を作ることができました。

より詳しい使用方法は今後記事にしていきます。

ご意見、ご感想等ございましたら、↓よりコメントお願いします。励みになります。

以上です。今後ともよろしくお願いします。

-AWS

Copyright© 婿入りエンジニア、ブログ書く , 2019 All Rights Reserved.