💡
[AWS]App Runnerを試す(PHP)
この記事の目的
- とりあえずApp Runnerを動かしてみたい
- どんなものか感じたい
ローカル環境
- MacBook Pro (Apple M1 Pro)
- Docker Desktop
デプロイ環境
- PHP8.1
- Dockerイメージを作成しECRへ
- ECRからイメージを取得してAppRunnerへデプロイ
App Runnerやってみる
ECRリポジトリ作成
- AWSマネジメントコンソールで
Elastic Container Registry
で検索しサービスページを開く
- サイドメニューから
Repositories
を選択 - 「リポジトリを作成」を押下
- 「リポジトリ名」に適当な名前を入力して画面下部の「リポジトリ作成」を押下
- リポジトリ作成完了
とりあえずのお試しなのでイメージスキャンや暗号化設定は飛ばしています
実運用では必要に応じて適宜設定してください
PHP環境作成
- ディレクトリ構成
php
|-- src
| |-- index.php
Dockerfile
Dockerイメージ作成
php/Dockerfile
FROM php:apache
COPY ./src/index.php /var/www/html/
index.php
php/src/index.php
<?php
phpinfo();
イメージBuild
docker build -t app-php:1.0.0 . --platform=linux/x86_64
- AppRunnerは
x86_64
のみに対応しているので--platform
オプションを指定する- ローカルPCが
Arm
でないならこの指定は不要
- ローカルPCが
イメージPUSH
- まずはECR認証トークン取得してDcoker認証
# ECRログイン
aws ecr get-login-password \
--region {AWS Region} \
| docker login --username AWS \
--password-stdin {AWS AccountId}.dkr.ecr.ap-northeast-1.amazonaws.com
# Login Succeeded と出ればOK
- ECRプッシュ用にイメージにタグをつける
docker tag app-php:1.0.0 {AWS AccountId}.dkr.ecr.{AWS Region}.amazonaws.com/app-php:1.0.0
- ECRへプッシュ
docker push {AWS AccountId}.dkr.ecr.{AWS Region}.amazonaws.com/app-php:1.0.0
- ECRリポジトリにイメージプッシュ確認できたらOK
AppRunner作成 & デプロイ
-
AWSマネジメントコンソールで
App Runnder
で検索しサービスページを開く -
「App Runnerサービスを作成」を押下
-
「コンテナイメージのURI」からPUSHしたイメージおよびタグを選択する
-
「自動デプロイ」を選択し初めてであれば「新しいサービスロールの作成」にチェックを入れる
- 既にロール作成済みであればそちらを使用する
- 既にロール作成済みであればそちらを使用する
-
「次へ」
-
「サービス名」に適当な名前を入れる
-
その他の入力値については今回は全てデフォルト値とする
-
「次へ」
-
内容に問題がなければ画面下部のボタンを押下してサービス作成
-
作成完了まで待つ(5分くらいはかかるはず)
-
「ステータス」が
Running
になれば作成完了
動作確認
- 「デフォルトドメイン」に提示されているURLにアクセスすると画面確認できる
自動デプロイ
- せっかくなので自動デプロイも確認しておく
- PHPプロジェクトに何かしら修正をする
- Docker再ビルド
- ビルドしたイメージを同じタグで再PUSH
- タグが異なると自動デプロイされません
- PUSH後少しするとデプロイが開始される
- デプロイ履歴はコンソール画面の「アクティビティ」タブで確認できる
ハマった
ビルド環境
- AppRunnerは
x86_64
のみに対応している様子(2023年3月現在) -
Arm
環境でビルドしたイメージは動作しない- AppRunnerのアプリケーションログに以下が出力される
exec /usr/local/bin/docker-php-entrypoint: exec format error
-
docker build
にて--platform=linux/x86_64
をオプションで追加する
料金
- 最後に料金について確認しておきます
課金対象
項目 | 料金 | 課金条件 | 備考 |
---|---|---|---|
プロビジョニングなコンテナインスタンス | 0.007 USD/GB 時 |
常時課金 | |
アクティブなコンテナインスタンス |
0.064 USD/vCPU 時 / 0.007 USD/GB 時
|
従量課金 | |
自動デプロイ | 1 USD/アプリケーション 月額 |
常時課金 | 1アプリケーションあたり月額1USD |
ビルド時間 | 0.005 USD/ビルド時間 (分) |
従量課金 |
分単位 課金 |
月額料金シミュレーション
- 1ヶ月は30日で計算
- 24時間アクセスがあると想定
- デプロイ時間と回数はざっくり
設定
- 自動デプロイ
- 仮想 CPU とメモリ
1 vCPU & 2 GB
- アクティブ時間
- 24時間/日
- 720時間/月
- 1回のデプロイ時間
- 5分
- デプロイ回数
- 10回
計算
- 自動デプロイ
- $1
- 仮想 CPU とメモリ
- プロビジョニング:
(0.007*2)*720
= $10.08 - アクティブ:
(0.007*2)*720
+(0.064*1)*720
= $56.16
- プロビジョニング:
- デプロイ
-
50分/月 * (0.005/60分)
= $0.004
-
結果
- 合計で約
$66
ほどかかる - EC2同スペックの
t2.small(0.0304 USD/時)
で月額$21.8
なのでお高め - ただし「ユーザーが責任を持つ範囲が激減」しているので金額での単純比較はできない
- この金額にプラスして「運用にかかるコスト」などを積んでいくとあっという間にひっくり返る可能性は大いにある
Discussion