2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

AWS App RunnerAdvent Calendar 2022

Day 5

AWS App Runnerを学ぶためtDiaryをデプロイしてみる

Last updated at Posted at 2022-12-04

AWS App Runner Advent Calendar 2022」の5日目の記事です。

はじめに

App Runnerの学習目的で、tDiaryをデプロイしてみました。実運用を想定したものではありませんが、VPC内のリソースに接続するサンプルとして、参考になれば幸いです。

大まかな流れは下記の通りです。

  1. App Runnerサービス以外のリソースを作成する
  2. tDiaryのDockerイメージをビルドしてECRにpushする
  3. App Runnerサービスを作成する
  4. サービスのデフォルトドメインにアクセスする
  5. tdiary.confを編集して再デプロイする
  6. デフォルトドメインに再度アクセスする
  7. 日記を書く
  8. 作成したリソースを削除する

読者の方にも手軽に試していただけるよう、CloudFormationテンプレートを用意しました。ただし、内容を充分ご確認の上、自己責任でお願いします。

1. App Runnerサービス以外のリソースを作成する

まず、infrastructure.jsonを使ってCloudFormationスタックを作成します。リージョンは、後述のリソースが作れるところなら、どこでも構いません。

スタック名は、あとで使う関係で「tdiary-infrastructure-stack」をお勧めします。

スタックのパラメータとして、Redisのポートと、VPCのIPv4 CIDRブロックが指定できます。デフォルト値はそれぞれ「6379」と「172.33.0.0/16」です。必要に応じてご変更ください。他の設定項目は、デフォルトのままでOKです。

infrastructureスタック作成画面.png

実行してしばらく待つと、以下のリソースが作成されます。

VPC関連リソース

  • VPC
  • サブネット
  • ルートテーブル(サブネットに関連付ける)

ECR関連リソース

  • プライベートリポジトリ

App Runner関連リソース

  • IAMロール(ECRへのアクセスロール)
  • VPCコネクタ
  • セキュリティグループ(VPCコネクタに関連付ける)

ElastiCache関連リソース

  • Redisクラスター(日記データのキャッシュを保存する)
  • セキュリティグループ(Redisクラスターに関連付ける)
  • サブネットグループ

2. tDiaryのDockerイメージをビルドしてECRにpushする

次に、下記の要領でtDiaryのDockerイメージをビルドします。<> で囲まれた部分は、適宜お読み替えください。

$ git clone https://github.com/iwamot/tdiary-core.git
$ cd tdiary-core

// Basic認証用の .htpasswd ファイルを作成
$ htpasswd -cd data/.htpasswd <username>

$ docker build -t tdiary .

ちなみにiwamot/tdiary-coreは、公式のtdiary/tdiary-coreをforkして下記の変更を加えたものです。

具体的な差分は下記コミットの通りです。

イメージがビルドできたら、ECRリポジトリにpushします。

$ aws ecr get-login-password --region <region> | docker login --username AWS --password-stdin <account>.dkr.ecr.<region>.amazonaws.com
$ docker tag tdiary:latest <account>.dkr.ecr.<region>.amazonaws.com/tdiary:latest
$ docker push <account>.dkr.ecr.<region>.amazonaws.com/tdiary:latest

3. App Runnerサービスを作成する

続いて、service.jsonを使ってCloudFormationスタックを作成します。スタックに含まれるリソースはApp Runnerサービスのみです。

スタック名は「tdiary-service-stack」が分かりやすいと思います。が、何でも構いません。

パラメータとして、手順1で作ったスタック名を指定します。デフォルト値は「tdiary-infrastructure-stack」です。他の設定項目は、デフォルトのままでOKです。

serviceスタック作成画面.png

4. サービスのデフォルトドメインにアクセスする

App Runnerサービスの作成が完了したら、デフォルトドメインにアクセスします。すると、tDiaryの初期画面が開きます。

tDiary初期画面.png

さっそく日記のタイトルを変えたくなりますが、急いで「サイトの情報」で変更してはいけません。コンテナ内のtdiary.confに反映されるだけで、コンテナが変わったら巻き戻ってしまうためです。

5. tdiary.confを編集して再デプロイする

日記のタイトルを永続的に変えるには、tdiary.confを編集し、Dockerイメージを再ビルドします。

$ cp tdiary.conf.beginner tdiary.conf

// tdiary.conf の @html_title を編集

$ diff tdiary.conf.beginner tdiary.conf
88c88
< @html_title = %Q[【日記のタイトル】(→<a href="#{@update}?conf=default">サイトの情報</a>で変更しましょう)]
---
> @html_title = "tDiary on AWS App Runner"

$ docker build -t tdiary .

ビルドできたら、ECRに再pushします。

$ docker tag tdiary:latest <account>.dkr.ecr.<region>.amazonaws.com/tdiary:latest
$ docker push <account>.dkr.ecr.<region>.amazonaws.com/tdiary:latest

pushするだけで自動デプロイされます。

6. デフォルトドメインに再度アクセスする

デプロイ完了後、デフォルトドメインに再度アクセスすると、日記のタイトルが変わっています。

タイトル変更後.png

7. 日記を書く

せっかくなので、日記を書いてみましょう。右上の「追記」リンクから投稿フォームに遷移できます。Basic認証を求められたら、手順2で指定したユーザ名とパスワードを入力します。

投稿画面.png

投稿後画面.png

見た目では分かりませんが、キャッシュデータがRedisに保存されています。興味のある方は、EC2インスタンスを立てるなどして、保存されたデータを見てみるとよいでしょう。

8. 作成したリソースを削除する

ひととおり遊んだら、リソースを下記の順で削除します。

  1. tdiary-service-stackを削除する
  2. pushしたイメージをECRから削除する
  3. tdiary-infrastructure-stackを削除する
  4. 必要に応じて、CloudWatchログを削除する

以上で、App Runnerのいくつかの機能が試せました。特に下記がポイントです。

  • ECRプライベートリポジトリからの自動デプロイ
  • VPCリソースへのアクセス

最後に

App Runnerに触ったのは初めてですが、VPCリソースへの接続を含め、あっさりと実現できました。自由度が低いぶん、学習コストが少ない印象です。

一方、環境変数にシークレットを指定できない点や、WAFを適用できない点など、物足りなさも感じました。とはいえロードマップには載っているので、今後の改善に期待します。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?