【AWSやるぞ】何も知らないところからElastic Beanstalkを利用してPHP環境を構築編


いい加減AWSをやっていく記事   

今回は、サインアップ〜Elastic Beanstalkを使ってみよう、まで
思ったより書くことが多いので、記事を分割する


## 用意するものと前提知識

- クレジットカード（一年は無料の範囲で遊べる）
- 住所と電話番号
- AWS の簡単な知識（EC2とは、S3とは程度）
- レンタルサーバーでデプロイした経験と、たくさんの時間 :point_left:


## サインアップ

ここに大体書いてある

https://aws.amazon.com/jp/register-flow/

以下リンクより、「無料アカウントを作成」を選択する
https://aws.amazon.com/jp/free/

![スクリーンショット 2024-10-05 17.12.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/bebbc7af-f413-4670-544c-c55dbacfce9f.png)

- メールアドレスと、アカウント名を登録する
- メールアドレスに検証コードが届いているので、それを入力
- [step1] root ユーザーのパスワードを登録する
- [step2] AWSの利用用途と連絡先を選択する
  - AWSの無料枠は、会社ごとらしいので複垢に注意
  - 住所は英語で入力する
- [step3] クレジットカード情報を登録する
- [step4] 電話かSMSで本人確認をする
  - この時の番号は、step2の連絡先とは別のものが指定可能
- [step5] サポートプランを登録する
  - ベーシックでよくないか？

わーい簡単に作れた！  

![スクリーンショット 2024-10-05 17.31.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/9f31dc2c-d01c-ff0a-ab8f-dc4eb1f644f6.png)

AWS にはリージョンという考え方があり、それぞれに別の環境が用意できる  
もし「東京」や「大阪」になっていないなら右上の赤丸から変えよう

この記事では `ap-northeast-1` 東京を前提に進める


## 最低限の用語

- `EC2` 
  - サーバー
  - Linux とか Ubuntu とかだと思えばOK
- `RDS`
  - データベース mysql / PostgreSQL 色々対応している
  - AWS では、データベース用のサーバーを別に立てる
  - スナップショットが撮れたりとても便利 
- `S3`
  - ファイルサーバー
  - Google Drive みたいなもの
  - AWS にて、ファイルはここに保管する
- `CloudWatch`
  - ロガーサービス
  - AWS 全てのログはここに集約させるイメージ
- `IAM`
  - AWS を利用するアカウント
  - AWS は権限がとても細かく分かれている
  - 用途ごとに必要最低限の権限を付与して利用する
  - アプリケーションも、このIAMを利用してAWSの機能にアクセスする




## 環境の立ち上げ

`Amazon Elastic Beanstalk` というものを使用する  
これはサーバー環境とファイルを自動的に管理してくれるもの

https://ap-northeast-1.console.aws.amazon.com/elasticbeanstalk/home?region=ap-northeast-1#/welcome

![スクリーンショット 2024-10-07 19.24.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/ff0793f2-8a2c-eeb1-86a0-7491d49dbeec.png)  

公式チュートリアルもあるのだが、時代がだいぶ変わったみたいでそのままでは動かない...

https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/php-laravel-tutorial.html

備忘録をかねて手順を記載する  



### 1. EC2 ロールの作成

まず、EC2 を運用するための権限を作成する

![スクリーンショット 2024-10-08 18.42.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/2202c593-4a35-76d8-a66a-e1a5651eb374.png)

`IAM` というサービスから「ロール」のページを開き、「ロールを作成」を選択する

https://us-east-1.console.aws.amazon.com/iam/home?region=ap-northeast-1#/roles

![スクリーンショット 2024-10-08 18.43.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/93ada10f-9e5f-b080-b9f5-a951797a1397.png)

「EC2」のロールを作成する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/ac40ceb2-51fb-6161-6192-568738fbe976.png)

どの権限を付与するか聞かれるので、以下の三つの権限を検索して付与する
付与にはチェックボックスを選択する

- AWSElasticBeanstalkWebTier
- AWSElasticBeanstalkWorkerTier
- AWSElasticBeanstalkMulticontainerDocker

