AppRunnerでLaravel+RDB

2023-07-24T12:14:12.622Z

きっかけ

この動画を見て、実際に動かしてみようと思いました。

AWSの「今」 - PHPのコードを素早く動かすためのサービスのご紹介

筆者レベル

・実務でのサーバ構築経験なし
・UdemyのAWS入門動画で手を動かしたことがある
(EC2,RDS,IAM,VPC,S3などを少しずつ)

今回使用するサービス

・App Runner
・RDS
・VPC
・IAM
・Secret Manager

AppRunnerでLaravelを動かし、RDSとの接続を確認するところまでを行いました

前提

・ソースコードはGithubのレポジトリを使用する
・構築設定はレポジトリに含めているapprunner.yamlを使用する

ソースおよびデプロイ

AWS App Runnerの画面に行き、サービスの作成を行います。
今回はGithubのレポジトリを使用するので、Githubと連携しレポジトリを選択できるようにしてください。
今回はデプロイ設定を手動にしておきます。

構築を設定

構築設定には設定ファイルを使用します。

サービスを設定

今回は動作確認を行うだけなので、任意のサービス名を指定後
「セキュリティ」と「ネットワーキング」のみ設定を変更します

セキュリティ

AppRunnerがRDSにアクセスするためにデータベースの認証情報が必要ですが、レポジトリに載せることはできないためSecretManagerの値を参照するようにします。
そのため、AppRunnerにSecretManagerの値を取得できるようなロールを与える必要があります。

IAMロールの作成

カスタム信頼ポリシーと許可を以下のように設定したロールを作成し、AppRunnerのインスタンスロールに指定します。

カスタム信頼ポリシー:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "tasks.apprunner.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

許可:

{
    "Statement": [
        {
            "Action": "secretsmanager:GetSecretValue",
            "Effect": "Allow",
            "Resource": [
                "arn:aws:secretsmanager:<region><account>:~~~",
                "arn:aws:secretsmanager:<region>:<account>:~~~"
            ]
        }
    ],
    "Version": "2012-10-17"
}

参考記事
AWS App Runner の環境変数ソースで Secrets Manager と SSM パラメータストアがサポートされました

ネットワーキング

AppRunnerがプライベートなRDSに接続するにはVPCコネクタというものを作成し、AppRunnerとRDSが置かれている別のVPNを繋げる必要があります。

VPC・セキュリティグループの作成

・VPCを作成し、プライベートサブネットを作成します。
・AppRunner,RDSに設定する用のセキュリティグループをそれぞれ作成します。
・VPCコネクタ作成時にAppRunner用のセキュリティグループを指定します。
・RDS作成時にRDS用のセキュリティグループを指定します。

参考記事
App Runner新機能でVPCリソースを利用してみた

確認および作成

設定内容を確認し、デプロイが開始されます。

設定ファイルについて

apprunner.yaml

version: 1.0 
runtime: php81
build:
  commands:
    pre-build:
      - scripts/pre-build.sh
    build:
      - scripts/build.sh
    post-build:
      - scripts/post-build.sh
run:
  command: scripts/entrypoint.sh
  network:
    port: 8080
    env: APP_PORT
  secrets:
    - name: DB_USERNAME
      value-from: "arn:aws:secretsmanager:<region>:<account>:~~~:username::"
    - name: DB_PASSWORD
      value-from: "arn:aws:secretsmanager:<region>:<account>:~~~:password::"
    - name: DB_DATABASE
      value-from: "arn:aws:secretsmanager:<region>:<account>:~~~:database::"
    - name: DB_HOST
      value-from: "arn:aws:secretsmanager:<region>:<account>:~~~:host::"

build.sh(ファイルのパーミッションは自己責任で確認してください)

#!/bin/bash

# Install Composer
EXPECTED_CHECKSUM="$(php -r 'copy("https://composer.github.io/installer.sig", "php://stdout");')"
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
ACTUAL_CHECKSUM="$(php -r "echo hash_file('sha384', 'composer-setup.php');")"

if [ "$EXPECTED_CHECKSUM" != "$ACTUAL_CHECKSUM" ]
then
    >&2 echo 'ERROR: Invalid installer checksum'
    rm composer-setup.php
    exit 1
fi

php composer-setup.php
rm composer-setup.php

# Install dependencies

composer --version
yum install php-mbstring php-xml wget tar -y
amazon-linux-extras install nginx1 -y
php composer.phar install
cp -p .env.example .env
php artisan key:generate

# ディレクトリの権限設定
chown -R :nginx ./storage
chown -R :nginx ./bootstrap/cache
chown -R :nginx ./public

chmod -R 777 ./storage

find ./bootstrap/cache -type d -exec chmod 775 {} \;
find ./bootstrap/cache -type f -exec chmod 664 {} \;

find ./bootstrap/cache -type d -exec chmod g+s {} \;

setfacl -R -d -m g::rwx ./bootstrap/cache

entrypoint.sh

#!/usr/bin/env bash

php artisan config:clear
php artisan migrate

set -o monitor

trap exit SIGCHLD

# Start nginx 
nginx -g 'daemon off;' &

# Start php-fpm
php-fpm -F &

wait

※pre-build.sh,post-build.shでは特に何も実行していません。
※php artisan migrateをbuild.shに書いていて、数時間つまずきました。

課題:RDSの確認方法

DBを接続することはできましたが、ローカルからDBのデータを確認したい場合にどのようにするべきか悩んでいます。

候補1/ AppRunner内にphpmyadminなどを設置してAWS WAFでアクセス制限をする

SecretManagerの認証情報をphpmyadminのconfigファイルに適用する方法がわからず断念しました。

候補2/ DB側VPCのパブリックサブネット上に踏み台サーバを設置して、セキュリティグループでアクセス制限をする

こちらであればできる気がします。

他に方法があれば試してみたいです。

参考記事

Using the PHP platform
AWS Lambda PHPのProduction利用を続ける僕がAWS App Runnerの可能性を探る
AWS App RunnerのPHPマネージドランタイムをApache + PHP-FPMの構成で動作させる