AWSbeanstalkで環境構築
背景
これまでデプロイはHerokuでやってきて不便も今のところないが、
- S3とかを使うなら、AWSで全部まとめたい。
- なんとなくAWSでつくりました、って言いたい。
- 以前何度か挑戦して挫折したから、そろそろ・・・
といった理由で、今回アプリケーションのデモ環境を立ち上げるため、AWSでやってみようと思った。
前提
前提知識
- 本格的なエンジニアというよりは、小さい会社のDIYエンジニアといったところ。
- とりあえず、アプリケーションはいくつか作っていて、ある程度コードは書ける。
- あまりインフラ周りのことはよくわからない。
- これまではHerokuにまかせっきり。
開発言語
- laravel10
- React
- laravelのInertia.jsを使って実装
OS
- なんでもいい
Webサーバーソフト
- Herokuはapacheだし、ローカルの開発もapacheだから、apacheがいいけど・・・
- まぁ、正直どっちでも。
- ※のちに、nginxに変えます。
Database
- HerokuがPostgreSQLだったので、できればPostgreSQLがいい
- ※これも、のちに、いったんMySQLにします。
AWSの中でのサービス選定
- 以前、勉強がてらEC2などを使って環境をつくったが、そのときの手順がいろいろなサービスをみて、いろいろつくって、すごくめんどくさかった記憶があった。
- ElasticBeansTalkなら、AWSのリソースを勝手につくっていい感じにしてくれる、らしいということで、Herokuに近い感覚で使えるのでは?と思い、ElasticBeansTalkを使ってみる。
参考にした記事
やったこと
プロジェクトのZip化
gitで管理している & windowsなので、zipコードが使えないため、
git archive HEAD --output=【ファイル名】.zip
これでzipファイルができる。
zip化する際、
vendorとnode_modulesは重いのでいれない。
また、envも作り直すべき。
gitからzipをつくればそれらは、含まれないので、OK。
BeansTalkのページから作成開始
いくつか記事をみたが、画面が変わっていることが多くスクショをとるのも面倒なので、かいつまんで。
詳しくは、上記の参考記事を参照。
環境名やドメインを決める
よしなに。
プラットフォームを決める
よしなに。(今回はPHP)
アプリケーションコード
さきほどZip化したものをアップロード
ドキュメントのルート
「/public」を指定。
apacheに変えられたけど、デフォルトがnginxだったので、nginxにしてみた。
また、上記の参考記事によると、nginxの設定ファイルの編集も必要なようで、apacheで同じ設定をする方法がよくわからなかったのでnginxにとりあえずした。
laravelだとそうする必要があるらしい。
セキュリティの設定
ここは詰まった。
・サービスロール名
「新しいサービスロールを作成して使用」でよかったはず。
・EC2キーペア
別途作っておかないといけない。
このキーペアを使ってSSHでアクセスする。
EC2で、キーを作成する。
詳しくはこちらを参照。
・EC2 インスタンスプロファイル
ここがよくわからず。
選択肢として、
・AmazonSSMRoleForInstanceQuickSetUp
と
・AWSCloud9SSMInstanceProfile
しか出てこない。
これをテキトーに選んだところ、作成後に
「ヘルス」がunknownだがなんだかで、SendingNoDataとかになってた。
で、こちらの記事を参考にして、
AWSのIAMで、ロール作成から、
↑で、EC2になってないと、beanstalkの「EC2 インスタンスプロファイル」で選択肢として出ないっぽい。
この3つの許可ポリシーを付与した、ロールを作成。
・AWSElasticBeanstalkWebTier
・AWSElasticBeanstalkWorkerTier
・AWSElasticBeanstalkMulticontainerDocker
作成すると、
さっきの「EC2 インスタンスプロファイル」で作成したロールが選べるようになる。
データベースを設定。
最初、postgresqlを選び、その他はデフォルトのままにした。
そうしたら、
postgresqlで対応しているインスタンスクラスが決まっているからだったか、postgresqlのバージョンが対応していないからだったか、作成時にエラーが出てDB作成だけ失敗した。
postgresqlのために、調整してもいいが、いったん立ち上げたかったので、もうMySQLにしたらそれ以外デフォルトでできた。
※postgreSqlでもできるはず。
なお、作成失敗時に、beanstalk自体を作り直そうとして削除しようとしたが、失敗した。
そのときは、なんか削除しようとしている関連したDBがないぞとか言われた。
「失敗したからそのDBないんだよ、ボケ」と思ったが、どうやらAWSのCloudFormationとやらを開き、「削除中」とかで止まっているものを消すと、beanstalkが削除できた。
これで作成できるはず。
SSHで接続
beanstalkでの作成ができたら、SSHで接続する。
Teratermをいれていたので、それで。
参考
前述で作成したキーを使って、接続する。
諸々コマンド入力
envファイルを作成
sudo cp .env.example .env
キーを作成
sudo php artisan key:generate
作成したenvファイルを編集
sudo vim .env
修正箇所は基本先ほどの記事を参照した。
ここで、APP_ENVをlocalではなく、stagingに最初していたが、
自分の作成したアプリケーションの
AppServiceProviderで、
URL::forceScheme('https');
をlocalでない場合にはかけていて、のちにデプロイ後にURLを押しても真っ白になって、
net::ERR_CONNECTION_TIMED_OUT
になった。
たぶん、httpsを強制しているのに、AWS側はSSLができていなくてhttpで接続しようとしたからだったので、あとで、APP_ENVはいったんlocalにした。
RDSの設定
そのままSSHで、
mysql -h 「ホスト名」 -P 3306 -u 「DBのユーザー名」 -p
で、MySQLに接続。
ホスト名は、AWSでRDSを開き、「エンドポイント」というところを参照。
※これは上述のenvの編集時にもDB_HOSTとして設定しているはず。
で、
CREATE DATABASE `data-base`
で、DBを作成。
※ハイフンをいれるときは、``で囲む必要があるらしい。
exitして、
php artisan migrate
でDBの準備OK。
適宜Seederも。
Nginx設定ファイルの編集
sudo vim /etc/nginx/conf.d/elasticbeanstalk/php.conf
で、
location / {
try_files $uri $uri/ /index.php?$query_string;
gzip_static on;
}
これを加筆。よくわからんが・・・。
sudo nginx -s reload
node_modulesをインストール
まず、nodeがないので、nodeから。
公式のこれ
をみて、nodeをいれる。
これを無視してLTSにしたら、なんかnodeが見つからなくなったので、ちゃんと従うこと。
で、おなじみの
npm install
このとき、権限がないとか言われる。
sudo chown -R ec2-user /var/app/current
これで、権限をつけたらいけた。ec2-userはデフォルトのままのときのユーザー名っぽい。
ちなみに、composer installは勝手にやっておいてくれる。
アクセス
beanstalkのページにあるURLにアクセスすると、
500になって、storageフォルダにアクセスできないとか、なんとか言われた。
chmod -R 775 storage bootstrap/cache
これで、アクセスできるようにする。
これでいったん完了。
持ち越し
https化できていない。
これをしようとすると、またAWSのACMやらRoute53やらをいじる必要がある・・・
結論
まだHerokuでいいや・・・。
Herokuの素敵さ
- Herokuならhttpsもやってくれる。
- nodeとかもビルドパックにいれられるから、いちいちインストールしなくていい。
- Herokuだけ触ってればいい。AWSはあっちこっちしないといけない。
- SSHでアクセスしなくてもHerokuのCLIでできる。
beanstalkって、そもそもHerokuと比較するものではないのでは・・・。
全然簡単じゃなかったんだが・・・。
Discussion