![スクリーンショット 2024-10-08 18.48.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/226893a2-7426-771f-d24f-c1d11148be2d.png)

権限の名前は `aws-ec2-service-role` にしてみる

![screencapture-us-east-1-console-aws-amazon-iam-home-2024-10-08-18_51_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/643d5aa0-1238-a6a2-9b7b-97336a2a7b8f.png)

できた！ :raised_hands:

![スクリーンショット 2024-10-08 18.56.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/cf0af441-e635-aa9c-5ced-54d6d0d4ab63.png)



### 2. EC2 のキーペアを作成する

SSH 用の鍵を先に生成する
本来 AWS は、インスタンスにアクセスしないように設定するのが正攻法らしいが、
今回は実験なので SSH アクセスできるようにしておく  

![スクリーンショット 2024-10-08 19.22.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/b142839c-f1d7-86d1-0454-5e019eaec678.png)

`EC2` から「キーペア」のページを開き、「キーペアを作成」を選択する

![スクリーンショット 2024-10-08 19.23.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/0c435d60-f74c-0f21-ae18-77e80c368cbd.png)

鍵の名前は `macbook-aws` にした　安直
タイプは安全性を考え `ED25519` が良いかと
鍵の形式は、windows なら `ppk` がおすすめだが、まぁどっちでも大丈夫だと思う

![screencapture-ap-northeast-1-console-aws-amazon-ec2-home-2024-10-08-19_26_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/8211a5b7-0aaa-15a2-7432-b8b9cc5a19d4.png)

鍵がダウンロードされた
`SSH` 接続する際に使用するので、大切に保管しておこう

![スクリーンショット 2024-10-08 19.29.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/ec4e7751-7bec-d75d-308e-d10cb4959ac8.png)





### 3. Elastic Beanstalk の環境を作成する

![スクリーンショット 2024-10-08 18.59.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/0fc0c8b9-640e-291e-ec12-156b859cfe53.png)

この機能を使って環境を作ると、サーバー自体の更新やデプロイが自動的にできる！
スケーリングも可能！
その代わり、あらかじめ用意されたプリセットしか使用できないみたい
（`CloudFormation` ってやつの簡単版）

EB は、一つのアプリケーションに複数の環境が設定できる 
（環境：本番、ステージング、テスト）


`EB` から「環境」のページを開き、「環境を作成」を選択する

https://ap-northeast-1.console.aws.amazon.com/elasticbeanstalk/home?region=ap-northeast-1#/environments

![スクリーンショット 2024-10-08 19.05.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/592cb866-6031-dcb8-19e0-38e6dabe0313.png)


#### [STEP1] 環境を設定

まずは環境設定をするみたい  
`laravel-aws` という名前で作ってみる

![screencapture-ap-northeast-1-console-aws-amazon-elasticbeanstalk-home-2024-10-08-19_08_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/e08ee549-9415-ae32-5fd3-d8dc481f0120.png)

`プラットフォーム` にて、使用したい環境を設定する
ここを `マネージドプラットフォーム` にする
例えば PHP だと以下の環境から選ぶ形となる
用意されているものしか使用できないが、逆に言うと用意されていたらそのまま利用できる

![スクリーンショット 2024-10-08 19.12.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/9fe560ff-7509-3f3d-97f4-e460db8452b6.png)

`アプリケーションコード` は、まずは `サンプルアプリケーション` とする


#### [STEP2] サービスアクセスの設定

AWSを操作する際のロールを設定する

![screencapture-ap-northeast-1-console-aws-amazon-elasticbeanstalk-home-2024-10-08-19_31_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/f72461f2-a737-bbd3-0e9a-a44e979e50ff.png)

`サービスロール` はまだ作成していないので、自動生成させる
次回からは生成したものを利用すれば良い

`EC2キーペア` には先ほど作成した `macbook-aws` を指定
ただこの鍵、ここで指定すると Port22 が `0.0.0.0/0` で解放されるらしいので要注意

`EC2インスタンスプロファイル` には先ほど作成した `aws-ec2-service-role` を指定


#### [STEP3] ネットワーキング、データベース、およびタグをセットアップ

