EC2を利用してRailsアプリをAWSにデプロイする①

# はじめに
今回はEC2を利用してRailsアプリをAWSにデプロイするということをやっていきます。
僕も本記事を書き起こすまではAWSやインフラという言葉に怯えながら学習をしていました・・・😅
また、今回書くにあたってさまざまな記事を拝見させていただきましたが、どれもAWSのバージョン違いにより操作がしにくかったりと難点がありました。
そこで自分が最新版のAWSを使った記事を書くことで、インフラ環境を構築するのに苦戦している初学者の方を助けられのではないかと考えました。

# AWSとは
**AWS**とは、Amazon Web Servicesの略で、Amazon.comが提供しているクラウドコンピューティングプラットフォームです。AWSは、企業や個人がインターネット経由でコンピューティングリソースやサービスを利用できるようにすることで、柔軟性、拡張性、信頼性を提供しています。
まあ要するに**自分のウェブサイトを公開したい場合、AWSのサービスを使えばウェブサーバーを簡単に立ち上げることができ、また大量のデータを保存したい場合は、AWSのストレージサービスを利用することができる**ってことですね。
詳しくは[公式](https://aws.amazon.com/jp/what-is-aws/)をご参照ください！

# 周辺環境の構築について
## VPC
それでは周辺環境を構築していきます。
まずは**VPC**についてです。VPCは、Virtual Private Cloudの略でAWSが提供する仮想ネットワーキング環境のことです。
これは**自分の土地のようなもの**でこの中にサーバーやデータベースなどを作成していきます。
[![Image from Gyazo](https://i.gyazo.com/1f83fbcbafd2ad2b1affd5946fd22858.png)](https://gyazo.com/1f83fbcbafd2ad2b1affd5946fd22858)

それでは作成していきます。
サービスのところからVPCを検索し選択します。
その後、VPCを作成というボタンが出てくるのでそこをクリックします。
[![Image from Gyazo](https://i.gyazo.com/b715c7bd031fe8f35de8afc0d52bcc94.png)](https://gyazo.com/b715c7bd031fe8f35de8afc0d52bcc94)
VPC作成をクリックすると以下のようなページに切り替わります。
今回は以下のように入力していきます。
[![Image from Gyazo](https://i.gyazo.com/2c40cfa63834aed1a475a6af203680b5.png)](https://gyazo.com/2c40cfa63834aed1a475a6af203680b5)

環境構築するにあたって見慣れない単語が出てくると思うのでそれについても解説していきます。
- **CIDR**（Classless Inter-Domain Routing）ブロックは、IPアドレスの範囲を表現するために使用される方法です。IPアドレスはネットワーク部とホスト部に分けられ、サブネットマスクはどの部分がネットワーク部であるかを示します。CIDRブロックは、IPアドレスの後ろにスラッシュ（/）と数字を付け加えることで表現されます。
    - 例えば、192.168.0.0/24は、IPアドレスが192.168.0.0で、ネットワーク部が24ビット（サブネットマスクが255.255.255.0）であることを示します。CIDRブロックを使用することで、より柔軟なIPアドレスの割り当てが可能になります。
    
- **Pv4**（Internet Protocol version 4）は、インターネット上でデータを転送するための通信プロトコルです。IPv4は現在でも最も広く使用されているIPバージョンであり、32ビットのアドレス空間を持ちます。
    - 例えば、192.168.0.1や10.0.0.0などの形式で表されます。 
    
- **Pv6**（Internet Protocol version 6）は、インターネット上でデータを転送するための次世代の通信プロトコルです。IPv6はIPv4の後継として開発され、より広範なアドレス空間や改善されたセキュリティ、拡張性、パフォーマンスなどの機能を提供しています。
    - 例えば、2001:0db8:85a3:0000:0000:8a2e:0370:7334といった形式で表されます。

- **テナンシー**とは、AWSリソースを利用する顧客やアカウントごとの分離や制御を指します。要するにVPC作成時にどのくらいハードウェアを占有するかということで、設定はデフォルトにしています。

## サブネット
次にサブネットを作成していきます。**サブネット**（Subnet）は、IPネットワークをより小さなセグメントに分割するための手法です。
要するに**ネットワークのこと**です。グループを外部通信用や内部通信用というふうに分けることができ、機能をそれぞれ整備しています。
[![Image from Gyazo](https://i.gyazo.com/52c2c901f9e3cb69e57a92b2cf327ecd.png)](https://gyazo.com/52c2c901f9e3cb69e57a92b2cf327ecd)

それでは作成していきます。
まずはサブネットのページで移動してください。
その後サブネットを作成をクリックします。
[![Image from Gyazo](https://i.gyazo.com/00bffc5ff79a9f0793c12be2f1bca365.png)](https://gyazo.com/00bffc5ff79a9f0793c12be2f1bca365)
そうしましたら、先ほど作成したVPCを選択してください。
[![Image from Gyazo](https://i.gyazo.com/198c83af869c59fd8e7b15d28ac02719.png)](https://gyazo.com/198c83af869c59fd8e7b15d28ac02719)

その後新しく詳細画面が表示されると思うので以下のように入力してください。
[![Image from Gyazo](https://i.gyazo.com/36fbb41a97f24375504c8781718f41b6.png)](https://gyazo.com/36fbb41a97f24375504c8781718f41b6)

[![Image from Gyazo](https://i.gyazo.com/1230c91db1c3ed82db81932060b42c4c.png)](https://gyazo.com/1230c91db1c3ed82db81932060b42c4c)

きちんと作成されるとサブネットの一覧画面で確認できます。
[![Image from Gyazo](https://i.gyazo.com/f59c6dfa66f37521be1dd35293ece5e2.png)](https://gyazo.com/f59c6dfa66f37521be1dd35293ece5e2)

ここで一度出てきた用語について解説していきます。
- **アベイラビリティゾーン**（Availability Zone）は、AWS（Amazon Web Services）における物理的なデータセンターの集合体を指します。AWSのインフラストラクチャは、複数の地理的に分散したアベイラビリティゾーンで構成されています。
    - 東京リージョンの場合、ap-northeast-1a、ap-northeast-1c、ap-northeast-1dという3つのアベイラビリティゾーンが選択可能です。
- **CIDRの設定値について**
    - test_1a: CIDRブロック 10.0.1.0/24 : 
このCIDRブロックは、10.0.1.0から10.0.1.255までの範囲のIPアドレスを表しています。サブネットマスクは24ビットであり、ネットワーク部は10.0.1.0であり、ホスト部は最後の8ビット（0〜255の範囲）です。
    - test_1c: CIDRブロック 10.0.2.0/24 :
このCIDRブロックは、10.0.2.0から10.0.2.255までの範囲のIPアドレスを表しています。サブネットマスクは24ビットであり、ネットワーク部は10.0.2.0であり、ホスト部は最後の8ビット（0〜255の範囲）です。

## インターネットゲートウェイ 
続いてインターネットゲートウェイを作成していきます。**インターネットゲートウェイ**（Internet Gateway）は、AWS（におけるネットワークサービスの一つです。インターネットゲートウェイは、VPC内のプライベートなリソースがインターネットと通信するための接続ポイントです。
要するに**窓口の役割**を果たしており、通信が外のパブリック空間へ出ていくためにはここを通過しないといけません。
[![Image from Gyazo](https://i.gyazo.com/4ea0f57ce21b854978dc6def5eb830da.png)](https://gyazo.com/4ea0f57ce21b854978dc6def5eb830da)

そしたらインターネットゲートウェイのページに移動して作成をクリックします。
[![Image from Gyazo](https://i.gyazo.com/9b4aa007a280bbc4af0d3902832a5976.png)](https://gyazo.com/9b4aa007a280bbc4af0d3902832a5976)

その後名前を設定していきます。
今回は以下の画像のようにします。
[![Image from Gyazo](https://i.gyazo.com/6814ef2588a60951f8d8f3fa0acc9e23.png)](https://gyazo.com/6814ef2588a60951f8d8f3fa0acc9e23)

無事作成されているか確認し、VPCとの紐付けを行なっていきます。
先ほど作成したVPCと紐付けを行い、ゲートウェイとアタッチさせましょう。
そしたらVPCにアタッチを選択します。
[![Image from Gyazo](https://i.gyazo.com/faa596d13ed8a5bc17de10af019dd4ca.png)](https://gyazo.com/faa596d13ed8a5bc17de10af019dd4ca)

その後に以下のようなページに移動します。
そしたら先ほど作成したVPCを選択し、アタッチをクリックします。
[![Image from Gyazo](https://i.gyazo.com/975e011a8f8ccd6efd080ddfbac8e298.png)](https://gyazo.com/975e011a8f8ccd6efd080ddfbac8e298)

紐付けが完了し無事にインターネットゲートウェイの作成も完了しました！
[![Image from Gyazo](https://i.gyazo.com/087babe29c783009952b29b1524433e4.png)](https://gyazo.com/087babe29c783009952b29b1524433e4)

## ルートテーブル
次にルートテーブルを作成していきます。
**ルートテーブル**（Route Table）は、ネットワーク上でデータパケットの転送を制御するために使用されるテーブルです。ルートテーブルはネットワークデバイス（ルーターやスイッチ）や仮想ネットワーキング環境（VPCやサブネット）に関連付けられており、送信元IPアドレスに基づいてデータパケットを正しい宛先に転送するためのルールを定義します。
要約すると**通信のルールブックでサブネット内の通信がどこに送られて欲しいかを設定するもの**です。

今回は、先ほど作成したインターネットゲートウェイを通るように設定したルートテーブルを作成し、それをサブネットと紐付けしていきたいと思います。
まずはルートテーブルの画面に移動します。
その後いつものように作成のところをクリックします。
[![Image from Gyazo](https://i.gyazo.com/7f51cd330409acc2226755670ac7c06e.png)](https://gyazo.com/7f51cd330409acc2226755670ac7c06e)
そしたらルートテーブルの名前を画像のように設定し、先ほど作成したVPCと紐付けしていき、作成をクリックします。
[![Image from Gyazo](https://i.gyazo.com/58c789d60c924abf562ddab5ca57b909.png)](https://gyazo.com/58c789d60c924abf562ddab5ca57b909)
ひとまずルートテーブルの作成は終わりましたね・・・
しかし、まだインターネットゲートウェイを通過するようには設定できていないので、このまま設定を進めていきます。
作成したルートテーブルの下にあるルートの編集ボタンをクリックします。
[![Image from Gyazo](https://i.gyazo.com/524316650dad450c1cc858588372e198.png)](https://gyazo.com/524316650dad450c1cc858588372e198)

そうすると以下のようなページに移動すると思います。
今回は先ほど作成したインターネットゲートウェイを通過して欲しいので以下のように設定します。
[![Image from Gyazo](https://i.gyazo.com/39922468e44e60ae41ce7c1736139dae.png)](https://gyazo.com/39922468e44e60ae41ce7c1736139dae)

次にサブネットと紐付けしていきます。
サブネットの関連付けに移動し、編集ボタンをクリックします。
[![Image from Gyazo](https://i.gyazo.com/ef0e9f8fef69d26908da0e6aa517e500.png)](https://gyazo.com/ef0e9f8fef69d26908da0e6aa517e500)

そうするとすでに作成したサブネットが2つ表示されると思うので、それらを選択し保存をクリックします。
[![Image from Gyazo](https://i.gyazo.com/fbccdd3a12d0a8e093c126dcb5347944.png)](https://gyazo.com/fbccdd3a12d0a8e093c126dcb5347944)

これでルートテーブルとサブネットの紐付けは完了です。
まだまだ続きますが、ひとまずはお疲れ様でした。笑

## セキュリティグループ 
**セキュリティグループ**（Security Group）は、AWSの仮想ネットワーキング環境（VPCやEC2インスタンスなど）において、ネットワークトラフィックの制御とセキュリティの設定を行うための仕組みです。セキュリティグループはファイアウォールの役割を果たし、インバウンド（入力）およびアウトバウンド（出力）トラフィックを制御するためのルールを定義します。
要するに**グループごとのルール設定のこと**です。
また、詳しい図の説明については[こちら](https://aws.amazon.com/jp/blogs/news/amazon-quicksight-private-vpc-access/)を参照してください。
[![Image from Gyazo](https://i.gyazo.com/e47fe31c7e741d5f4a04b6cb665fa650.png)](https://gyazo.com/e47fe31c7e741d5f4a04b6cb665fa650)

今回、作成するEC2サーバ-は一般のユーザーがインターネットで閲覧できる通信と、開発者がSSH接続でログインするという2つの通信を許可する必要があります。
また、RDSデータベースはEC2サーバーの通信許可が必要です。
以上の条件を踏まえて具体的な設定を進めていきましょう！

まずはセキュリティグループを選択し、作成ボタンをクリックします。
[![Image from Gyazo](https://i.gyazo.com/8bd2b86fbc496ef1fd32b1d1fe3eab64.png)](https://gyazo.com/8bd2b86fbc496ef1fd32b1d1fe3eab64)

次のページに移動したら、http用、production用、ssh用の3つのセキュリティグループを作成します。
[![Image from Gyazo](https://i.gyazo.com/4b298c0695453bb45bddb5d2efd9bb66.png)](https://gyazo.com/4b298c0695453bb45bddb5d2efd9bb66)


3つのセキュリティグループが作成されました。
[![Image from Gyazo](https://i.gyazo.com/2435c5a54f78546a06a449f73dae78c0.png)](https://gyazo.com/2435c5a54f78546a06a449f73dae78c0)

次にルールを設定していきます。
まずはhttp用のものから設定していきます。
画像の通り、インバウンドのルールを編集をクリックしてください。
[![Image from Gyazo](https://i.gyazo.com/3d257088e6ac3354bb596b2120941a57.png)](https://gyazo.com/3d257088e6ac3354bb596b2120941a57)

そしたら下記のような値を追加してください。
[![Image from Gyazo](https://i.gyazo.com/7272043e440b974f3c384462e3e842a1.png)](https://gyazo.com/7272043e440b974f3c384462e3e842a1)

同様にproduction、sshのセキュリティグループも設定していきます。
- production
[![Image from Gyazo](https://i.gyazo.com/25cc38ac741343ce4dcd36c8de801551.png)](https://gyazo.com/25cc38ac741343ce4dcd36c8de801551)

- ssh
[![Image from Gyazo](https://i.gyazo.com/3e7d8d50ab8a7d8af9cdf124f2b00ce3.png)](https://gyazo.com/3e7d8d50ab8a7d8af9cdf124f2b00ce3)

これでセキュリティグループの登録が完了しました！
次からインスナンスの作成に移っていきます。頑張りましょう🔥

また、セキュリティグループのルール設定にて出てきた用語について少し解説します。
- **タイプ**は通信受け入れの設定でこの方の通信が来たら受け入れるといったような設定かできる。

- **プロトコル**は、コンピュータや通信ネットワークなどのシステムでデータの交換や通信を行うための規約や手順のセットです。プロトコルは、データの送受信方法、メッセージのフォーマット、エラー処理、認証手順などの通信に関するルールや手順を定義します。
    - タイプhttp、httpsを選択すると、プロコトルは自動でTCPが選択される
    - TCPとは、相手に通信がしっかり届いていることを保証してくれる通信方式のこと
 
- **ポート番号**は、ネットワーク通信において特定のアプリケーションやサービスが識別されるために使用される番号です。ネットワーク上のデータパケットは、送信元と宛先のIPアドレスに加えて、ポート番号によって特定のプロセスやサービスにルーティングされます。簡単にいうと**マンションやアパートの部屋番号のようなもの**です。

- **ソース**とは、どんなIPアドレスであれば通信を許可するか指定するもの。ここでいう0.0.0.0/0はすべてのIPアドレスを指定しています。

# インスタンスの作成について
## RDS
**RDS**（Relational Database Service）は、AWSが提供する、クラウドベースのリレーショナルデータベースサービスです。
RDSは、データベースのセットアップ、管理、パッチ適用、バックアップ、リストアなどのタスクを自動化します。
[![Image from Gyazo](https://i.gyazo.com/10ed33e0118e10a384177e93872ff356.png)](https://gyazo.com/10ed33e0118e10a384177e93872ff356)
早速作成していきましょう！
それではRDSの作成画面に移動してください。
その後、データベースの作成を選択します。
[![Image from Gyazo](https://i.gyazo.com/e6892edf607f24ab5ba73e43d823a0d4.png)](https://gyazo.com/e6892edf607f24ab5ba73e43d823a0d4)

画面が移動したらエンジンのオプションを選択していきましょう。
今回デプロイする予定のアプリがMySqlを使用しているのでそちらを選択しました。
[![Image from Gyazo](https://i.gyazo.com/df1c8a162206f556f607d2d02f0440ea.png)](https://gyazo.com/df1c8a162206f556f607d2d02f0440ea)
次にテンプレートですが、今回は無料利用枠を使用して作成していきます。
[![Image from Gyazo](https://i.gyazo.com/08597fd16deec39343d4674c6c8fd824.png)](https://gyazo.com/08597fd16deec39343d4674c6c8fd824)
設定ですが、こちらはすべてtestとします。
パスワードは忘れないようにしてください。
[![Image from Gyazo](https://i.gyazo.com/599add8ad4353525cdca541eb114fe28.png)](https://gyazo.com/599add8ad4353525cdca541eb114fe28)

インスタンスサイズはt2.microという無料枠で使用可能なサイズを選択しました。
インスタンスサイズについての詳しい詳細は[こちらの記事](https://tenshoku-careerchange.jp/column/3625/)を参考にしてください。
[![Image from Gyazo](https://i.gyazo.com/6ad3d7b000e6832d35ea89f1671d1aee.png)](https://gyazo.com/6ad3d7b000e6832d35ea89f1671d1aee)

ストレージは最小の構成で選択しています。
運用していく中で容量を調整してください。
[![Image from Gyazo](https://i.gyazo.com/8d33b0b4e04e381871defb33e4369070.png)](https://gyazo.com/8d33b0b4e04e381871defb33e4369070)

接続はどのVPC、サブネットグループ、セキュリティグループを使用するかを設定していきます。
[![Image from Gyazo](https://i.gyazo.com/30b0b787010072d705b03eed28e40733.png)](https://gyazo.com/30b0b787010072d705b03eed28e40733)
また今回はセキュリティグループとしてtest_prductionを選択しました。以前productionはグループに所属しているものの全てのアクセス許可をするよう設定しましたね。
ですので、今回作成したRDSをproductionのグループに所属させることによって、同じproductionに属しているものからしアクセスできない、つまり、EC2サーバーからのアクセスしか許可しないといった設定にすることができるのです！
[![Image from Gyazo](https://i.gyazo.com/977761dc31e72171bc6a826f30a7943a.png)](https://gyazo.com/977761dc31e72171bc6a826f30a7943a)

データベース認証はRDSにログインするための認証方法の設定をします。
今回はパスワード認証を選択していきます。
[![Image from Gyazo](https://i.gyazo.com/f1864fecf3110d4d3b32512b50b79a7e.png)](https://gyazo.com/f1864fecf3110d4d3b32512b50b79a7e)

そうしましたら作成ボタンをクリックしてください。
ステータスの欄が利用可能になっていれば成功です。
[![Image from Gyazo](https://i.gyazo.com/70946ff34dff53a4614757a060a0f9eb.png)](https://gyazo.com/70946ff34dff53a4614757a060a0f9eb)

そしたら一度、RDSの作成時に出てきた用語について解説していきます。
- **マルチAZ**（Multi-AZ）は、AWSのAmazon RDS（Relational Database Service）におけるデータベースの冗長性を高める機能です。通常、Amazon RDSではデータベースを単一のアベイラビリティーゾーン（AZ）に配置します。しかし、マルチAZを有効にすると、データベースが同期的に別のアベイラビリティーゾーンにも複製されます。
要するに**災害などが起こった際に片方の物理マシンがダメージを受けてサービスの提供に支障が出ても、もう一方の物理マシンが無事ならそのままサービスを継続して提供することができる**ということ。
[![Image from Gyazo](https://i.gyazo.com/4b432f5f7af918fe4ea58118539bfd67.png)](https://gyazo.com/4b432f5f7af918fe4ea58118539bfd67)

## EC2
いよいよコアであるEC2についての設定をしていきます。
EC2（Elastic Compute Cloud）は、AWSのクラウドコンピューティングサービスのひとつです。
EC2は仮想サーバー（インスタンス）を提供し、ユーザーはこの仮想サーバー上でアプリケーションを実行することができます。
サーバーというのはパソコンという認識でも大丈夫です。
つまり**EC2を作成する＝クラウド上に自分専用のパソコンを作成する**ということです。
[![Image from Gyazo](https://i.gyazo.com/9cfd2f663b02c02ab8b2dbd3d27ab2da.png)](https://gyazo.com/9cfd2f663b02c02ab8b2dbd3d27ab2da)

作成手順ですが、まずはトップ画面からEC2に移動し、インスタンスを選択します。その後、インスタンスの起動をクリックします。
[![Image from Gyazo](https://i.gyazo.com/6f57b84743224172b86967a42cd4029d.png)](https://gyazo.com/6f57b84743224172b86967a42cd4029d)

まずはタグを設定します。
インスタンスを認識しやすくするために、testとしておきましょう。
[![Image from Gyazo](https://i.gyazo.com/3bf003aad3ad7a5f4dd2e4a0d3a4d06a.png)](https://gyazo.com/3bf003aad3ad7a5f4dd2e4a0d3a4d06a)

次はマシンイメージですね。
**AMI**（Amazon Machine Image）は、Amazon Web Services（AWS）のElastic Compute Cloud（EC2）で使用される仮想マシンイメージのことです。
AMIは、EC2インスタンスを起動するためのテンプレートとして機能します。AMIには、オペレーティングシステム（Windows、Linuxなど）や事前インストールされたアプリケーション、設定などのイメージが含まれています。
つまり**今から作成するパソコンのタイプを選択する**ということです。
今回はAmazon Linux2 AMIを選択します。
[![Image from Gyazo](https://i.gyazo.com/c7bfb2eb7400438b9068bf8fc5eb4448.png)](https://gyazo.com/c7bfb2eb7400438b9068bf8fc5eb4448)

インスタンスのタイプは練習用の無料枠であるt2.microプランを選択します。
慣れていない場合、できるだけお金をかからないものを選択しましょう。
[![Image from Gyazo](https://i.gyazo.com/2267c30cd22d9182b0ffb4403d9abbf7.png)](https://gyazo.com/2267c30cd22d9182b0ffb4403d9abbf7)

次にキーペアの設定です。
キーペアは、AWSのサービスであるEC2において、インスタンスへの安全なリモートアクセスを確保するための認証手段です。キーペアは公開鍵暗号方式を使用しており、インスタンスへのログインや暗号化された通信を行うために重要です。
つまり、**SSHの接続を行う際にどの鍵を使用するのかといった選択のこと**で、このキーペアが外部へ漏れてしまうとセキュリティがガバリます。笑
[![Image from Gyazo](https://i.gyazo.com/4e78fb1704efc1d097662734868d2559.png)](https://gyazo.com/4e78fb1704efc1d097662734868d2559)

次にネットワークの設定です。
VPCやサブネットは先ほど作成したものを選択します。
セキュリティグループ設定も同様に先ほど作成した3つのセキュリティグループを選択します。
今作成しているEC2は**インターネット経由での不特定多数アクセス**(http, https)、**SSH経由での開発者アクセス**(ssh)という二つの外部アクセスに加え、**データベースとの通信**(production)という限られた相手との通信も想定されているのでそれぞれの通信に許可を出します。
有料の記事にはなりますが、詳しくは[こちら](https://zenn.dev/naoki_mochizuki/books/1471ce20222227/viewer/5ed983)を参考にしてください。大変勉強になりました。
[![Image from Gyazo](https://i.gyazo.com/912e378f7ce219cb1d7240f6c01554ad.png)](https://gyazo.com/912e378f7ce219cb1d7240f6c01554ad)

ストレージも以下のように設定します。
[![Image from Gyazo](https://i.gyazo.com/468e3e6d0692aa87bd242ff691df6a7b.png)](https://gyazo.com/468e3e6d0692aa87bd242ff691df6a7b)

その他詳細については以下のように設定しました。
```
自動的割り当てパブリックIP: 無し
キャパシティの予約: 開く
シャットダウン動作: 停止
テナンシー: 共有
その他変更なし
```
それでは作成ボタンを押してみましょう。
以下のようになっていれば問題なく使用できる状態です。
[![Image from Gyazo](https://i.gyazo.com/748c33c57e334c8b0eeed4b96387d5b5.png)](https://gyazo.com/748c33c57e334c8b0eeed4b96387d5b5)

## ELastic IP
そしたら次にElastic IPの設定をしていきます。
**Elastic IP**（Elastic IPアドレス）は、AWSのサービスであるEC2インスタンスに対して固定のパブリックIPアドレスを割り当てるための機能です。
インターネットを使用する際にどのサーバーもグローバルIP(インターネット上で一意な識別子であるIPアドレスのこと)を所有しています。

ですが、先ほど作成したEC2インスタンスは設定時に自動割り当てパブリックIP無しとしているので、現状ではパブリックIPを持っていない状態となっています。
この設定では、インスタンスを停止するたびにIPアドレスが変わってしまいます・・・

そこでELastic IPが必要になってきます。
これにより固定のIPアドレスを押さえて、それをパブリックIPとしてEC2インスタンスに紐付けすることで、インスタンスの停止時にもIPアドレスが変わることなく通信し続けることができます。

それではELastic IPを設定していきましょう。
いつものように設定画面まで移動します。
[![Image from Gyazo](https://i.gyazo.com/7e2280bbc51ba11fb0056f1564c695c9.png)](https://gyazo.com/7e2280bbc51ba11fb0056f1564c695c9)

すでに必要な設定がされているのでそのまま割り当てボタンをクリックします。
[![Image from Gyazo](https://i.gyazo.com/cf2ecaaa538892d211a92b91b41dec7b.png)](https://gyazo.com/cf2ecaaa538892d211a92b91b41dec7b)

そして追加されたELastic IPと先ほど作成したEC2を関連づけていきます。
[![Image from Gyazo](https://i.gyazo.com/273b6075b2263adc4db58cdd0664a3d0.png)](https://gyazo.com/273b6075b2263adc4db58cdd0664a3d0)

紐づけるインスタンスを選択して関連づけていきます。
[![Image from Gyazo](https://i.gyazo.com/e795b911d4cb25bd3b948dfc641c7aad.png)](https://gyazo.com/e795b911d4cb25bd3b948dfc641c7aad)

EC2の画面へ移動して、取得したIPアドレスがEC2インスタンスのELastic IPと紐付けされていれば完了です。

[![Image from Gyazo](https://i.gyazo.com/e3f5d313c8cbd66835ddd4545602c2ef.png)](https://gyazo.com/e3f5d313c8cbd66835ddd4545602c2ef)


これでRDSとEC2の作成及び設定作業は終了です！
色々と慣れないことばかりで疲弊しますね・・・笑
次からはEC2内の環境を整えていくところが中心になっていくのでターミナルでの作業に移ります。
頑張っていきましょう！

# EC2内の環境設定
## キーペアの移動
先ほど作成したキーペアを適切なディレクトリへ配置し直す必要があります。
SSHログインができませんので・・・

そうしましたらダウンロードディレクトリから~/.sshディレクトリに移動させましょう
```terminal: local
% mv ~/Downloads/test_keypair.pem ~/.ssh 
```
その後.sshディレクトリに移動して次のコマンドを実行します。
```terminal: local
% cd ~/.ssh
```
その後lsコマンドでキーペアが存在するか確認します。
```terminal: local
% ls
test_keypair.pem 
```
きちんと確認できました！
これで完了です。

## SSH接続
**SSH接続**（Secure Shell）では、クライアントとサーバー間の通信が暗号化され、データの盗聴や改ざんから保護されます。これにより、安全なリモートアクセスやファイル転送、コマンド実行などの操作が可能になります。

先ほど作成したEC2インスタンスを確認すると、接続というボタンがあることがわかります。
ここをクリックするとSSH接続に関する詳細を確認できます。
[![Image from Gyazo](https://i.gyazo.com/7a4f3fb23dcb560c39744ef6532c3c1d.png)](https://gyazo.com/7a4f3fb23dcb560c39744ef6532c3c1d)

SSHクライアントを選択すると接続用のコマンドが表示されます。
[![Image from Gyazo](https://i.gyazo.com/f28365762b9c969d1a3f9391bedd9b66.png)](https://gyazo.com/f28365762b9c969d1a3f9391bedd9b66)
このコマンドは、
```terminal: ターミナル
% ssh ログインユーザ名@ログインホスト
```
というSSHのログインコマンドに、「鍵はこれを使用しますよ」ということを明示的に指定するための-iオプションが付与された形となります。

それではコマンドを実行してみます!

```terminal: local
 ％ ssh -i "test_keypair.pem" ec2-user@54.199.161.0
The authenticity of host '54.199.161.0 (54.199.161.0)' can't be established.
ED25519 key fingerprint is SHA256:1npPBa9wmza1gU3li8j/muYgEiHhLXcSlGr1VKonyZs.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? 
```
なんか長文が出てきましたね。こういうの見ると少し焦ります笑
[DeepL](https://www.deepl.com/translator)を使用して訳してもらいます。
```
ホスト「54.199.161.0 (54.199.161.0)」の信頼性を確立できません。
ED25519キーのフィンガープリントはSHA256:1npPBa9wmza1gU3li8j/muYgEiHhLXcSlGr1VKonyZsです。
この鍵は他の名前では知られていません。
本当に接続を続行しますか(はい/いいえ/[指紋])?
```
まあ要するにこの接続は初めてですが信用できますか？みたいなことを言ってるわけですね。
yesを入力してENTERキーを押しましょう！
```terminal
Warning: Permanently added '54.199.161.0' (ED25519) to the list of known hosts.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for 'test_keypair.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "test_keypair.pem": bad permissions
ec2-user@54.199.161.0: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
```
・・・ん？
なんか警告文が出てきました。
とりあえず訳してみましょう。
```
警告 54.199.161.0」（ED25519）を既知のホストのリストに永久に追加しました。
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
警告：保護されていない秘密鍵ファイルです！         @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
'test_keypair.pem'のパーミッション 0644 が開きすぎています。
秘密鍵ファイルは他人がアクセスできないようにする必要があります。
この秘密鍵は無視されます。
鍵「test_keypair.pem」のロード: パーミッションが不正です。
ec2-user@54.199.161.0: パーミッションが拒否されました(publickey,gssapi-keyex,gssapi-with-mic)。
```
どうも秘密鍵なのにオープンしすぎ！！って怒られているみたいですね。
そもそもパーミッション(Permissions)ってなんのことなんでしょうか？

- Linuxにおける「**パーミッション**（Permissions）」は、ファイルやディレクトリに対するアクセス権限を制御するための概念です。パーミッションは、所有者、グループ、その他のユーザーに対して、読み取り、書き込み、実行などの操作を許可または制限する役割を果たします。
    - 読み取り（Read）: ファイルの内容を読み取ることができる権限です。ディレクトリの場合、ディレクトリ内のファイルとサブディレクトリの一覧を表示することができます。
    - 書き込み（Write）: ファイルに書き込みや編集を行うことができる権限です。ディレクトリの場合、新しいファイルやディレクトリを作成したり、既存のファイルやディレクトリを削除したりすることができます。
    - 実行（Execute）: ファイルを実行することができる権限です。ディレクトリの場合、ディレクトリに移動するための権限です。 

なるほど、、、
そしたらtest_keypairのパーミッションを確認した方が早そうですね。
以下のコマンドを.sshディレクトリで実行してください。
```terminal: local
％ ls -al                                 
-rw-r--r--   1 asone0420 staff 1674  6 30 11:17 test_keypair.pem
```
何やら表示されました。
ここでいう`asone0420`というのが生有者で、`staff`が所有グループとなります。
また、Linuxのファイルには全て、「誰が、何を出来るか」という権限設定がなされており、具体的には、
- 誰が 
    - 所有者
    - 所有グループ
    - それ以外のユーザー

- 何を
    - r（読み取り）: ファイルの内容を読み取る権限がある。
    - w（書き込み）: ファイルに書き込む権限がある。
    - x（実行）: ファイルを実行する権限がある。
    
といったパターンの掛け合わせで、そのファイルに対する「誰が何をできるのか」が決まっています！

先ほど表示された
`-rw-r--r-- `というのは以下のような解釈になります。
```
rw-: `所有者`のパーミッションです。rw-は読み取りと書き込みの権限があり、実行の権限はありません。
r--: `グループ`のパーミッションです。r--は読み取りの権限のみがあり、書き込みや実行の権限はありません。
r--: `その他のユーザー`のパーミッションです。同様に、読み取りの権限のみがあります。
```
※  「-」はファイルのタイプを示す記号で、この場合は通常のファイルです。 

つまり先ほどの`Permissions 0644 for 'test_keypair.pem' are too open.`という警告文は、いろんな人に権限を与えすぎ!!という意味合いだったみたいです。
ではパーミッションを理解したところで、パーミッションの変更をしていきましょう。

権限の変更にはchmodコマンドを使用します。
```terminal: local
% chmod 600 test_keypair.pem
```
`chmod 600 test_keypair.pem`は、`test_keypair.pem`というファイルのパーミッションを設定するためのコマンドです。

具体的には、`600`はオクテット表記であり、所有者に読み取りと書き込みの権限を与え、グループやその他のユーザーには権限を与えないという意味です。
具体的なパーミッションは次の通りです：

- 所有者: 読み取り（4） + 書き込み（2）+ 実行（1） = 6
- グループ: 権限なし
- その他のユーザー: 権限なし

したがって、このコマンドを実行すると、`test_keypair.pem`ファイルの所有者には読み取りと書き込みの権限が与えられ、グループとその他のユーザーには何の権限も与えられません。

では、変更されたか確認していきます。
```terminal: local
％ ls -al
-rw-------   1 asone0420 staff 1674  6 30 11:17 test_keypair.pem
```
きちんと変更されていますね。

再度SSH接続してみましょう。
```terminal: remote
asone0420 ％ ssh -i "test_keypair.pem" ec2-user@54.199.161.0

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
[ec2-user@ip-10-0-1-202 ~]$ 
```
接続できました！
お疲れ様です！！

## Linuxユーザーの作成
上記のec2-userというのはEC2インスタンスを作成したときに最初に作成されるユーザーの名前です。
これはデフォルトのため不正攻撃を受けやすく他のユーザーを作成しつつec2-useを削除するのが推奨されます。
今回はtestという名前のユーザーを作成していきましょう。
``` remote
[ec2-user@ip-10-0-1-202 ~]$ sudo passwd test
ユーザー test のパスワードを変更。
新しいパスワード:
新しいパスワードを再入力してください:
passwd: すべての認証トークンが正しく更新できました。
```
きちんと登録できたら上記のような表示がされます。
次に`visudo`というコマンドを使用します。
これはスーパーユーザーという管理者権限を持つユーザーの権限範囲を編集するためのコマンドで、入力すると権限ファイルが編集できます。

それでは先ほど作成したtestユーザーに管理者権限を与えるために以下の手順で編集してください。
```
1. iを押して編集モードに切り替える
2. rootに関する権限の記述箇所を探す
    root    ALL=(ALL)       ALL　　を探す
3. その下に、作成したユーザーに権限を追加する記述する
    test   ALL=(ALL)       ALL 　を追加する
4. escを押してInputモードを終了する
5. Shift + zz で保存&編集完了
```

編集が完了したら以下のコマンドを入力してください。
```terminal: remote
ec2-user@ip-10-0-1-202 ~]$ sudo su - test
[test@ip-10-0-1-202 ~]$ 
```
ユーザーが切り替わりましたね。
これできちんとtestユーザーでログインしていることになります。

## 鍵の設置 
続いて鍵の設置をしていきます。
これはtestユーザーがこのサーバーにSSHログインできるよう設定するために行います。
以下が手順になります。
```
1. ローカルで公開鍵、秘密鍵をそれぞれ生成する
2. リモートで公開鍵の登録をする
3. ローカルのssh configファイルを編集し、サーバにログインできるようにする
4. 実際に新ユーザーでログインする
```

それでは早速やっていきましょう。
公開鍵、秘密鍵のペアを作成するには、`ssh-keygen`というコマンドを使用します。
今回はローカルの.sshディレクトリに鍵を作成していきたいので、

```terminal: local
% cd ~/.ssh
% ssh-keygen -t rsa
```
というコマンドを打ち込みます。

```
-----------------------------
Enter file in which to save the key (): # id_rsaを記述し、Enter
Enter passphrase (empty for no passphrase): # そのままEnter
Enter same passphrase again: # そのままエンター
-----------------------------
```
するとid_rsa.pubとid_rsaという2つのファイルが作成されます。
確認してみましょう。 
```terminal: locao
asone0420 ％ ls                                         
id_rsa.pub  id_rsa  test_keypair.pem
```
きちんと作成されていますね。
それぞれ、「.pub」がついている方が公開鍵、ついていない方が秘密鍵です。

次はリモートで公開鍵を登録していきましょう。
公開鍵の中身は以下のように確認します。
```terminal: local
％ cd ~/.ssh                                       
％ cat id_rsa.pub                             
ssh-rsa AAAAB3NzaC1yc2EA・・・
```
確認したものはコピーしておきます。
そしたらEC2サーバ内にtestユーザーとしてログインします。
そして以下の手順で公開鍵の中身を登録していきます。
```terminal: remote
[test@ip-10-0-1-202 ~]$ mkdir .ssh
[test@ip-10-0-1-202 ~]$ chmod 700 .ssh
[test@ip-10-0-1-202 ~]$ cd .ssh
[test@ip-10-0-1-202 .ssh]$ vim authorized_keys
[test@ip-10-0-1-202 .ssh]$  chmod 600 authorized_keys
[test@ip-10-0-1-202 .ssh]$ exit
logout
[ec2-user@ip-10-0-1-202 ~]$ exit
logout
```
`vim authorized_keys`を実行した際にvimが開くのでこの時に先ほどコピーした公開鍵の中身を貼り付けて保存していきます。
公開鍵は、.ssh/authorized_keysというファイルの中に記載していくという決まりになっています。

これでサーバー側の準備は整ったので、続いてはローカル側の設定もしていきます。

それではローカル側の設定をするために.ssh/configファイルを編集していきます。
**.ssh/configファイル**は、SSHクライアントの設定ファイルであり、SSH接続の構成オプションを定義するために使用されます。このファイルには、ホストごとの接続設定やエイリアス、SSHキーの指定などを記述することができます。

.ssh/configファイルをきちんと設定しておくと2**回目以降の接続で入力の手間を省ける**ので大変便利です。
頑張って設定していきましょう！
```terminal: local(.ssh/config)
Host test
  Hostname 54.199.161.0 #EC2のIPアドレス
  Port 22
  User test #先ほど作成したユーザー名
  IdentityFile ~/.ssh/id_rsa #秘密鍵のディレクトリ
```
上記の.ssh/configファイルの例では、testというホスト名に対して以下の接続設定が定義されています。
- Hostname 54.199.161.0: ホスト名としてEC2のIPアドレス（54.199.161.0）が指定されています。
- Port 22: SSH接続に使用するポート番号として22が指定されています。
- User test: ユーザー名としてtestが指定されています。
- IdentityFile ~/.ssh/id_rsa: 秘密鍵のファイルパスとして~/.ssh/id_rsaが指定されています。

これらを記載することによって、ログイン時は
```terminal: local
% ssh test
ast login: Fri Jun 30 11:39:07 2023

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
[test@ip-10-0-1-202 ~]$ 
```
と打ち込むだけで簡単に接続することができます。

それではデフォルトのec2-userを削除しましょう。
```terminal: local
[test@ip-10-0-1-202 ~]$ sudo userdel -r ec2-user
```
## パッケージのインストール
それではデプロイに必要な環境を整えていきます。
RailsアプリをEC2インスタンス内で動くようにしなければならないので、管理ツールを使って環境構築していきましょう！
それでは根幹になるパッケージをダウンロードしたいので以下のコマンドを実行してください。
`sudo yum`はyumコマンドを使用してパッケージをインストールするためのコマンドです。
また、コマンドの改行（\）は継続行を表すためのものです。
```terminal: remote
[test@ip-10-0-1-202 ~]$ sudo yum install \
git make gcc-c++ patch \
openssl-devel \
zlib-devel readline-devel \
mysql mysql-devel \
eadline-devel \
epel-release
```
インストールするパッケージの一覧は以下の通りです。
```: パッケージ一覧
git: Gitバージョン管理システムのインストール
make: ビルドツールであるMakeのインストール
gcc-c++: C++コンパイラのインストール
patch: パッチファイルの作成や適用に使用されるパッケージのインストール
openssl-devel: OpenSSL開発ライブラリのインストール
zlib-devel: 圧縮ライブラリであるZlibの開発ライブラリのインストール
readline-devel: GNU Readlineライブラリの開発ヘッダファイルのインストール
mysql: MySQLデータベースサーバーのインストール
mysql-devel: MySQLデータベースの開発ヘッダファイルのインストール
epel-release: Extra Packages for Enterprise Linux（EPEL）リポジトリのリリースパッケージのインストール
```
無事に完了しました！
次はRubyをインストールしていきましょう。

## Rubyのインストール
**rbenv**は、Rubyのバージョン管理ツールです。複数のRubyバージョンを同一の開発環境で使用することができるため、異なるプロジェクトやアプリケーションで必要なRubyバージョンを使い分けることができます。

具体的には、rbenvを使用すると、システム全体のRubyバージョンを変更することなく、プロジェクトごとに異なるRubyバージョンを指定できます。それにより、プロジェクトの要件に合わせて適切なバージョンのRubyを利用することができます。

以下がRubyの主なインストール手順です。
```
1. rbenvのインストール
2. rbenvを使用して、指定したバージョンのRubyをインストール
```
それではやっていきましょう。
下記コマンドを使用してrbenvをインストールします。
```terminal: remote
[test@ip-10-0-1-202 ~]$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
Cloning into '/home/test/.rbenv'...
remote: Enumerating objects: 3205, done.
remote: Counting objects: 100% (355/355), done.
remote: Compressing objects: 100% (201/201), done.
remote: Total 3205 (delta 197), reused 271 (delta 142), pack-reused 2850
Receiving objects: 100% (3205/3205), 646.94 KiB | 8.74 MiB/s, done.
Resolving deltas: 100% (1987/1987), done.
```
続いてパスを通して、そのまま設定を反映させます。
```
[test@ip-10-0-1-202 ~]$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
[test@ip-10-0-1-202 ~]$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
[test@ip-10-0-1-202 ~]$ source .bash_profile 
```
これらのコマンドは、`.bash_profile`ファイルにrbenvの設定を追加し、設定を反映させるためのものです。以下にそれぞれのコマンドの目的と効果を説明します：

1. `echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile`: `~/.bash_profile`ファイルに、rbenvの実行ファイルへのパスを追加する設定を追記します。これにより、rbenvのコマンドを実行するために必要なパスが環境変数に追加されます。

2. `echo 'eval "$(rbenv init -)"' >> ~/.bash_profile`: `~/.bash_profile`ファイルに、rbenvの初期化スクリプトを実行する設定を追記します。これにより、rbenvが正しく初期化され、シェルでrbenvを使用できるようになります。

3. `source .bash_profile`: `.bash_profile`ファイルの変更を現在のシェルセッションに反映させます。`source`コマンドは、指定されたスクリプトを現在のシェルで実行するために使用されます。ここでは、`.bash_profile`ファイルの変更を読み込み、設定を有効にします。

これらのコマンドを実行することで、rbenvの設定が`~/.bash_profile`に追加され、現在のシェルセッションでrbenvが利用可能になります。これにより、rbenvを使用してRubyのバージョンを管理することができるようになります。

そしたらruby-buildもインストールしましょう。
```terminal: remote
[test@ip-10-0-1-202 ~]$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
Cloning into '/home/test/.rbenv/plugins/ruby-build'...
remote: Enumerating objects: 14014, done.
remote: Counting objects: 100% (164/164), done.
remote: Compressing objects: 100% (57/57), done.
remote: Total 14014 (delta 102), reused 149 (delta 95), pack-reused 13850
Receiving objects: 100% (14014/14014), 2.81 MiB | 8.30 MiB/s, done.
Resolving deltas: 100% (9585/9585), done.
[test@ip-10-0-1-202 ~]$ rbenv rehash  
```

- **ruby-build**は、Rubyのバージョン管理ツールであり、rbenvと一緒に使用することができます。rbenvがRubyのバージョン管理を行うのに対して、ruby-buildは実際のRubyのビルドを行います。
- **rbenv rehash**は、rbenvのコマンドのハッシュを更新するためのコマンドです。rbenvを使用してRubyのバージョンを切り替えたり、新しいRubyのバージョンをインストールした場合、それに応じて使用可能なRubyのバージョンに関連するコマンドや実行ファイルのハッシュを更新する必要があります

では、Rubyをインストールしていきましょう。

```terminal: remote
[test@ip-10-0-1-202 ~]$ rbenv install -v 3.2.2 
[test@ip-10-0-1-202 ~]$ rbenv global 3.2.2
[test@ip-10-0-1-202 ~]$ rbenv rehash
[test@ip-10-0-1-202 ~]$ ruby -v
ruby 3.2.2 (2023-03-30 revision e51014f9c0) [x86_64-linux]
```
最後に3.2.2という表示が返ってくれば成功です！
うまくいかない場合は[こちら](https://qiita.com/PRYA/items/50fc2357b4b820d09c45)を参照してください。

## Nodejsのインストール
**Node.js**は、サーバーサイドでJavaScriptを実行するためのオープンソースのランタイム環境です。JavaScriptは通常、Webブラウザでクライアントサイドのスクリプトとして実行されますが、Node.jsを使用することで、サーバーサイドのアプリケーションやスクリプトをJavaScriptで開発することができます。

今回は、ver15系をインストールしていきましょう。
`nvm`のインストールスクリプトをダウンロードします。
```terminal: remote
[test@ip-10-0-1-202 ~] $ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash
```

インストールスクリプトを実行すると、`nvm`がインストールされます。ターミナルを再起動するか、以下のコマンドを実行してnvmを有効化します。
```terminal: remote
[test@ip-10-0-1-202 ~] $ source ~/.bashrc
```

再度、以下のコマンドを実行してみてください。
```terminal: remote
[test@ip-10-0-1-202 ~] $ nvm --version
```

`nvm`のバージョンが表示されれば、正しくインストールされています。

その後、以下のコマンドでNode.jsのバージョン15.14.0をインストールします。
```terminal: remote
[test@ip-10-0-1-202 ~] $ nvm install 15.14.0
```

インストールが完了したら、以下のコマンドを実行してNode.jsのバージョンを確認してください。

 ```terminal: remote
[test@ip-10-0-1-202 ~]$ node -v
v15.14.0
```
バージョンが表示されれば、Node.jsのインストールが正常に完了しています。
もしエラーが出てしまう場合は、[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/sdk-for-javascript/v2/developer-guide/setting-up-node-on-ec2-instance.html)を参照してください。

## yarnのインストール
**Yarn**は、JavaScriptのパッケージマネージャーです。Node.jsプロジェクトで使用され、依存関係の管理やパッケージのインストール、ビルドプロセスの管理などを行います。

まずはyarnのレポジトリ追加です。
```terminal: remote
[test@ip-10-0-1-202 ~] $ curl -sL https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo
```
yarn本体をインストールします。
```terminal: remote
[test@ip-10-0-1-202 ~] $ sudo yum -y install yarn
```
yarnのバージョンが表示されれば完了です。
```terminal: remote
[test@ip-10-0-1-202 ~] $ yarn -v
1.22.19
```
これで無事にEC2内の必要な環境設定が終わりましたね。

# おわりに
だいぶきつい前半戦でしたね。ほんと長かった・・・
次回はGithubからデプロイするのとWeb・アプリケーションサーバーの設定を中心に行なっていきます。
頑張りましょう！


# 引用文献
https://aws.amazon.com/jp/what-is-aws/

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/get-set-up-for-amazon-ec2.html

https://pikawaka.com/rails/ec2_deploy

https://zenn.dev/naoki_mochizuki/books/1471ce20222227/viewer/5ed983

https://tenshoku-careerchange.jp/column/3625/