概要
つい先日AWSから発表されたApp Runnerを試してみたのでメモ書き。
巷では「GCPのCloud Runに似た感じのもの」と言われているみたいですが、僕はそちらのサービスを使った事がないため、今回はなかなか新鮮でした。
実際の体験やドキュメント読んだ上でざっくり説明するなら、
アプリのソースコードを渡すだけで簡単にデプロイ可能かつ、面倒なインフラ設定(ネットワーク、オートスケーリング、ロードバランシング、SSL、CI/CDなど)は全てAWS側が勝手にやってくれるサービス
といった感じでしょうか。(違ったらごめんなさい...。イメージ的にはLambdaに似てるかも)
通常、何かアプリをデプロイしようと思ったら諸々の手順を踏む必要があったりしますが、App Runnerを使う場合、
- GitHubと連携してソースコードをインポート
- ちょっとした設定(CPU・メモリ、コンテナ起動後のコマンドなど)を記述
本当に簡単な操作だけで何とかなっちゃいます。
参照記事: What is AWS App Runner?
ごちゃごちゃ説明するよりも手を動かした方がわかりやすいと思うので、少しでも興味があればこの先を読んでみてください。
仕様
- Python3
- Flask
- AWS App Runner
- Docker
※ローカルでの環境構築はDockerで行います。
実装
アプリ作成編とデプロイ編の2本立てになります。
アプリ作成
まず最初に、Python3 × Flaskで簡単なアプリを作成しましょう。
各種ディレクトリ & ファイルを作成
$ mkdir python3-flask-docker-sample && cd python3-flask-docker-sample
$ touch Dockerfile
$ touch docker-compose.yml
$ touch requirements.txt
$ touch app.py
FROM python:3.9-alpine
ADD . /code
WORKDIR /code
RUN pip install --upgrade pip
RUN pip install -r requirements.txt
version: "3"
services:
flask:
container_name: flask
build: .
ports:
- "5000:5000"
volumes:
- .:/code
command: flask run --host 0.0.0.0 --port 5000
flask
from flask import Flask, jsonify
app = Flask(__name__)
@app.route("/")
def index():
return "Hello World!"
@app.route("/api/v1/hello")
def hello():
return jsonify({
"message": "Hello World!"
})
if __name__ == "__main__":
app.run()
動作確認
$ docker-compose up -d
localhost:5000 にアクセスして「Hello World!」が返ってくれば成功です。
もしくは
$ curl http://localhost:5000/api/v1/hello
{
"message": "Hello World!"
}
curlコマンドで確認してもOK。
一応、完成品のコードを載せておくので、もし万が一動かない場合などがあれば比較してどこか間違っていないか確認してください。
$ git add .
$ git commit -m 'Initial commit'
正常な動作確認ができたら、GitHubに適当なリポジトリを作ってプッシュしておいてください。(後ほどApp Runnerにデプロイする際、GitHubからソースコードを読み込む事になるのでこの作業は必須です。)
デプロイ
アプリの準備ができたのでいよいよデプロイです。と言っても、驚くほど簡単に出来てしまうので拍子抜けしてしまうかもしれません。
AWSコンソール画面から「App Runner」を探し出し、「サービスを作成」をクリック。
リポジトリタイプは「ソースコードリポジトリ」を選び、GitGubとの接続を行うために「新規追加」をクリック。
接続名を適当に入力し、「別のアプリケーションをインストールする」をクリック。
どのGitHubアカウントにコネクターをインストールするか選択。
「All repositories(全てのリポジトリ)」を対象にするか、「Onle select repositories(選択したリポジトリ一つだけ)」を対象にするか聞かれますが、今回は「All repositories」にします。(将来的に新しいリポジトリが追加された場合にそちらも対象となるので便利そう。)
接続に成功すると、先ほどは空欄だった「GitHubアプリケーション」の欄にGitHubアカウント名が追加されるので、このまま「次へ」をクリック。
- リポジトリ
- 事前にプッシュしておいたリポジトリ
- ブランチ
- master(人によっては「main」など)
- デプロイ設定
- お好み(「自動」にしておくと、今後masterブランチに変更があった場合は勝手にデプロイが行われるようになるので楽かも)
- 設定ファイル
- ここですべての設定を構成する
- Python3
- 構築コマンド
- pip install --upgrade pip && pip install -r requirements.txt
- 開始コマンド
- flask run --host 0.0.0.0 --port 5000
- ポート
- 5000
ちなみに、今回はコンソール画面から設定を行なっていますが、リポジトリ内に「apprunner.yaml」というファイルを配置しておくと、そちらから設定を読み込んでくれるみたいです。
たとえば、今回であれば以下のような感じになりますね。
version: 1.0
runtime: python3
build:
commands:
build:
- pip install --upgrade pip
- pip install -r requirements.txt
run:
command: flask run --host 0.0.0.0 --port 5000
network:
port: 5000
参照記事: Introducing AWS App Runner
- サービス名
- 任意
- その他
- 今回は全てデフォルトでOK
本格的な運用を行う際は色々とパラメータをいじくる必要がありそうですが、今回はただのサンプルなので基本はデフォルトで大丈夫です。もしこだわりなどがあればお好みで。
最後に諸々の確認画面が出てくるので、問題無さそうなら一番下にある「作成とデプロイ」をクリック。
するとこんな感じでデプロイが始まるので、完了するまで少し待ちましょう。大体5分前後で終わると思います。
無事成功したら、表示されているドメインにアクセスしてみます。
ちゃんとデプロイできてますね。
$ curl https://pj2qck2byp.ap-northeast-1.awsapprunner.com/api/v1/hello
{
"message": "Hello World!"
}
curlコマンドでの確認もバッチリです。
もし困ったことがあれば、CloudWatchのログに吐き出されているはずなので適宜デバッグしてください。
あとがき
いかがだったでしょうか。あまりにも簡単にデプロイできる事がお分かりいただけたと思います。
本来であれば、ちょっとしたアプリであっても「ネットワークを準備して〜、ロードバランサーを作って〜、オートスケーリングの設定をして〜、SSL証明書を発行して〜、CI/CD環境を構築して〜」」みたいな諸々の作業が必要になったりするものですが、App Runnerであればその辺を全く意識せずによしなにやってくれるぽいので、開発者としては非常に楽な思いができそうです。
まだまだ新しいサービスなので、僕もまだその全てを活かし切れてない感は否めませんが、今後ぼちぼち試してみたいなと。
なお、今現在はPython3とNode.jsにしか対応していなさそうな感じですが、ソースをGitHubリポジトリではなくECRを選択した場合は他の言語でもいけるぽいです。(SNSなどではPHPを使ったアプリをデプロイしている方をお見かけしました。)
多くの要望があれば対応言語も増えていくでしょうし、今後に期待。
自分も何か面白い事ができないか模索していきたいところです。