サーバーの周辺環境を設定する

![screencapture-ap-northeast-1-console-aws-amazon-elasticbeanstalk-home-2024-10-08-19_42_32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/d63a1677-cc6e-a838-0a5e-d028156e4a83.png)

`VPC` は、環境をAWS内の仮想的なネットワークに閉じ込めることで、さらに安全に運用するものみたい

`データベース` は使うDBを設定する
今回は `postgres` を選択した
無料で使用可能なインスタンスは `db.t3.micro` `db.t4g.micro`、ストレージは `20GB` まで
`t3` はintel CPU、`t4g` は arm CPU らしい

そして `データベース削除ポリシー`
ここが重要みたいで、削除を選択すると、EB環境を消したら連動してデータも消えてしまう
スナップショットか保持、好きな方を選択しよう（なお消し忘れに注意）


#### [STEP4] インスタンスのトラフィックとスケーリングを設定

サーバー自体の設定をする

![screencapture-ap-northeast-1-console-aws-amazon-elasticbeanstalk-home-2024-10-08-19_51_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/e270238b-f6cf-2cd0-8753-bb4419bd56f0.png)

`ルートボリューム` は、サーバーのメインディスクの容量
AWS は基本的に EC2 には何も書き込まないように使うので、デフォルト `8GB` で十分かと
RDS や S3、CloudWatch を利用しよう
EC2 に書き込むデータは消えるものとして考える

`容量` がインスタンスやスケーリングの設定  
AWS の推奨設定が変わったのか「スポットインスタンス」にしないとサーバー起動しない
罠　多分この通知がそれを言ってる

![スクリーンショット 2024-10-08 19.56.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/40d93844-1126-300f-2159-a2423feb8a05.png)



### 5. 更新、モニタリング、ログ記録を設定

その他の設定

![screencapture-ap-northeast-1-console-aws-amazon-elasticbeanstalk-home-2024-10-08-19_58_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/a130f9f0-a26a-db86-9b25-7190b065171e.png)

マネージドとかローリングとかあるが、要するに自動デプロイの設定
OSのアプデとかも空き時間を使って勝手にやってくれるんだって
今は1インスタンスしかないので、特に意味のない設定

`プラットフォームソフトウェア` が http サーバーの設定
Apache と Nginx で選べるが、素直に `Nginx` にしておこう

あと `Eメール通知` だけちゃんと設定した


### [STEP5] レビュー

最終確認ページ  
まぁ間違ってても後で直せるからせーふ


### 起動中...

ほんとに時間がかかるのでお茶でも飲んで待つ :tea:
イベントタグでも眺めておこう  

![スクリーンショット 2024-10-08 20.02.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/97a33c36-9d42-1e20-bcf0-0ad1e00df98a.png)

起動に成功したら、「ドメイン」のURLをクリック！
もしうまくいかなかったら「イベント」タブにエラーが出ていないか確認すると良い

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/7007db9a-aa33-f82a-979d-4d0cb4654248.png)

やったーここまで長かった......

![スクリーンショット 2024-10-08 20.53.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/ee1ffaaa-b847-a1a3-dfe5-d95653f6b0e7.png)






## 参考サイト

参考サイト：

- [Laravel \+ AWS Elastic Beanstalkの環境構築](https://zenn.dev/tomipetit/articles/b3ceb96bf50e7c)
- [【初心者向け】AWSのキーペアタイプとプライベートキーファイル形式について \| DevelopersIO](https://dev.classmethod.jp/articles/saichan-20220107/)
- [flask \- The instance profile associated with the environment does not exist \- Stack Overflow](https://stackoverflow.com/questions/76626720/the-instance-profile-associated-with-the-environment-does-not-exist)
- [Elastic BeanstalkでWeb環境を作成し、アプリケーションをデプロイしてみる \| DevelopersIO](https://dev.classmethod.jp/articles/elastic-beanstalk-application-ks/)
- [Creating an Elastic Beanstalk without success \| AWS re:Post](https://repost.aws/questions/QUyYai-CJ4SiuDJpdV15SO2w/creating-an-elastic-beanstalk-without-success)