RDS/EC2/WAF/Cloud Watch/Route53/ALB/API Gateway/Lamda サーバー構築手順書

<h2 style="margin-bottom: 0px;">
この記事を書こうと思った目的</h2>
 <ul>
  <li>AWSの機能を、ひと通り触ってみたかったから</li>
  <li>AWSがどんなものなのか、触ってAWSをわかりたかった</li>
  <li>暇だったから（実はこれが主な理由 ⇒ 不純な動機w）</li>
</ul>

<h2 style="margin-bottom: 0px;">
AWSを触った感想</h2>
 <ul>
  <li>個人だと、AWSを使う必要性はほとんどない</li>
  <li>AWSは便利だけど、ずっと使い続けてたらかなりコストが<br>
かかる（サービスを３つ常時起動で、毎月１万とんでいった）</li>
  <li>楽しかった</li>
</ul>


<h2 style="margin-bottom: 0px;">
システム構成</h2>

![インスタンス図-3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/f86476cf-f8f1-28d4-b0a8-38b8cb716240.jpeg)





<h2 style="margin-bottom: 0px;">作業手順</h2>
![説明図-3-2-2-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/33e60316-9809-e9ad-e8ef-ed8678e180ac.jpeg)





<h2 style="margin-bottom: 0px;">目次</h2>
<ul>
<li>1. RDSの作成</li>
<li>2. 本番サーバーの作成</li>
<li>3. 踏み台サーバーの作成</li>
<li>4. ALBの作成</li>
<li>5. CloudWatchの作成</li>
<li>6. WAFの作成</li>
<li>7. Slackチャンネルの作成</li>
<li>8. Lamdaの作成</li>
<li>9. API Gatewayの作成</li>
<li>10. Route53の作成</li>
</ul>




<h2 style="margin-bottom: margin-top: 0px;">
このシステムの構成要素</h2>
<table>
<tr><td>OS環境</td>  <td>Mac OS Catalina 10.15.15</td></tr>
<tr><td>Laravel バージョン</td><td>8</td></tr>
<tr><td>PHP バージョン</td><td>7.3</td></tr>
<tr><td>mysql バージョン</td><td>8.0</td></tr>
<tr><td>インストール先ディレクトリ</td>　<td>/usr/local/</td></tr>
<tr><td>ユーザー名</td>　<td>ec2-user</td></tr>
<tr><td>EC2インスタンスの種類</td> <td>Amazon Linux 2</td></tr>
<tr><td>EC2インスタンス名</td>     
<td>通信方式　SSH接続</td>
</table>


<h2 style="margin-bottom: 0px;">準備するもの</h2>
<ul>
<li>マイLaravelアプリ</li>
 <li> Githubアカウントのアカウント名・マイリポジトリ名</li>
<li>EC2インスタンス２つ</li>
<li>作成済みのVPC</li>
   <li>ムームードメイン・スタードメインなどで取得したドメイン名</li>
 </ul>

<h2 style="margin-bottom: margin-bottom: 0px;">1. RDSの作成</h2>

<h3>プライベートサブネットを作成する</h3>
<li>マネジメントコンソールでVPCと入力 → サブネット → サブネットの作成をクリック</li>

<li>下のように設定し、サブネットの作成をクリック</li>
![スクリーンショット 2021-06-20 23.50.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/2a9f7f8e-6c7d-15fd-74cb-796b16c7434e.png)

<h3>1.セキュリティグループを作成</h3>
<li>セキュリティグループを、MySQL/Auroraにする
</li>
![スクリーンショット 2021-06-21 0.00.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/266ecb29-ba89-db99-7a09-1e075bc6182b.png)

<br>
<h3>2.DBサブネットグループを作成</h3>
<li>マネジメントコンソールでRDSと検索し、RDSを開く → サブネットグループをクリック</li>
![スクリーンショット 2021-07-01 16.11.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/bb757d62-14a7-0338-1927-4efaf894af46.png)

<li>サブネットグループを作成</li>
![スクリーンショット 2021-07-01 16.22.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/8cbcc9b5-f5f4-71df-1c7a-d69281eb4543.png)

