【やってみた】AWS SAM CLIを使って Localでlambdaを動かし、デプロイしてみる!

どーも!

たかぽんです!

今回はlambdaをlocalで動かしてみようと思います...!

AWS SAM CLIを使って Localでlambdaを動かしてみる!

lambdaはサーバーレスにアプリケーションを構築する際に用いるものです。

AWSのコンソール上でプログラムを書いてあげればそれだけでアプリを動かすことができます。

簡単な環境変数等の設定はあれど、複雑なサーバーを立てたり...といったことは考えなくていいんですね...!

そんなlambdaですが、AWSの他サービスとの連携のしやすさ等で導入をすることがあります。

ただ、通常のアプリケーションのデプロイと少し異なる方法で対応をする必要があります。

そのため、例えばgitで管理したい場合や、いきなりlambdaをデプロイ(本番で動く形)するのではなく、localで動作確認...といったことを行います。

今回はそのlocalでコードを管理し、そのコードを使ったlambdaを動かしてみる...といったことをやってみようと思います!

事前準備

今回、Mac bookにて試していきます。

事前に必要となるのは

  • brew
  • docker
  • awsアカウント(secretID,アクセスキー)

になります。

それらが揃っている前提にてお話をしていきます。

aws sam cliをインストールする

まずは、awsのsam cliをインストールします。

samとは、そのままServerless Application Modelの略になっています。

これは、サーバーレスアプリケーションの作成と管理を容易にするコマンドラインツールです。

今回もlambdaの作成や管理をするために用います。

方法はとっても簡単です...!

以下の二つのコマンドを実行するだけでOKです...!

brew tap aws/tap
brew install aws-sam-cli

試した後は以下のコマンドでバージョンの確認をして、入っていることを確認します...!

sam --version

結果は以下のような感じになればOKです。

(base) taka@Taka docker-laravel % sam --version
SAM CLI, version 1.24.1

正しく入っていることが確認できたら、次にlambdaの設定を作っていきます。

samの初期環境を作成する

samでははじめやすいようにコマンドで初期の環境を整えることができます。

以下のコマンドを実行すればOKです。

sam init

initを実行すると、以下のように対話的に初期の設定をすることができます。

(base) taka@Taka docker-laravel % sam init

	SAM CLI now collects telemetry to better understand customer needs.

	You can OPT OUT and disable telemetry collection by setting the
	environment variable SAM_CLI_TELEMETRY=0 in your shell.
	Thanks for your help!

	Learn More: https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-telemetry.html

Which template source would you like to use?
	1 - AWS Quick Start Templates
	2 - Custom Template Location
Choice: 1
What package type would you like to use?
	1 - Zip (artifact is a zip uploaded to S3)
	2 - Image (artifact is an image uploaded to an ECR image repository)
Package type: 1

Which runtime would you like to use?
	1 - nodejs14.x
	2 - python3.8
	3 - ruby2.7
	4 - go1.x
	5 - java11
	6 - dotnetcore3.1
	7 - nodejs12.x
	8 - nodejs10.x
	9 - python3.7
	10 - python3.6
	11 - python2.7
	12 - ruby2.5
	13 - java8.al2
	14 - java8
	15 - dotnetcore2.1
Runtime: 4

Project name [sam-app]:

Cloning from https://github.com/aws/aws-sam-cli-app-templates

AWS quick start application templates:
	1 - Hello World Example
	2 - Step Functions Sample App (Stock Trader)
Template selection: 1

    -----------------------
    Generating application:
    -----------------------
    Name: sam-app
    Runtime: go1.x
    Dependency Manager: mod
    Application Template: hello-world
    Output Directory: .

    Next steps can be found in the README file at ./sam-app/README.md

今回はHello Worldのテスト環境でやってみます。

ここまでできたら、次はビルドしていきます!

(base) taka@Taka sam-app % sam build
Building codeuri: /Users/taka/Practice/NginxLaravel/docker-laravel/sam-app/hello-world runtime: go1.x metadata: {} functions: ['HelloWorldFunction']
Running GoModulesBuilder:Build

Build Succeeded

Built Artifacts  : .aws-sam/build
Built Template   : .aws-sam/build/template.yaml

Commands you can use next
=========================
[*] Invoke Function: sam local invoke
[*] Deploy: sam deploy --guided

"Build Succeeded"がでていればちゃんとビルドができているはずです。

Localで動作の確認を行う

ここまでできたら、localでlambdaの動作確認をするため、仮のHTTPサーバーを立ち上げます。

sam local start-api

実行するとこんな感じです。

(base) taka@Taka sam-app % sam local start-api
Mounting HelloWorldFunction at http://127.0.0.1:3000/hello [GET]
You can now browse to the above endpoints to invoke your functions. You do not need to restart/reload SAM CLI while working on your functions, changes will be reflected instantly/automatically. You only need to restart SAM CLI if you update your AWS SAM template
2021-06-11 08:00:31  * Running on http://127.0.0.1:3000/ (Press CTRL+C to quit)

