0.はじめに
新卒エンジニアが研修中に作成したアプリをデプロイした内容をまとめる為に投稿した記事です。
間違った内容が含まれているかもしれませんがご了承頂ければと思います。
また、その点をコメントでご指摘いただけると幸いです。
1.AWS構成図
2.AWS利用サービス一覧
- EC2
- VPC
- サブネット
- セキュリティグループ
- RDS
3.AWS利用サービス設定内容
1. EC2(パプリックIPアドレスありで、ElasticIPをアタッチする)
AMI:Amazon Linux 2 Kernel 5.10 AMI 2.0.20220426.0 x86_64 HVM gp2
インスタンスタイプ:t2.micro
ストレージ:1 ボリューム - 8 GiB
インスタンス数:1
2. VPC
IPv4 CIDRブロック:10.0.0.0/16
アベイラビリティーゾーン:2
3. パブリックサブネット
IPv4 CIDR:10.0.0.0/20
IPv4 CIDR:10.0.16.0/20
4. プライベートサブネット
IPv4 CIDR:10.0.128.0/20
IPv4 CIDR:10.0.144.0/20
5. セキュリティグループ
インスタンス(アウトバウンドルール):
タイプ | プロトコル | ポート範囲 | 送信先タイプ | 送信先 |
---|---|---|---|---|
全てのトラフィック | すべて | すべて | カスタム | 0.0.0.0/0 |
インスタンス(アウトバウンドルール):
タイプ | プロトコル | ポート範囲 | 送信先タイプ | 送信先 |
---|---|---|---|---|
SSH | TCP | 22 | 自分のIP | 自身のIP |
HTTP | TCP | 80 | カスタム | 0.0.0.0/0, ::/0 |
HTTP | TCP | 80 | カスタム | ::/0 |
HTTPS | TCP | 443 | カスタム | 0.0.0.0/0 |
HTTPS | TCP | 443 | カスタム | ::/0 |
RDS(アウトバウンドルール):
タイプ | プロトコル | ポート範囲 | 送信先タイプ | 送信先 |
---|---|---|---|---|
MYSQL/Aurora | TCP | 3306 | カスタム | インスタンスセキュリティーグループ |
6. RDS
エンジン:MySQL Community(5.7.38)
テンプレート:無料利用枠
インスタンス:db.t2.micro
ストレージタイプ:汎用SSD(gp2)
ストレージ割当:20
ネットワークタイプ:IPv4
4.本番環境設定
1. nginx
1-1. ssh接続
$ ssh -i -i ~/.ssh/(キーペア名.pem) ec2-user@(ElasticIP)
1-2. yum update
$ sudo su
$ yum update -y
1-3. nginxインストール
$ amazon-linux-extras install nginx1.12 -y
$ nginx -v
=> nginx version: nginx/1.12.2
1-4. nginx.conf
vi /etc/nginx/nginx.conf
==省略===
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /var/www/(リポジトリー名)/public/;
index index.php;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location /{
try_files $uri $uri/ /index.php?$query_string;
}
==省略===
2. PHP
2-1. PHPインストール
$ amazon-linux-extras install php7.4 -y
$ php -v
=> PHP 7.4.29 (cli) (built: May 12 2022 20:27:52) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
2-2. パッケージインストール
$ yum install php-cli php-pdo php-fpm php-json php-mysqlnd -y
$ yum install php-bcmath php-mbstring php-xml -y
$ yum install php-opcache -y
2-3. php-fpm起動
// php-fpmデーモンをsystemctl経由で起動
$ systemctl start php-fpm
2-4. Composerインストール
$ curl -sS https://getcomposer.org/installer | php
$ chown root:root composer.phar
$ mv composer.phar /usr/bin/composer
$ composer -v
=> Composer version 2.3.7
3. Git
3-1. Gitインストール
$ yum install git -y
$ git --version
=> git version 2.32.0
3-2. Git clone
$ mkdir /var/www
$ cd /var/www
$ git clone (リモートリポジトリURL)
$ chmod 777 /var/www/(リポジトリー名)
4. MySQL
参考記事:https://dev.mysql.com/doc/refman/5.6/ja/linux-installation-yum-repo.html
4-1. MariaDBのパッケージ削除
// mariadb確認
yum list installed | grep mariadb
// mariadb削除
yum remove mariadb-* -y
// mariadb確認
yum list installed | grep mariadb
=> エラー: 表示するパッケージはありません
4-2.MySQL Yum リポジトリの追加
yum install https://dev.mysql.com/get/mysql80-community-release-el7-5.noarch.rpm -y
// MySQL Yum リポジトリ確認
yum repolist enabled | grep "mysql.*-community.*"
=>
mysql-connectors-community/x86_64 MySQL Connectors Community 141+51
mysql-tools-community/x86_64 MySQL Tools Community 90
mysql80-community/x86_64 MySQL 8.0 Community Server 343
4-3. MySQLインストール
$ yum install mysql-community-server
$ service mysqld start
補足:「/var/log/mysqld.log」がない場合、「touch /var/log/mysqld.log」で作成する
4-4. mysqld自動起動
$ systemctl start mysqld.service
$ systemctl status mysqld.service
$ systemctl enable mysqld.service
4-5. PHP-FPM再起動
$ sudo systemctl restart php-fpm
4-6. MySQL接続確認
$ mysql -h (エンドポイント) -u (マスターユーザー名) -p
Enter password:(パスワード)
5. .env
5-1 .env作成
$ cd /var/www/リポジトリ名/
$ cp .env.example .env
$ vi .env
5-2 .env設定
+ APP_NAME=アプリ名
+ APP_ENV=production
APP_KEY=
+ APP_DEBUG=false
+ APP_URL=https://(EC2のパブリックIPアドレス)
LOG_CHANNEL=stack
DB_CONNECTION=mysql
+ DB_HOST=エンドポイント
DB_PORT=3306
+ DB_DATABASE=DB名
+ DB_USERNAME=マスターユーザー名
+ DB_PASSWORD=マスターパスワード
5-3 composer install
$ composer install
5-4 APP_KEY,permission
$ php artisan key:generat
$ chmod 755 .env
5-5 permission
$ chmod -R 777 storage
$ chmod -R 777 bootstrap/cache
5-6 シンボリックリンク設定
$ php artisan storage:link
5-7 nginx 再起動
systemctl restart nginx
5. 補足
エラーログ
2022/06/13 02:02:39 [error] 32466#0: *2 open() "/var/www/(リポジトリ名)/public/login" failed (2: No such file or directory)
解決方法
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /var/www/(リポジトリ名)/public/;
index index.php;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location /{
try_files $uri $uri/ /index.php?$query_string; // 追記
}
6. 参考にした記事
https://sg-report.com/laravel-docker-awsec2-web3/
https://qiita.com/kazumakishimoto/items/0859a5a365b226c1b43a#1-cloudformation
https://www.udemy.com/course/aws-associate/
https://qiita.com/shisama/items/5f4c4fa768642aad9e06
https://dev.mysql.com/doc/refman/5.6/ja/linux-installation-yum-repo.html
7. 用語一覧
インスタンス
インスタンスとは、事実、事例、例、場合などの意味を持つ英単語。ソフトウェアの分野では、あらかじめ定義されたコンピュータプログラムやデータ構造などを、メインメモリ上に展開して処理・実行できる状態にしたものを指す。この意味では「実体」と訳されることもある。
AMI
サービに使うOSのこと(windows OS,Mac OSなど、、)
AMI は、インスタンスの起動に必要なソフトウェア設定 (オペレーティングシステム、アプリケーションサーバー、アプリケーション) を含むテンプレート
インスタンスタイプ
CPUやメモリなどの組み合わせのこと
インスタンスを起動するときは、指定したインスタンスタイプによって、インスタンスに使用するホストコンピュータのハードウェアが決まります。インスタンスタイプごとに、コンピューティング、メモリ、およびストレージの機能が異なっており、これらの機能に基づいたインスタンスファミリーにグループ化されています。インスタンスタイプは、インスタンス上で実行するアプリケーションやソフトウェアの要件に基づいて選択します。
インスタンスファミリー
インスタンスタイプの用途別のカテゴリーのこと
「t2.micro」であれば「t」がインスタンスファミリー
インスタンスファミリーは5種類に分けることができ、
- 「t2」や「m5」は「汎用」
- 「c5」は「コンピューティング最適化」
- 「r5」は「メモリ最適化」
インスタンスサイズ
インスタンスタイプのスペックを示すもの
「t2.micro」であれば「micro」がインスタンスサイズ
種類:「nano」「micro」「small」「medium」「large」「xlarge」「2xlarge」
キーペア
公開鍵と秘密鍵のセット
SSH接続するときに必要なキー
IPアドレス
ネットワーク機器やWEBサイトなどの場所を特定する為にIPアドレスを利用する
重複が許されない一意の32ビットデータ
ネットワークインターフェースカードに割り当てられている
IPv4
IPv4のアドレス総数は2の32乗個、つまり42億9496万7296個
(最大約43億台のコンピュータがインターネットに直接接続できる)
IPv6
IPv6ではIPアドレスを128ビットのデータとして表現します。
そのためアドレス総数は3.4×10の38乗個、つまり約340澗(かん)個となります
CIDR
アドレスクラスの概念を気にしないことで、IPアドレスの割り当てや経路選択などの自由度を上げる仕組み
https://wa3.i-3-i.info/word11989.html
注意:既にAWS側で利用されており、設定できないアドレスもある
CIDR表記
https://wa3.i-3-i.info/word11990.html
VPC
VPCはAWSクラウドのネットワークからユーザー専用の領域を切り出すことができる仮想ネットワークのサービス
Amazon Virtual Private Cloud (Amazon VPC) を使用すると、定義した仮想ネットワーク内で AWS リソースを起動できます。仮想ネットワークは、お客様自身のデータセンターで運用されていた従来のネットワークによく似ていますが、 AWS のスケーラブルなインフラストラクチャを使用できるというメリットがあります。
サブネットクラス
ネットワーク内を複数のネットワークに分けたもの(カテゴリー)
メリット:ホストが特定しやすくなる
EIPとパブリックIPの違い
共通点:外部からアクセス可能なグローバルIP
インスタンスの再起動を行った際にパブリックIPは変更されるが、グローバルIPを変更されない
注意点:最初に「パブリックIP」の設定をしていない場合でグローバルIPを付与したい場合は、「EIP」による付与のみとなる
グローバルIPアドレス
世界で重複の無いIPアドレス
- インターネット上でやり取りに利用されるIpアドレス
- ICANNが管理する
プライベートIPアドレス
オフィス内野変えて否などの自分の場所だけで利用されるアドレス
- 利用範囲は限定的な絵エリアだけ
テナンシー
クラウドの機器を専有で使う
アベイラビリティーゾーン
アベイラビリティゾーンとは、米アマゾンドットコム(Amazon.com)社のAmazon Web Services(AWS)で、ある地域に立地するデータセンター群を一つの論理的な管理単位にまとめたもの。
https://e-words.jp/w/%E3%82%A2%E3%83%99%E3%82%A4%E3%83%A9%E3%83%93%E3%83%AA%E3%83%86%E3%82%A3%E3%82%BE%E3%83%BC%E3%83%B3.html
ルートテーブル
ルーティング
どのサブネットがどのインターネットゲートウェイに接続するかを指定する
インターネットゲートウェイ
インターネットに接続するための設定を行う
ネットワークACL
VPCやサブネットのアクセスを制御する
セキュリティーグループ
インスタンス間のアクセスを制御する
NAT
プライベートサブネットからインターネットに返信する場合、グローバルIPに変換する必要がある
プライベートアアドレスをグローバルアドレスに変換する仕組みがNAT
インターネットゲートウェイ
インターネットゲートウェイは、VPC とインターネットとの間の通信を可能にする VPC コンポーネント
amazon-linux-extras
amazon-linux-extras とは、Amazon Linux 2 インスタンスにある PHP、Python、Golang、MariaDB などのパッケージをより新しいバージョンで利用できるようマネジメント管理するコマンド。