どーも!
たかぽんです!
今回は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コマンドがない場合は以下のような出力が出てくると思います。
(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管理からのデプロイ〜といった流れも試せればなと思います...!
それでわ!