きっかけ
この動画を見て、実際に動かしてみようと思いました。
筆者レベル
・実務でのサーバ構築経験なし
・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 パラメータストアがサポートされました | DevelopersIO
ネットワーキング
AppRunnerがプライベートなRDSに接続するにはVPCコネクタというものを作成し、AppRunnerとRDSが置かれている別のVPNを繋げる必要があります。
VPC・セキュリティグループの作成
・VPCを作成し、プライベートサブネットを作成します。
・AppRunner,RDSに設定する用のセキュリティグループをそれぞれ作成します。
・VPCコネクタ作成時にAppRunner用のセキュリティグループを指定します。
・RDS作成時にRDS用のセキュリティグループを指定します。
参考記事
App Runner新機能でVPCリソースを利用してみた | クラウド・AWSのIT技術者向けブログ SKYARCH BROADCASTING
確認および作成
設定内容を確認し、デプロイが開始されます。
設定ファイルについて
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のパブリックサブネット上に踏み台サーバを設置して、セキュリティグループでアクセス制限をする
こちらであればできる気がします。
他に方法があれば試してみたいです。
参考記事
docs.aws.amazon.com
AWS Lambda PHPのProduction利用を続ける僕がAWS App Runnerの可能性を探る - Speaker Deck
AWS App RunnerのPHPマネージドランタイムをApache + PHP-FPMの構成で動作させる|AWS|開発ブログ|株式会社Nextat(ネクスタット)