<li>アベイラビリティゾーン・サブネットは2つずつ選び、作成</li>
![スクリーンショット 2021-07-01 16.23.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/96d554ec-dc1b-f5c2-21bc-1ef839bc6411.png)


<h3>3.DBパラメータグループを作成</h3>
<li>RDSのパラメータグループ → パラメータグループの作成</li>
![スクリーンショット 2021-07-01 16.30.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/75781dfe-4c61-219d-12ee-902631d49cdc.png)


<h3>4.DBオプショングループを作成</h3>
<li>RDSのオプショングループ → グループを作成 </li>
![スクリーンショット 2021-07-01 16.39.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/294dbdad-8f86-28eb-590d-c9bb7a3086d9.png)

<h3>5.データベースを作成</h3>
<li>マネジメントコンソールのRDS → データベース
→ データベースの作成</li>
![スクリーンショット 2021-07-01 16.48.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/fdab831b-d9f7-97e9-4aa5-3c37ad71a7f3.png)
![スクリーンショット 2021-07-01 16.49.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/250fea5f-d5e7-ce41-28f4-e099d09f5474.png)
<br>
<li>設定したユーザー名/パスワード/DB名(DBインスタンス識別子)は、メモに書いておく</li>
![スクリーンショット 2021-07-01 17.47.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/45740ab5-2597-37a3-c864-9c87cf7e992d.png)



![スクリーンショット 2021-07-01 16.59.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/87f00efd-170b-e360-ff76-7dd787b7a545.png)

<li>ストレージはそのままにする</li>
![スクリーンショット 2021-07-01 17.03.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/da76e79f-2846-c9a0-9656-a397fcf50b24.png)

<br>
<li>vpcとサブネットグループの設定</li>
![スクリーンショット 2021-07-01 17.04.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/5c090e18-857b-781f-0b7d-6655bc79c380.png)

<li>アベイラビリティーゾーンは1aにする → 追加の接続設定をクリック</li>
![スクリーンショット 2021-07-01 17.33.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/3a599c17-9fcd-e898-9261-6a6ff2e833aa.png)

<li>作ったパラメータグループ・オプショングループを設定 →データベースの作成をクリック</li>
![スクリーンショット 2021-07-01 17.55.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/d54eaa5e-b59b-ecae-c7a7-2f77e14b0bb2.png)



<h2 style="margin-bottom: 0px;">2. 本番サーバーの作成</h2>
ElasticIPをEC2インスタンスにアタッチ
![スクリーンショット 2021-06-12 16.04.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/b6cd62d8-e1e9-cbb5-5680-be9c3670c7ea.png)
<br>
ターミナルを立ち上げ、キーのあるディレクトリに移動し、

```ruby:キーの権限を追加
chmod 400 キー名.pem
```


```ruby:EC2インスタンスをsshで起動
ssh -i ~/キーがあるディレクトリ名/キー名.pem ec2-user@ElasticIPのアドレス
```

```ruby:①apacheをインストール
sudo yum update
sudo yum install httpd
```

```ruby:apacheが自動起動するように設定
sudo systemctl enable httpd.service
```

<br>
途中でこのコマンドが出たら、yと入力
![スクリーンショット 2021-06-12 21.08.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/45c1987b-922a-93ee-4eed-e6ababf92a22.png)

```ruby:②php・phpのライブラリをインストールする
sudo amazon-linux-extras install -y php7.2
sudo yum install -y php php-mbstring
```

```ruby:mysql8.0をインストールする
sudo yum remove mariadb-libs
sudo yum localinstall https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
sudo yum install --enablerepo=mysql80-community mysql-community-server
sudo touch /var/log/mysqld.log
sudo systemctl start mysqld 
sudo systemctl enable mysqld
```


```ruby:ディレクトリ/usr/local/に権限を付与し、
composerをインストールする
cd /usr/local
sudo chmod 777 /usr/local
sudo curl -sS https://getcomposer.org/installer | php
```

```ruby:composerのpathを通す
sudo mv composer.phar /usr/local/bin/composer
```

