Chapter 03無料公開

サンプルプログラムをデプロイする

ウチコ
ウチコ
2021.05.12に更新

サンプルプログラムの概要

この章では、サンプルプログラムを実際にAWSにデプロイします。
次のような構成になります。

AWSの構成

サンプルプログラムの仕様自体は、RailsチュートリアルにあるToyアプリを参考にしています。
「Twitterのような短文投稿サイト」を想定しています。
以下は、アプリのER図になります。

サンプルプログラムのER図

ER図であらわしていますが、実際にはNoSQLであるDynamoDBで実装しています。

ユーザーとマイクロポストの登録/取得/更新/削除が一通りできるようになっています。

それでは、実際に構築していきましょう。

Dockerのインストール

サンプルプログラムのテスト実行やデプロイ処理は、Docker上で行います。

https://www.docker.com/products/docker-desktop

上記のページからDocker for Macをダウンロードできます。
ダウンロードするためにはdockerのアカウントを作成する必要があります。
インストールすると、ターミナルでdockerコマンドとdocker-composeが使用できるようになります。

Githubからサンプルプログラムをcloneする

以下のコマンドで、Githubからサンプルプログラムをcloneします。

サンプルプログラムをclone
$ git clone git@github.com:memememomo/clean-serverless-book-sample.git

cloneしたら、ディレクトリを移動します。

サンプルプログラムのディレクトリに移動
$ cd clean-serverless-book-sample

今後のコマンドは、サンプルプログラムのプロジェクト内で実行することを想定しています。

環境変数にAPIキーを設定する

create-iam-user で取得した「アクセスキー」と「シークレットキー」を環境変数に設定します。

.env.aws-credentials.sample というファイルがあるので、これをコピーして .env ファイルを作成します。

.envファイルを作成
$ cp .env.aws-credentials.sample .env.aws-credentials

.env.aws-credentials ファイルを開くと、以下のような内容となっています。

.env.aws-credentialsファイルの内容
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=

AWS_ACCESS_KEY_ID にアクセスキーを、AWS_SECRET_ACCESS_KEY にシークレットキーを設定しましょう。
これで環境変数を設定したことになります。

デプロイする

一通りの設定ができたので、デプロイをします。
以下のコマンドを実行してください。

デプロイ
$ make deploy

実行すると、完了までに数分かかります。

Cloud Formationの画面でスタックの内容を確認する

CloudFormationの画面に移動して、スタックが作成されていることを確認してみましょう。
"clean-serverless-book-sample"という名前でスタックが作成されていると思います。

CloudFormationの画面

APIの動作確認する

API Gatewayの画面でエンドポイントを確認する

API Gatewayの画面に移動してください。以下のような画面が表示されます。

API Gateway画面

先程のデプロイにより"clean-serverless-book-sample"というAPIが作成されていると思いますので、
それをクリックして移動します。
以下のような画面になります。

api-gateway-api

左メニューの「ステージ」をクリックし、「dev」をクリックして、移動します。
すると、APIのエンドポイントが表示されます。

APIエンドポイント

このあと環境変数にセットする値ですので、コピーしておいてください。

環境変数にエンドポイントを設定する

curlコマンドで動作確認を行う際に、エンドポイントを参照するので、環境変数にセットしておきます。

エンドポイントの設定
$ export APIGATEWAY_ENDPOINT=https://xxxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev

以降のcurlコマンド例は、この設定を行ったことを前提に記載しています。

ユーザーを作成してみる

ユーザーを作成してみましょう。
次のコマンドを実行してみましょう。

ユーザーを作成(成功)
$ curl -XPOST $APIGATEWAY_ENDPOINT/v1/users -d '{"user_name":"テスト1","email":"test1@example.com"}'

{"message":"OK","id":1}

成功すると、作成されたユーザーのIDが含まれたレスポンスが返ってきます。例では「"id":1」の部分です。

失敗する場合も確認してみます。
次のコマンドを実行してみましょう。

ユーザーを作成(失敗)
$ curl -XPOST $APIGATEWAY_ENDPOINT/v1/users -d '{"user_name":"テスト1","email":"test1@example.com"}'

{"message":"入力値を確認してください。","errors":{"email":"すでに登録されているメールアドレスです。"}}

さきほど作成したユーザーと同じメールアドレスを設定していたので、バリデーションエラーが返ってきます。メールアドレスは一意である制約によるものです。

メールアドレスを異なるものに変更して、登録してみましょう。

2人目のユーザーを作成(成功)
$ curl -XPOST $APIGATEWAY_ENDPOINT/v1/users -d '{"user_name":"テスト2","email":"test2@example.com"}'
{"message":"OK","id":2}