これでサーバーが立ち上がり、"http://127.0.0.1:3000/hello"へGETリクエストを送ることで動作確認ができるようになりました...!

止めるには"^(control)+C"で止められますが、これを止めるとリクエストを送っても何も返ってこなくなるので、GETリクエストでの動作確認を行う際には動かした形にしてください。

では、試しにwebブラウザでアクセスしてみましょう...!

筆者はテキストを自分用に修正(デフォルトだと"Hello, <ipアドレス>)したので、"Hello, Takapon!"が表示されました...!

ちなみに書き換えた箇所は"main.go"の"handler"関数のreturnの値です。

	return events.APIGatewayProxyResponse{
		Body:       fmt.Sprintf("Hello, Takapon!"),
		StatusCode: 200,
	}, nil

これで、Localで実際にlambdaを記述し、それを動かして動作確認をすることができました...!

次は実際にawsへデプロイしてみます...!

sam cli を使ってawsへデプロイ

さて、それではやっていきましょう!

sam cliを使ってデプロイをする際、認証用のキー情報が必要になります。

キー情報は以下のコマンドを利用して設定していきます。(json等で管理もできるようですが今回はawsコマンドで行います)

(base) taka@Taka sam-app % aws configure
AWS Access Key ID [None]: {ここにアクセスキーID}
AWS Secret Access Key [None]: {ここにアクセスキー}
Default region name [None]:
Default output format [None]:

対話的に入力をするため、まず最初にAWS Access Key IDの入力を行うと次が出てくる...といった形です。

"{ここにアクセスキーID}"といった形で書かれている場所は最初は何も入力されていないので、ご自身のID, キーを入力してください。

regioんとoutput formatは一旦なくて大丈夫です。

この設定をすることで、sam cliでデプロイをする際のawsアカウントが決まります。

その際、認証情報を用いるので合わせてセキュリティ的な対策もできているんですね。

aws コマンドがない場合

awsコマンドがない場合は以下のような出力が出てくると思います。

(base) taka@Taka sam-app % aws configure
zsh: command not found: aws

この場合、awsのcliを入れればOKです。

以下の二つのコマンドでインストールをしてください。

$ curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
$ sudo installer -pkg AWSCLIV2.pkg -target /

ここまでできたら、あとはデプロイするだけです...!

(base) taka@Taka sam-app % sam deploy -g

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

	Looking for config file [samconfig.toml] :  Not found

	Setting default arguments for 'sam deploy'
	=========================================
	Stack Name [sam-app]:
	AWS Region [us-east-1]:
	#Shows you resources changes to be deployed and require a 'Y' to initiate deploy
	Confirm changes before deploy [y/N]: y
	#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]: y
	HelloWorldFunction may not have authorization defined, Is this okay? [y/N]: y
	Save arguments to configuration file [Y/n]: y
	SAM configuration file [samconfig.toml]: 
	SAM configuration environment [default]:

...

Deploy this changeset? [y/N]: y

...

Successfully created/updated stack - sam-app in us-east-1

アプリ名やconfigファイル名等を設定するかどうか聞かれるので、それぞれ回答していきます。

”Successfully..."というのが出ていれば、デプロイも完了しているはずです。

コンソール上で確認をしてみると...?

lambdaに関数が追加されていました...!

この確認時、リージョンは気をつけてください。

先程認証情報を設定する時に、キー、IDのみ設定した人は"us-east-1"になっているかと思います。

リージョンも設定している場合、そのリージョンになっているかもしれないので、lambdaが出てこない場合は確認してみてください。

最後に動作確認をしておけばよりばっちりです。

デプロイをした際、API Gatewayも設定を行なっていて、デプロイで出てくる文章の中に以下のような文があると思います。

CloudFormation outputs from deployed stack
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Outputs
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Key                 HelloWorldFunctionIamRole
Description         Implicit IAM Role created for Hello World function
Value               arn:aws...

Key                 HelloWorldAPI
Description         API Gateway endpoint URL for Prod environment for First Function
Value               https://**********.execute-api.us-east-1.amazonaws.com/Prod/hello/

Key                 HelloWorldFunction
Description         First Lambda Function ARN
Value               arn:aws...
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------

その中の"HelloWorldAPI"の中に"https"から始まっている箇所があると思うので、それをコピペしてブラウザに貼り付けると、正しく値が返ってきます。(伏せ字部分はランダムな文字列が入っているはずです)

まとめ

今回はsam cliとlambdaを用いてlocalで開発、動作確認、デプロイをするところまで見てみました...!

正直細かいところは理解しきれていない部分も多いのですが(きっとsam-cliが色々やってくれているので...)、対してawsの知識のない筆者でも簡単なlambdaを手元で動かすことができました...!

CI/CDを絡めたりするとgithub actiolnsとうとうも絡んできそうなきがしますが、また余裕があればgit管理からのデプロイ〜といった流れも試せればなと思います...!

それでわ!

おすすめの記事