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の構成で動作させる