今度は成功して、ユーザーIDが返ってきました。

ユーザーを取得してみる

作成したユーザーの一覧を取得してみます。次のコマンドを実行してみましょう。

ユーザー一覧を取得
$ curl -XGET $APIGATEWAY_ENDPOINT/v1/users

@<seqsplit>{{"users":[{"id":1,"user_name":"テスト1","email":"test1@example.com"},{"id":2,"user_name":"テスト2","email":"test2@example.com"}]}}

さきほど作成したユーザーの一覧がJSONの形で返ってきました。

ユーザーを更新してみる

IDが1のユーザーを更新してみます。次のコマンドを実行してみましょう。

ユーザーを更新
$ curl -XPUT $APIGATEWAY_ENDPOINT/v1/users/1 -d '{"user_name":"テスト1_更新","email":"test1_update@example.com"}'

{"message":"OK"}

更新が成功したことを表すメッセージが返されてきました。

実際に更新されたかどうか確認してみましょう。
次のコマンドを実行してみましょう。

更新したユーザーを取得
$ curl -XGET $APIGATEWAY_ENDPOINT/v1/users/1

@<seqsplit>{{"id":1,"user_name":"テスト1_更新","email":"test1_update@example.com"}}

更新コマンドで設定した値が反映されていることが確認できました。

ユーザーを削除してみる

IDが2のユーザーを削除してみます。次のコマンドを実行してみましょう。

ユーザーを削除
$ curl -XDELETE $APIGATEWAY_ENDPOINT/v1/users/2

{"message":"OK"}

削除が成功したことを表すメッセージが返されてきました。

実際に削除されたかどうか確認してみましょう。
次のコマンドを実行してみましょう。

更新したユーザーを取得
$ curl -XGET $APIGATEWAY_ENDPOINT/v1/users/2

{"message":"結果が見つかりません。"}

「結果が見つかりません。」というメッセージが返ってきて、実際に削除されていることを確認できました。

マイクロポストを作成してみる

マイクロポストを作成してみましょう。
次のコマンドを実行してみましょう。

マイクロポストを作成
$ curl -XPOST $APIGATEWAY_ENDPOINT/v1/users/1/microposts -d '{"content":"テストつぶやき"}'

{"message":"OK","id":1}

作成が成功して、作成されたマイクロポストのIDが返ってきました。「"id":1」の部分がマイクロソフトIDを表しています。

同じコマンドを使い、複数のマイクロポストを作成しておきましょう。

マイクロポストを取得してみる

作成したマイクロポストの一覧を取得してみましょう。
次のコマンドを実行してみましょう。

マイクロポスト一覧を取得
$ curl -XGET $APIGATEWAY_ENDPOINT/v1/users/1/microposts

{"microposts":[{"id":1,"user_id":1,"content":"テストつぶやき"},{"id":2,"user_id":1,"content":"テストつぶやき"}]}

さきほど作成したマイクロポストの一覧が返ってきました。

マイクロポストを更新してみる

IDが1のマイクロポストを更新してみましょう。
次のコマンドを実行してみましょう。

マイクロポストを更新
$ curl -XPUT $APIGATEWAY_ENDPOINT/v1/users/1/microposts/1 -d '{"content":"テストつぶやき更新"}'

{"message":"OK"}

更新が成功したことを表すメッセージが返されてきました。

実際に更新されたかどうか確認してみましょう。
次のコマンドを実行してみましょう。

更新したマイクロポストを取得
$ curl -XGET $APIGATEWAY_ENDPOINT/v1/users/1/microposts/1

{"id":1,"user_id":1,"content":"テストつぶやき更新"}

更新コマンドで設定した値が反映されていることが確認できました。

マイクロポストを削除してみる

IDが1のマイクロポストを更新してみましょう。
次のコマンドを実行してみましょう。

マイクロポストを削除
$ curl -XDELETE $APIGATEWAY_ENDPOINT/v1/users/1/microposts/1

{"message":"OK"}

削除が成功したことを表すメッセージが返されてきました。

実際に削除されたかどうか確認してみましょう。
次のコマンドを実行してみましょう。

削除したマイクロポストを取得
$ curl -XGET $APIGATEWAY_ENDPOINT/v1/users/1/microposts/1

{"message":"結果が見つかりません。"}

「結果が見つかりません。」というメッセージが返ってきて、実際に削除されていることを確認できました。

スタックを消す

スタックを消す
$ make delete-stack

しばらく時間が経過すると、スタックが消えます。