```ruby:laravelをインストールし、Laravelアプリ作成
composer global require "laravel/installer:^4.0"
composer create-project laravel/laravel apple
```

```ruby:Nodeのインストール
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
nvm install node
```

```ruby:jestreamのインストール
composer require laravel/jetstream
php artisan jetstream:install livewire
npm install && npm run dev
php artisan serve
```

```ruby:重要ファイルに、権限を追加する
sudo chmod 777 public
sudo chmod 777 storage
sudo chmod 777 bootstrap
sudo chmod 777 .env
```

```ruby:envファイルを修正
vi .env
```
<br>
<li>データベース名・パスワード・ユーザー名・エンドポイント(DB_HOST)を入力する</li>
![スクリーンショット 2021-07-01 18.39.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/2bd9af46-df2e-d07b-0e60-3cd72a21e2df.png)


<li>エンドポイントの確認方法 : RDS → データベース →作ったデータベース名をクリックし、確認する</li>
![スクリーンショット 2021-07-01 18.19.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/227408d4-cace-0d93-5f4d-2652219ed315.png)


```ruby:httpd.confの修正
sudo vi /etc/httpd/conf/httpd.conf
```

httpd.confをこう修正する

```DocumentRoot “/usr/local/apple/resources/views/"
<Directory "/usr/local/apple/resources/views/">
AllowOverride All
/Directory>
```

```ruby:EC2を再起動する
sudo shutdown -r now
```

<h2 style="margin-bottom: margin-bottom: 0px;">3. 踏み台サーバーの設定</h2>
AMIを作成する
　 コピーしたいAMIのインスタンスを選択 → アクション → イメージとテンプレート　
         → イメージを作成を選択
![スクリーンショット 2021-06-13 19.34.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/37e39fd1-fe28-5efd-2575-9dc2f1d3fc16.png)

<li>AMIの名前を入力する</li>
![スクリーンショット 2021-07-07 23.56.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/2255b562-a442-d064-0e52-40734519ae3f.png)

<br>
<li>タグを追加 → AMIの名前を入力 → イメージを作成</li>
![スクリーンショット 2021-07-07 23.56.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/58a72f21-473e-dcc8-4758-20f70e151090.png)



AMIの画面で、起動をクリックし、EC2インスタンスを作成する
![スクリーンショット 2021-06-13 19.41.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/ca470fd7-a3fd-43ab-851e-873dfe5da7c8.png)

<li>Elastic IP を踏み台EC2にアタッチ</li>

<h2 style="margin-bottom: 0px;">4. ALBの作成</h2>

<li>マネジメントコンソールに　ロードバランサーと入力 → ロードバランサー → ロードバランサーの作成をクリック</li>
![スクリーンショット 2021-06-19 22.15.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/710d2467-1b18-df35-7b94-ca128a12f8e9.png)

<li>Application Load Balancerの作成をクリック</li>
![スクリーンショット 2021-06-19 22.19.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/7e3e8ba4-ecf6-3a08-e138-228404a7ab58.png)

<br>
<li>アベイラビリティーゾーン二つにチェックする</li>
![スクリーンショット 2021-06-19 22.21.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/c13f7cb7-ab6c-15d1-81bc-db072db64bf0.png)

<li>セキュリティグループを作成する</li>
![スクリーンショット 2021-06-13 20.52.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/317f65e2-6138-c5dc-91fd-db4dbb1347a6.png)

<li>ターゲットグループに名前を入力し、次の手順へ</li>
![スクリーンショット 2021-06-19 22.37.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/31ea25e1-0794-5fe6-fd68-43db9106ea69.png)

<li>設定したいインスタンスにチェックを入れ、登録済みに追加をクリック → 作成をクリック</li>
![スクリーンショット 2021-06-19 22.43.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/394c249a-66be-7919-4acf-1ac190465a48.png)



<h2 style="margin-bottom: 0px;">5. CloudWatchの作成</h2>

<h3>1. ロールの作成</h3>
<li>ロールの作成をクリックし、Systems Managerをクリック</li>
![スクリーンショット 2021-06-15 20.18.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/22edc217-1dea-fe20-6105-fa3860397bbf.png)
<br>

