LambdaやAPIGatewayをちょこちょこいじってますが、goなどを使っているとローカルでの開発時にはAPIなどと直接連携したりすることはできません。
またデプロイ自体が面倒で画面からポチポチやらないといけないなーと思っていたところ、これらの環境をローカルで実行でき、デプロイまで自動化できるツールがあるとのことでちょっと調査してみました。
SAM
以前、cloudformationやterraformについては調べましたが、サーバーレス系のサービス(Lambda、APIGateway、DynamoDB)専用のフレームワークがそこそこあるようで、
- AWS SAM
- ServerlessFramework
がよく使われているようです。
AWSの公式ということもあり、AWS SAMを簡単に使ってみました。
実際の使用
awscliのインストールは前提になるかと思います。
インストール
テスト的に作ったgitのURL
https://github.com/umanari145/sam
1 2 3 |
brew tap aws/tap brew install aws-sam-cli sam --version |
プロジェクト作成
1 |
sam init --runtime go1.x(言語をいろいろ選べる) --name プロジェクト名 |
上記コマンドを入力しますと、ウィザードが色々と立ち上がりテンプレート的なものが作られます。
一番最初に聞かれる下記のような質問ですが、慣れないうちは1を選択しておけば問題ないかと思います。
1 2 3 |
Which template source would you like to use? 1 - AWS Quick Start Templates 2 - Custom Template Location |
テンプレートの見方
実際のビルド、デプロイはプロジェクト内のtemplate.ymlによって行われます。
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 32 33 34 35 36 37 38 39 40 41 |
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: > sam-app Sample SAM Template for sam-app Globals: Function: Timeout: 5 Resources: # リソース名 LambdaSampleFunction: # リソース種別(Lambdaはこの書き方) Type: AWS::Serverless::Function Properties: # 成果物のパス(ディレクトリまで) CodeUri: "./lambdaSample/" # ハンドラー Handler: main # Runtime Runtime: go1.x # 環境変数セット Environment: Variables: TEST: test Events: # この設定だけでAPIgetewayが自動生成される Api: Type: Api Properties: Path: /sample Method: get Outputs: LambdaSampleFunction: Description: "First Lambda Function ARN" Value: !GetAtt LambdaSampleFunction.Arn LambdaSampleIamRole: Description: "Implicit IAM Role created for Hello World function" Value: !GetAtt LambdaSampleFunctionRole.Arn |
慣れないうちは見方が大変ですが、Lambda+APIGateWayの最小設定だけでしたら上記で問題ないかと思います。
AWSのサービスは基本的にResourceで定義するのですが、上記のようにトリガー時の処理であるEventsに定義しておくだけでAPIGatewayも作られます。
ローカルでのテスト
APIGatewayのダミーのレスポンスですが、下記の用にして作成可能です。
1 |
sam local generate-event apigateway aws-proxy > event_api.json |
Lambdaローカル実行は下記コマンドで実行できます。
1 |
sam local invoke Resourceで定義された関数名(この場合はLambdaSampleFunction) --event event_api.json |
ローカルでLambda+APIGatewayの仮想環境を構築しており、少し時間(4〜5秒)がかかるので実際の開発時にはやはりテストコードの方が効率がいいかもしれません。
pythonはもっと楽でしたが・・・汗
ビルド&デプロイ
実際に定義した後は下記コマンドでAWS側に反映できます。
注意点として当たり前ですが、必ずbuildしてからdeployしましょう(汗)。
1 2 3 4 5 6 7 8 9 10 |
#Makefileのなかのコマンドを実行します make build #実際のデプロイです。初回は--guided必要 sam deploy --guided #全てyesでOK(ここでおそらくdeploy前準備のようなもの) #その後、再度 sam deploy #Deploy this changeset?と聞かれるのでyを押すと、実際にデプロイが反映されます。 |
実際にAWSにログインして、サービスが作られていればOKです。