🚀

AWSbeanstalkで環境構築

2023/07/14に公開

背景

これまでデプロイは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