<li>SSMと入力し、AmazonEC２RoleforSSMを選ぶ</li>
![スクリーンショット 2021-06-15 20.16.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/576e96e9-6b38-4763-df1e-e914e092174b.png)

<li>ロールを作成したら、コンソール画面からec2-start-stopRoleを選び、信頼関係 →信頼関係の編集をクリック</li>
![スクリーンショット 2021-06-15 20.21.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/b01f88a9-cca2-cf6b-0d02-46364628e0c1.png)

<li>Serviceのところを、こう修正する</li>
![スクリーンショット 2021-06-15 20.23.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/9c8954aa-6a21-5864-8234-e509271cd410.png)



<h3>2. 自動終了の設定をする</h3>

イベントのルールを選択
![スクリーンショット 2021-06-15 18.27.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/9f77d72c-ed3e-3906-bc68-9caefb916467.png)

ルールの作成を選択
![スクリーンショット 2021-06-15 18.35.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/262bc68a-96ea-c0de-40be-49dd773bcf14.png)

<li>スケジュールを選び、Cron式に終了したい時間をUTCの時間で入力する</li>
![スクリーンショット 2021-06-15 18.51.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/9d1eba53-4c52-adb2-e643-bc959a9721aa.png)

・UTCの時間で参考にしたURL
https://blog.mukairiku.net/2013/07/協定世界時utcと日本標準時jstの対応表.html

<li>ターゲットの追加をクリック</li>
![スクリーンショット 2021-06-15 18.53.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/15545247-3d03-1607-5e37-24da1185e641.png)

<li>ドロップダウンリストから、SSM Automationを選ぶ
</li>
![スクリーンショット 2021-06-15 18.57.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/6734d9bf-d203-a5b3-426b-0fd88632111d.png)

<li>ドロップダウンリストの下の、ドキュメントに、AWS-StopEC2Instanceと入力し、AWS-StopEC2Instanceをクリック</li>
![スクリーンショット 2021-06-15 19.00.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/ef4044e2-d998-ef9e-7311-bec2d00f87e4.png)

<li>設定する自分のインスタンスIDと、既存のロールを選択し、作ったロール『ec2-start-stop Role』を選ぶ</li>
![スクリーンショット 2021-06-15 19.17.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/eb0a9e75-0eb5-a171-9f42-dfe20f68dded.png)

<li>設定の詳細をクリック</li>
![スクリーンショット 2021-06-15 19.24.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/708957c0-b60c-bb33-e332-f04fe65a6d66.png)




<h3>自動起動の設定をする</h3>
<li>ドロップダウンリストの下の、ドキュメントに、AWS-StartEC2Instanceと入力し、AWS-StartEC2Instanceをクリック</li>
![スクリーンショット 2021-06-15 19.11.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/fd3b397d-4360-878d-bd06-d26db23304c2.png)


<h2 style="margin-bottom: 0px;">6. ALBを紐付けたWAFの作成</h2>
<li>マネジメントコンソールでWAFと入力し、WAF &Shieldをクリック</li>
![スクリーンショット 2021-06-18 16.34.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/9f7a3484-a6b2-c072-a9a6-746c04518311.png)

<li>左のメニューから、Web ACLsを選ぶ</li>
![スクリーンショット 2021-06-17 19.57.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/11a09c1d-1ef0-fd6c-2d1d-36c9f96277a3.png)

<li>Create Web ACLをクリック</li>
![スクリーンショット 2021-06-18 16.31.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/00515cc5-5875-a315-33d7-a2d2068385fd.png)

<br>
<li>名前を入力し、Regional resourcesを選び、Nextをクリック</li>
![スクリーンショット 2021-06-18 16.43.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/85e3b681-a4bc-4226-87e0-925a9eaadcf6.png)

<br>
<li>Nextをクリック</li>
![スクリーンショット 2021-06-18 16.46.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/c04f2cea-bfd4-c707-5330-7a6f3091b8d5.png)


<li>Nextをクリック</li>
![スクリーンショット 2021-06-18 16.48.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/d4147d78-a593-5234-a49b-20736f791c39.png)


<li>Enable sampled requestsを選び、Nextをクリック</li>![スクリーンショット 2021-06-18 16.48.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/9e2520a0-9800-d43c-1db2-11bbae8c0150.png)

<li>作ったWebACLの、Rulesをクリック → Add rules → Add managed rule groupsをクリック</li>
![スクリーンショット 2021-06-18 21.12.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/c12e72f7-7c2d-2718-bb85-683241be71ce.png)





<li>AWS managed rule groupsをクリック</li>
![スクリーンショット 2021-06-18 21.14.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/a5b9038c-56c3-43f9-d31d-ef3b0dccc5f6.png)

<br>
<li>Add managed rule groupsで</li>
`Anonymous IP list
 Linux operating system
 PHP application
 SQL database`を
![スクリーンショット 2021-06-18 21.26.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/55bcdaa1-bfd9-937f-cfd0-574758667c6d.png)
<li>にする</li>

<br>
<li>add rules → Saveをクリック</li>
![スクリーンショット 2021-06-18 21.54.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/fe3b5645-b7c2-e5cc-b6fd-7e202024b3ea.png)



<br>

<h2 style="margin-top: 0px;">7. Slack の作成</h2>
<li>こちらのリンクをクリック</li>
https://slack.com/intl/ja-jp/help/articles/206845317-Slack-ワークスペースを作成する
<br>
<li>ワークスペースを作成するをクリック → サイトに書いてある作業をする</li>
![スクリーンショット 2021-07-11 17.43.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/ac8c3d69-daf6-4f14-e588-bc8862e451df.png)


<h2 style="margin-top: 0px;">8. Lamdaの作成</h2>
<h3>1. Lamdaのポリシーを作成</h3>
<li>マネジメントコンソールでIAM → ポリシー → ポリシーを作成 → サービスの選択をクリック → EC2を選ぶ</li>
![スクリーンショット 2021-07-11 17.58.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/28b1f2af-8c45-7fae-0d2e-b74685fb5f83.png)

<li>書き込みにチェック</li>
![スクリーンショット 2021-07-11 18.06.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/087e9a65-928f-92aa-ef90-783e0eed654f.png)

<li>294が選択されましたをクリック</li>
![スクリーンショット 2021-07-11 18.07.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/96084b1e-2630-5585-a8c5-4d0e87974157.png)

<li>書き込みの、この３つだけにチェックする</li>
![スクリーンショット 2021-07-11 18.11.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/6fea1c67-9b17-0232-8490-ccbb4b6b55ee.png)

<li>赤字の部分をクリック</li>
![スクリーンショット 2021-07-11 18.14.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/ccd243fa-954a-289d-4eef-c108025ded63.png)

<li>すべてのリソースを選ぶ</li>
![スクリーンショット 2021-07-11 18.17.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/995adabd-f4d0-87a8-4706-e3af8a799ed7.png)

<li>さらにアクセス許可を追加する → サービスの選択 → Cloud WatchLogs → 書き込みにチェック</li>
![スクリーンショット 2021-07-11 18.20.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/f45b78a5-2b52-e4e6-ca3e-84ebb04100a1.png)

<li>赤字の部分をクリック → すべてのリソースを選択を選ぶ → 次のステップへをクリック</li>

<li>タグを追加 → 名前を入力する</li>
![スクリーンショット 2021-07-11 18.25.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/207995b8-56cc-ac0c-17ac-c5fa67767f2c.png)

<li>ポリシーの名前を入力 → ポリシーの作成をクリック</li>
![スクリーンショット 2021-07-11 18.28.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/ebe8cebc-1eaf-618a-0027-411ce3518a0f.png)

<h3>Lamdaのロールを作成</h3>
<li>マネジメントコンソールでIAM → ロール → ロールの作成 → Lamda</li>
![スクリーンショット 2021-07-11 17.51.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/80831b30-7621-004e-0759-1e062253c8be.png)

<li>先ほど作ったポリシー名を入力し、チェックする → 次のステップ</li>
![スクリーンショット 2021-07-11 18.33.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/2f810866-9580-1628-589e-18ac2088998c.png)

<li>名前を入力し、ロールの作成をクリック</li>
![スクリーンショット 2021-07-11 18.36.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/a2000b6c-9ec5-2ce3-ed1e-6cdea9c08601.png)

<h3>Lamda関数を作成</h3>
<li>AWSマネジメントコンソールでLamdaと入力 → 関数の作成をクリック</li>
<br>

<li>ランタイムはnode.jsを選び、デフォルトの実行ロールの変更をクリック → 既存のロールを使用する → 作ったロールを選ぶ → 関数の作成</li>
![スクリーンショット 2021-07-11 10.59.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/7db60ed1-2bc7-603e-75ae-2e6aaa09af3d.png)

<li>index.jsをクリックし、コードにこれを入力する</li>
<details>

```
'use strict';

const AWS = require('aws-sdk');

// 操作したいEC2インスタンスIDを入力する。※各自が入力する
const instance_list = ["i-xxxxxxxxxxxxxxxxx", "i-xxxxxxxxxxxxxxxxx"]

// EC2 インスタンスを起動する
function startEC2Instance(region, instanceId) {
    const ec2 = new AWS.EC2({ region: region });
    const params = {
        InstanceIds: instance_list,
        DryRun: false,
    };
    return new Promise((resolve, reject) => {
        ec2.startInstances(params, (err, data) => {
            if (err) reject(err);
            else     resolve(data);
        }); 
    });
}

// EC2 インスタンスを停止する
function stopEC2Instance(region, instanceId) {
    const ec2 = new AWS.EC2({ region: region });
    const params = {
        InstanceIds: instance_list,
        DryRun: false,
    };
    return new Promise((resolve, reject) => {
        ec2.stopInstances(params, (err, data) => {
            if (err) reject(err);
            else     resolve(data);
        }); 
    });
}

// EC2 インスタンスのステータスを確認する
function describeStatusEC2Instance(region, instanceId) {
    const ec2 = new AWS.EC2({ region: region });
    const params = {
        InstanceIds: instance_list,
        DryRun: false,
    };
    return new Promise((resolve, reject) => {
        ec2.describeInstanceStatus(params, (err, data) => {
            if (err) reject(err);
            else     resolve(data);
        }); 
    });
}

// 関数指定してインスタンスを制御します。
function executeControl(ec2Function) {
    const result = { EC2: null};
    const a = ec2Function(process.env.EC2_REGION, process.env.EC2_INSTANCE_ID)
        .then(data => {
            result.EC2 = { result: 'OK', data: data };
        }).catch(err => {
            result.EC2 = { result: 'NG', data: err };
        });
    const b = null
    return Promise.all([a, b]).then(() => result );
}

function getSuccessfulResponse(message, result) {
    return {
        "response_type": "in_channel",
        "attachments": [
            {
                "color": "#32cd32",
                "title": 'Success',
                "text": message,
            },
            {
                "title": 'Result',
                "text": '```' + JSON.stringify(result, null, 2) + '```',
            },
        ],
    };
}

function getErrorResponse(message) {
    return {
        "response_type": "ephemeral",
        "attachments": [
            {
                "color": "#ff0000",
                "title": 'Error',
                "text": message,
            },
        ],
    };
}

exports.handler = (event, context, callback) => {
    if (!event.token || event.token !== process.env.SLASH_COMMAND_TOKEN)
        callback(null, getErrorResponse('Invalid token'));
    if (!event.text)
        callback(null, getErrorResponse('Parameter missing'));
    if (event.text.match(/start/)) {
        executeControl(startEC2Instance)
        .then(result => { callback(null, getSuccessfulResponse('Starting...', result)); });
    } else if (event.text.match(/stop/)) {
        executeControl(stopEC2Instance)
        .then(result => { callback(null, getSuccessfulResponse('Stopping...', result)); });
    } else if (event.text.match(/status/)) {
        executeControl(describeStatusEC2Instance)
        .then(result => { callback(null, getSuccessfulResponse('Checking statuses...', result)); });
    } else {
        callback(null, getErrorResponse('Unknown parameters'));
    }
};
```

</details>

<li>作成したLamda関数の設定をクリック → 環境変数 → 編集</li>
![スクリーンショット 2021-07-11 11.38.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/17d03ce2-1e9f-1d41-81f1-0918c8f10216.png)

<li>これが次の画面</li>
![スクリーンショット 2021-07-11 11.38.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/349737e6-240f-4cfa-87bd-c529f0532099.png)

<li>このデータを入力</li>
<table>
<tr><td>キー</td>  <td>値</td></tr>
<tr><td>EC2_REGION</td><td>ap-northeast-1</td></tr>
<tr><td>SLASH_COMMAND_TOKEN</td><td>hogehoge</td></tr>
</table>


<h2 style="margin-top: 0px;">9. API Gatewayの作成</h2>
<li>マネジメントコンソールでAPI Gateway → APIを作成でこう選択する → APIの作成</li>
![スクリーンショット 2021-07-13 19.37.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/dc799779-89d2-121c-2e5e-e59357150398.png)

<li>メソッドの作成</li>
![スクリーンショット 2021-07-11 11.43.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/59f404b3-88f1-1bc8-551e-2ef9f2a9dafb.png)

<li>GETを選ぶ</li>
![スクリーンショット 2021-07-11 11.44.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/718f91f7-c195-2938-8023-cc16c159ee9e.png)

<li>関数名・リージョンを入力 → 保存</li>
![スクリーンショット 2021-07-11 11.45.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/70c0a2b7-4f95-666d-6e09-2105d428d5bf.png)

<li>メソッドリクエストをクリック</li>
![スクリーンショット 2021-07-11 11.51.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/b2b60390-3fc2-d4f5-ebc6-7147cdb0ef09.png)

<li>リクエストの検証をクリック → クエリ文字列パラメータおよびヘッダーの検証を選択 → URL クエリ文字列パラメータのタブをクリック</li>
![スクリーンショット 2021-07-11 11.52.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/d43fe938-62c6-576b-b7f3-3b68ae451e06.png)

<li>以下のデータを入力</li>
<table>
<tr><td>text</td></tr>
<tr><td>token</td></tr>
</table>

<li>入力したデータを選択する</li>
![スクリーンショット 2021-07-11 11.53.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/e4a6a3e1-b983-94fc-acca-46c6d263bd46.png)

<li>前の画面に戻り、結合リクエストをクリック</li>
![スクリーンショット 2021-07-11 11.57.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/b001a3cc-a9c6-90df-d89d-3eda5d83db9c.png)

<li>一番したの、マッピングテンプレートの画面をクリックし、このデータを入力</li>

```
{
   "token": "$input.params('token')",
   "text": "$input.params('text')"
}
```

<li>APIのデプロイをクリック</li>
![スクリーンショット 2021-07-11 12.01.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/f197f1cc-21be-5549-10c8-076e78560a29.png)

<li>ステージ名をdevと入力し、デプロイクリック</li>
![スクリーンショット 2021-07-11 12.01.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/fa5313af-decb-8783-e14d-b8c9d7c92197.png)

<li>エンドポイントのURLが画面に表示されるので、メモする</li>
![スクリーンショット 2021-07-11 12.02.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/ee63f447-d3ca-d18f-0237-28efcf3c7f4d.png)

<li>Slackの作成したチャンネルを開き、app → アプリの追加をクリック</li>
![スクリーンショット 2021-07-13 20.14.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/6bc17935-b712-8158-b03d-cdc11d84e1ad.png)

<br>
<li>Slash Commandと入力し、Slash Commandを選んで追加をクリック</li>
![スクリーンショット 2021-07-11 12.04.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/e60c8567-4239-9065-33da-6183d876a98f.png)

<br>
<li>ec2-devと入力 → スラックコマンドインテグレーションを追加するをクリック</li>
![スクリーンショット 2021-07-11 12.06.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/95d2bb3b-7aa3-8f5c-c9e2-e342715de600.png)

<br>
<li>URLに、メモしていたAPI GatewayのURLを入力 ＋ トークンをメモする → インテグレーションを保存するをクリック</li>
![スクリーンショット 2021-07-11 12.07.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/85ef4fce-2efd-41f8-802e-e68639bcc0c1.png)

<li>Lamda関数の環境変数を、Slackで取得したトークンに修正する</li>

<br>
<li>Lamda関数 → 新しいバージョンの発行をクリック</li>
![スクリーンショット 2021-07-11 12.11.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/3414c1dd-6a1e-8e94-652f-bc23add60a63.png)

<li>自分の好きな名前を入力</li>
![スクリーンショット 2021-07-11 12.12.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/299173e0-d116-8f34-6a21-302b4a4f7697.png)

<li>Slackチャンネルで /ec2-dev startと入力 → 成功すればこう表示される</li>
![スクリーンショット 2021-07-13 20.33.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/21dc00f3-11d8-695d-7edd-0c93fa7a3a6c.png)

<li>停止は、/ec2-dev stop</li>













<h2 style="margin-top: 0px;">10. Route53の作成</h2>
<li>マネジメントコンソールで、Route53と検索し、ホストゾーンをクリック</li>

<li>ホストゾーンの作成をクリック</li>
![スクリーンショット 2021-06-16 22.31.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/52b9fb10-ccb3-a055-8af7-1eeae87579eb.png)

<li>パブリックホストゾーンを選び、ドメイン名に作ったドメインを入力し、ホストゾーンの作成をクリック</li>
![スクリーンショット 2021-06-16 22.33.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/d4cef956-ed29-49d4-4e80-9edd5c16c18c.png)


<li>ホストゾーンにレコードを追加する</li>
マネジメントコンソール → Route53 → ホストゾーン →設定したホストゾーンをクリック
![スクリーンショット 2021-06-16 22.43.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/6ca52afb-dad0-1e88-1cd5-e3f8945c4652.png)

<li>レコードを作成をクリック</li>
![スクリーンショット 2021-06-16 22.48.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/f0f04fdf-11a0-b341-c8d0-497ea102eef6.png)

<li>infoに、本番サーバーにアタッチしたインスタンスのElasticIPを入力 → 『レコードを作成』をクリック</li>
![スクリーンショット 2021-06-16 22.56.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/e5a87298-3ab6-2a15-81a2-481221d8333d.png)


<li>ドメインを契約しているネームサーバーに、Route53のネームサーバーを登録する</li>
マネジメントコンソール → Route53 → ホストゾーン →設定したホストゾーンをクリック → NSに書かれている URLを、ドメインのネームサーバーに登録する
![スクリーンショット 2021-06-16 23.00.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/78d5531c-626f-0437-1be8-ccdacd8ec0a6.png)



```ruby:DNSの設定確認をする
dig 自分が設定したドメイン名
```


　

<h2 style="margin-top: 0px;">参考資料</h2>
https://qiita.com/kyosuke5_20/items/b04813bb7ca26285d95e
https://poppotennis.com/posts/ec2-laravel
https://entsukablog.com/aws-laravel-deploy-github/
https://www.acrovision.jp/service/aws/?p=736
https://qiita.com/miriwo/items/eb09c065ee9bb7e8fe06
https://www.udemy.com/course/aws-and-infra/learn/
https://agohack.com/scheduled-start-and-stop-ec2-with-aws-cloudwatch-event/
https://avinton.com/academy/route53-dns-vhost/
https://noname.work/2254.html
https://qiita.com/mogurinchu/items/9093d9ca4a341d2d6c4b
https://fujison.xyz/entry/laravel-install-2
https://docs.aws.amazon.com/ja_jp/sdk-for-javascript/v2/developer-guide/setting-up-node-on-ec2-instance.html
https://qiita.com/daisu_yamazaki/items/607ea579a374c4187562
https://ishitonton.hatenablog.com/entry/2020/11/15/170125
https://qiita.com/daisu_yamazaki/items/b946594896179abcd203
https://teratail.com/questions/29094