💡

[AWS]App Runnerを試す(PHP)

2023/03/07に公開

この記事の目的

  • とりあえずApp Runnerを動かしてみたい
  • どんなものか感じたい

ローカル環境

  • MacBook Pro (Apple M1 Pro)
  • Docker Desktop

デプロイ環境

  • PHP8.1
  • Dockerイメージを作成しECRへ
  • ECRからイメージを取得してAppRunnerへデプロイ

App Runnerやってみる

ECRリポジトリ作成

  1. AWSマネジメントコンソールで Elastic Container Registry で検索しサービスページを開く
  2. サイドメニューから Repositories を選択
  3. 「リポジトリを作成」を押下
  4. 「リポジトリ名」に適当な名前を入力して画面下部の「リポジトリ作成」を押下
  5. リポジトリ作成完了

とりあえずのお試しなのでイメージスキャンや暗号化設定は飛ばしています
実運用では必要に応じて適宜設定してください

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 でないならこの指定は不要

イメージ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作成 & デプロイ

  1. AWSマネジメントコンソールで App Runnder で検索しサービスページを開く

  2. 「App Runnerサービスを作成」を押下

  3. 「コンテナイメージのURI」からPUSHしたイメージおよびタグを選択する

  4. 「自動デプロイ」を選択し初めてであれば「新しいサービスロールの作成」にチェックを入れる

    • 既にロール作成済みであればそちらを使用する
  5. 「次へ」

  6. 「サービス名」に適当な名前を入れる

  7. その他の入力値については今回は全てデフォルト値とする

  8. 「次へ」

  9. 内容に問題がなければ画面下部のボタンを押下してサービス作成

  10. 作成完了まで待つ(5分くらいはかかるはず)

  11. 「ステータス」が 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 なのでお高め
  • ただし「ユーザーが責任を持つ範囲が激減」しているので金額での単純比較はできない
  • この金額にプラスして「運用にかかるコスト」などを積んでいくとあっという間にひっくり返る可能性は大いにある
株式会社THIRD エンジニアブログ

Discussion