Help us understand the problem. What is going on with this article?

AWSのAPI Gateway + LambdaをSAM CLIを使ってGolangで試してみた

More than 1 year has passed since last update.

今までGCPを触ってきましたが、最近AWSを使う機会が多くなってきたので、SAM CLIを使ってローカルで動かしてデプロイまで試してみました

前提条件

  • macOS Mojave (10.14.1)
  • pyenv 1.2.7
  • python 2.7.14
  • pip 9.0.1
  • sam 0.6.2

SAM CLIとは

AWS SAM に基づくツールであり、サーバーレスアプリケーションを Lambda ランタイムにアップロードする前にローカルで開発、テスト、および分析するための環境を提供します。

詳細はこちら

SAM CLIのインストール

SAM CLIをインストールする前にDockerをインストールする必要があります
Dockerのインストールはこちら

DockerをインストールしたらpipでSAM CLIをインストールします
今回はpyenvでpython 2.7.14を使いました

# Install PyEnv (https://github.com/pyenv/pyenv#installation)
$ brew update
$ brew install pyenv

# Initialize pyenv using bash_profile
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.bash_profile
# or using zshrc
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
$ echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.zshrc

# restart the shell
$ exec "$SHELL"

# Install Python 2.7
$ pyenv install 2.7.14
$ pyenv local 2.7.14

# Install the CLI
$ pip install aws-sam-cli

# Verify your installation worked
$ sam –-version
SAM CLI, version 0.6.2

アプリケーションの雛形を作成

sam init コマンドでアプリケーションの雛形を作成できます

$ sam init -r go1.x
$ tree sam-app
sam-app
├── Makefile
├── README.md
├── hello-world
│   ├── main.go
│   └── main_test.go
└── template.yaml

ローカルで実行

パッケージをインストールして go build したら sam local start-api コマンドでローカルで実行できます
Makefileが予め用意されているので、Goのビルドは make build で行います

$ dep init
$ make build
GOOS=linux GOARCH=amd64 go build -o hello-world/hello-world ./hello-world
$ sam local start-api
2018-11-12 22:56:23 Mounting HelloWorldFunction at http://127.0.0.1:3000/hello [GET]
2018-11-12 22:56:23 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
2018-11-12 22:56:23  * Running on http://127.0.0.1:3000/ (Press CTRL+C to quit)

この状態でcurlをたたくと、レスポンスが返ってきます

$ curl 127.0.0.1:3000/hello
Hello, <IP_ADDRESS>

デプロイ

デプロイもSAM CLIで行います

$ # s3バケットを作成
$ aws s3 mb s3://sam-deploy-<YOUR_ACCOUNT_ID> --region ap-northeast-1
make_bucket: sam-deploy-<YOUR_ACCOUNT_ID>
$ # Packaging
$ sam package \
    --template-file template.yaml \
    --output-template-file serverless-output.yaml \
    --s3-bucket sam-deploy-<YOUR_ACCOUNT_ID>
Uploading to 9543f7f01a265998376958f78ccb4f3c  4336441 / 4336441.0  (100.00%)
Successfully packaged artifacts and wrote output template to file serverless-output.yaml.
Execute the following command to deploy the packaged template
aws cloudformation deploy --template-file /path/to/serverless-output.yaml --stack-name <YOUR STACK NAME>
$ # Deploying
$ sam deploy \
    --template-file serverless-output.yaml \
    --stack-name <YOUR STACK NAME> \
    --capabilities CAPABILITY_IAM

Waiting for changeset to be created..
Waiting for stack create/update to complete
Successfully created/updated stack - <YOUR STACK NAME>

これでデプロイは完了です、AWSのコンソール画面から確認すると、デプロイしたLambda関数とAPI Gatewayが確認できます
curlを叩いてもレスポンスが正常に返ってきます

$ curl https://<YOUR_URL>.execute-api.ap-northeast-1.amazonaws.com/Prod/hello
Hello, <IP_ADDRESS>

まとめ

SAM CLIを使うと、ローカルで簡単にLambda関数の開発、テストが行えるので便利です
また、まだ試してないですがAPI Gatewayだけでなく、S3、DynamoDBイベントに対応する関数の実装とテストもできるようです、この辺は試してみたら書きたいと思います

sh0e1
Web Engineer / Go / PHP / JavaScript / GCP
https://sh0e1.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした