AWS SAM (with Ruby) を使って Serverless でメールフォームを開発する 【環境構築編】

どうも!!Technorogy Depertment 所属の hokupod です。 熱いのが大嫌いなので、一日いや一秒でも早く夏が通り過ぎて欲しいと願っております。

そんなわけで今回は AWS SAM を用いた開発について書きます。 今回は環境構築までになります!では張り切って参りましょー。

ざっくりとした設計は下記になります。次回以降こちらに沿って開発をしていきますので、お楽しみに。

SAMアプリケーション設計図

AWS SAM とは

AWS サーバーレスアプリケーションモデル (SAM、Serverless Application Model) は、サーバーレスアプリケーション構築用のオープンソースフレームワークです。迅速に記述可能な構文で関数、API、データベース、イベントソースマッピングを表現できます。リソースごとにわずか数行で、任意のアプリケーションを定義して YAML を使用してモデリングできます。デプロイ中、SAM が SAM 構文を AWS CloudFormation 構文に変換および拡張することで、サーバーレスアプリケーションの構築を高速化することができます。 参考:https://aws.amazon.com/jp/serverless/sam/

ざっくりと掻い摘みますと、YAMLというテキストファイルでサーバなどのリソースを手配できて、かつそのルーティングや呼び出す関数もまとめて定義できるよ! もちろんその関数も一緒に書いてね、まとめてビルドしちゃうよ! という感じです。

事前準備

環境に必要なものは下記になります。

  • Python
  • Docker
  • AWS CLI
  • SAM CLI
  • rbenv (Ruby 2.5系が入れば、rvmでもなんでもOK)

Python と Docker の導入は、いろいろなサイトで紹介あるかと思いますので飛ばします。 また今回 macOS で行ったため、他OSについては適宜変換お願いいたします。

AWS CLI と SAM CLI の導入

AWS CLI は AWS リソースコントロールなどをコマンドラインにて、操作するためのツールです。 後ほど、S3バケットを作っていく際にも使用します。 SAM CLI は SAM のビルド/公開したり、ローカルテストしたりするためのツールです。

homebrew を導入している場合は下記でインストール可能です。

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

rbenv

rbenv (with ruby-build) は Ruby を複数バージョンインストールする際の便利ツールです。 今回はローカルテストのために導入をします。

こちらも homebrew でサクッといれていきます。 また AWS Lambda が対応している Ruby のバージョンが 2.5系 のため対応したものをインストールします。 rbenv のセットアップについてもまとめてやっていますが、詳細については 公式 を確認ください。

➜ brew install rbenv ruby-build
➜ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
➜ source ~/.bash_profile 
➜ rbenv install 2.5.3

IAM ユーザの作成

AWS SAM をデプロイするための IAM ユーザを作成します。 このときの権限ですが、 IAM ロールを作成したり、 各リソースを作成する必要がありますので今回は AdministratorAccess で作成しました。 本番では、ご利用は計画的に。

あ、認証情報のダウンロードは忘れずに。

AWS CLI のセットアップ

AWS の認証情報を AWS CLI に設定します。
今回は東京リージョン(ap-northeast-1) で進めます。
コマンドのオプションは こちら を参照下さい。

➜ aws configure --profile mailform
AWS Access Key ID [None]: {key_id}
AWS Secret Access Key [None]: {secret}
Default region name [None]: ap-northeast-1
Default output format [None]: json

S3 バケットの作成

ビルドした SAM をアップロードするために、AWS CLI でサクッと S3 バケットを作成します。

➜ aws s3 mb s3://mailform-sam-bucket --region ap-northeast-1

SAM の雛形を生成

いよいよアプリ開発に入るために、雛形を生成します。
但し今回は本題には入らず、お試しで hello_world という SAM を生成します。
コマンドのオプションは こちら を参照下さい。

下記では 使用する言語出力先のパス を指定しています。

➜ sam init -r ruby2.5 -n hello_world

        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

[+] Initializing project structure...

Project generated: ./hello_world

Steps you can take next within the project folder
===================================================
[*] Invoke Function: sam local invoke HelloWorldFunction --event event.json
[*] Start API Gateway locally: sam local start-api

Read hello/README.md for further instructions

[*] Project initialization is now complete

生成後の結果は以下のようになっているかと思います。

➜ tree hello_world
hello_world
├── Gemfile
├── README.md
├── event.json
├── hello_world
│   ├── Gemfile
│   └── app.rb
├── template.yaml
└── tests
    └── unit
        └── test_handler.rb

3 directories, 7 files

ローカル上での動作確認

試しにローカルで実行するところまで、進めて行きます。

まずはビルド。

➜ sam build --use-container
2019-08-02 17:50:01 Starting Build inside a container
2019-08-02 17:50:01 Building resource 'HelloWorldFunction'

Fetching lambci/lambda:build-ruby2.5 Docker container image....

2019-08-02 17:53:03 Mounting /path/to/hello/lambda_functions/hello_world as /tmp/samcli/source:ro,delegated inside runtime container

Build Succeeded

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

Commands you can use next
=========================
[*] Invoke Function: sam local invoke
[*] Package: sam package --s3-bucket <yourbucket>

Running RubyBundlerBuilder:CopySource
Running RubyBundlerBuilder:RubyBundle
Running RubyBundlerBuilder:RubyBundleDeployment

--use-container は Docker を用いて、Lambda の実行環境と同等の環境でビルドすることができます。 これによって、Kaminari など RubyGems に用いられる Native Extention のビルドも可能になります。

ローカルで API を立ち上げる

SAM ではローカル(Docker)で、API Gatewayのような振る舞いをしてくれる API を立ち上げることができます。

➜ sam local start-api
2019-08-05 12:09:12 Mounting HelloWorldFunction at http://127.0.0.1:3000/hello [GET]
2019-08-05 12:09:12 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
2019-08-05 12:09:12  * Running on http://127.0.0.1:3000/ (Press CTRL+C to quit)

curl で叩くと、返答が返ってきます。

➜ curl http://127.0.0.1:3000/hello
{"message":"Hello World!"}

まとめ

環境構築の流れとしては以上になります。 次回からは開発の方に進んでいきます。 まずはメールから入力された内容をバリデーション -> DynamoDB保存 の流れを書いていこうと思いますので、引き続き読んでいただけると嬉しいです!!

では!!


バレットグループについてはこちら

bltinc.co.jp