どうも!!Technorogy Depertment 所属の hokupod です。 熱いのが大嫌いなので、一日いや一秒でも早く夏が通り過ぎて欲しいと願っております。
そんなわけで今回は AWS 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保存 の流れを書いていこうと思いますので、引き続き読んでいただけると嬉しいです!!
では!!
バレットグループについてはこちら