45
52

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

🔰 AWS初心者🔰ゴリ🦍ゴリ🦍カスタムデプロイ編🎉

Last updated at Posted at 2024-01-20

【概要】

本記事では、AWSでアプリデプロイまでを解説していきたいと思います。
なお、筆者は初心者ですので、過不足や改善案などご指摘くださると幸いです。

※(今回発行したkeyなどは、掲載前に全て削除しております。ご了承ください。)

【注意!!】

※ 今回は、Terraformではなく機能理解のため、コンソール上で環境構築します。

また、AWSは料金がかかるものになっております!
当作業で発生する料金などは筆者はいかなる責任も負いませんのでご注意ください。

終了後は必ず環境の削除をお願いします。

【前提】

・作成済アプリがあること

・インフラ構成をある程度理解していること

・作成した図通りのインフラ構築の作業を行うこと
(ただし、インフラ構成の説明のため、Github-actionは今回説明を省きます。)

⇨環境構築などは、アプリで最適解となりますのでご了承ください。
また、改善案などあれば宜しくお願いいたします。

【環境】

・macOS Sonoma ver.14
・2024年時点のAWSコンソール
・Rails 7.0.8
・Ruby3.1.2
・Postgres

【対象者】

・AWS初心者の方
・IaCでなく、GUIで確認したい方

【はじめに】

はじめに、今回作成するインフラの構成図を確認します。
今回は下記を目標として作業を行いたいと思います。

スクリーンショット 2024-01-20 22.57.47.png

重要なものは下記で説明します。

【ルートユーザー】

全権限を持ったユーザーになります。
基本的には、IAMユーザーの作成・権限委譲や予算作成など強力な権限の操作を行います。

【IAMユーザー】

ルートユーザーから委譲された権限範囲で操作を行うためのユーザーになります。

【AWS Management Console】

MFA(他要素認証)の設定になります。設定方法については後述します。

【VPC】重要!!

VPC(Virtual Private Cloud)は、クラウドコンピューティング環境において、ユーザーが仮想的なプライベートネットワークを構築できるサービスです。VPCを使用することで、ユーザーはクラウド内でリソースを論理的に分離し、セキュリティを強化することができます。

安全なネットワークのことです。
マンションやアパートのようなものと例えると分かりやすいです。

【サブネットマスク】重要!!

サブネットマスク(Subnet Mask)は、IPアドレスをネットワークとホストの部分に分割するための手段です。IPv4アドレスは32ビットで構成されており、通常は4つの8ビット(バイト)ブロックに分かれて表現されます。サブネットマスクはこれらのビットのグループをネットワーク部分とホスト部分に分ける役割を果たします。

サブネットマスクは、フロアや部屋番号のことです。
サブネットマスクには、publicprivateなサブネットに分けられます。

具体的には下記です。FEに触れたことがある方は馴染み深いかもです。

クラス 範囲 ネットワーク数
クラスA 10.0.0.0 ~ 10.255.255.255 (10.0.0.0/8) 1
クラスB 172.16.0.0 ~ 172.31.255.255 (172.16.0.0/12) 16
クラスC 192.168.0.0 ~ 192.168.255.255 (192.168.0.0/16) 256

ただし、これらの範囲外になるとグローバルアドレスとなってしまうので、
VPCやサブネットを作成する際のIPv4CIDRブロックは、上記の範囲内で作成しましょう。

また、AWSで設定できるCIDRの最小単位は /28となっており、
例えば、クラスBで設定する場合、172.16.10.0/29などは設定できないのでご注意を!
(インフラ素人が3週間でWebサービスのインフラを0から構築するためにやったことから引用)

IPアドレスを作成する際は下記のCIDR範囲内から抜粋するようにしましょう。

CIDR サブネットマスク IPアドレスの数
/28 255.255.255.240 16
/27 255.255.255.224 32
/26 255.255.255.192 64
/25 255.255.255.128 128
/24 255.255.255.0 256
/23 255.255.254.0 512
/22 255.255.252.0 1,024
/21 255.255.248.0 2,048
/20 255.255.240.0 4,096
/19 255.255.224.0 8,192
/18 255.255.192.0 16,384
/17 255.255.128.0 32,768
/16 255.255.0.0 65,536

【EC2】重要!!

Amazon Elastic Compute Cloud(Amazon EC2)は、Amazon Web Services(AWS)が提供するクラウドコンピューティングプラットフォームの一部です。EC2を使用すると、仮想サーバー(インスタンス)をオンデマンドでプロビジョニングし、起動、停止、削除などの操作を行うことができます。

簡単にいうと、webサーバです。
今回はインフラ構成ではpublicのみに設置する構成ですが、private配下にも設置する構成でも可能です。
その場合、publicからprivateに対して通信をします。
publicは踏み台サーバと呼ばれます。

【Route53】 重要!!

下記のような、ドメインを取得するのに使用します。

https://***.com/ ←***.comの部分です。

お名前.comなどでもドメイン取得することができますが、
今回は練習として標記で取得します。

それ以外にも、下記のような恩恵を得られます。

1.ドメイン登録機能
2.DNS ルーティング機能
3.DNS ヘルスチェック機能

他に、ALBEC2に紐付けた設定ができます。

【ALB】 重要!!

Application Load Balancer (アプリケーション ロード バランサー):
AWS (Amazon Web Services) においては、「ALB」は「Application Load Balancer」の略で、コンテンツベースのルーティングを行うためのロードバランサーサービスを指します。これは、トラフィックを複数のAmazon EC2インスタンスやコンテナに均等に分散することで、アプリケーションの冗長性と可用性を向上させるのに使用されます。

EC2インスタンス(webサーバ)の負荷分散に必要なものです。
EC2が複数存在する場合は、自動的に負荷分散できます。

それ以外にも、Route 53と紐づいた設定が行えます。

以上で、重要なAWSの概念の説明になります。
それぞれの役割を確認できたら、早速実装に取りかかりましょう。

【実施手順】

ここから実施手順になります。

【手順】

・【AWSアカウント作成】
・【MFA導入】
・【VPC】
・【サブネットの作成】
・【publicのサブネット】
・【privateのサブネット】
・【インターネットゲートウェイ(IGW)】
・【EC2】
・【RDS】
・【ACL】
・【Route 53】
・【ACM】

【AWSアカウント作成】

まずは、AWSの登録を行います。下記を参照してください。

作成したルートユーザーでまずは操作を行います。

スクリーンショット 2024-01-11 22.30.59.png

ルートユーザーでログイン後、IAMユーザーを作成します。

今回は、個人開発想定なので、管理者権限を委譲してすべてこちらで作業します。
(本来なら、必要な機能ごとにユーザーを分けるのがベストプラクティスだと思われます)

スクリーンショット 2024-01-11 22.33.01.png

1.ユーザーを選択
スクリーンショット 2024-01-11 22.48.32.png

2.ユーザーを作成
スクリーンショット 2024-01-11 22.50.22.png

3.ユーザーの詳細を設定
スクリーンショット 2024-01-11 22.53.23.png

4.ユーザーグループを作成
スクリーンショット 2024-01-11 22.58.30.png

5.グループを追加
「administratoraccess」で検索し、グループに追加。
スクリーンショット 2024-01-11 22.56.50.png

6.「次へ」を選択
スクリーンショット 2024-01-11 23.00.09.png

7.ユーザーを作成
スクリーンショット 2024-01-11 23.01.17.png

8.ヘッダーからルートユーザーのregionを「東京」に変更
なお、下記画面でアカウントIDを控えておきましょう。(後ほど使用します。)
スクリーンショット 2024-01-15 22.12.57.png

【budgets設定】

次に、budgetsの設定を行います。

これを行うことで、課金の上限金額などの設定し、アラートを出せるようにしましょう。

1.「budgets」と検索
スクリーンショット 2024-01-12 23.32.06.png

2.「予算を作成」をクリック
スクリーンショット 2024-01-12 23.37.52.png

3.カスタマイズを選択し、「コスト予算」をクリック
スクリーンショット 2024-01-12 23.40.59.png

4.予算などの設定を行う。

・間隔:月別
・予算有効日:定期予算
・開始日:そのまま
・予算設定方法:固定
予算額:10.00(例) 
・予算のスコープ(全てデフォルト)

下記は一例です。
Image from Gyazo

5.アラームの設定を行う。(今回は、60%を閾値とします)
スクリーンショット 2024-01-12 23.50.05.png

【MFA導入】

次は、多段階認証を設定します。

1.IAMのページにアクセスして左側のメニューバーからユーザーを選択
スクリーンショット 2024-01-11 23.20.38.png

2.「セキュリティ認証情報」のタブからMFA デバイスの割り当てを選択
スクリーンショット 2024-01-11 23.23.31.png

3.MFAを確認するものを選択し、次へ
スクリーンショット 2024-01-11 23.25.08.png

QRコードの読み取りは、下記のアプリを使用

4.デバイスの設定から、ワンタイムパスワードをそれぞれ打鍵。
(※30秒ごとにワンタイムパスが切り替わるので、連続するパスを打鍵してください。)
スクリーンショット 2024-01-11 23.41.34.png

5.MFAに作成できていれば完了です。
スクリーンショット 2024-01-11 23.40.37.png

6.次回からIAMユーザーのログイン時にワンタイムパスでログインを制御します。
スクリーンショット 2024-01-12 21.06.22.png

今回では、ルートユーザーでの作業はここまでになります。
その他、AWS公式では設定を推奨しているものなど設定したい場合は下記をご参照ください。

IAMユーザーに切り替えましょう。
スクリーンショット 2024-01-11 23.11.02.png

【VPC】

ここからデプロイを行うための、詳細設定になります。
まずは、VPCを作成しましょう。

1.VPCを検索し、VPCをクリック。
スクリーンショット 2024-01-13 0.30.59.png

2.VPCを作成をクリック。
スクリーンショット 2024-01-13 0.32.57.png

ここで、VPCの登録を行います。
今回は、デプロイ用にproductionのみの構成にします。

環境 IP
production 10.0.0.0/16
staging 10.1.0.0/16
development 10.2.0.0/16

3.VPCの設定

IPv4 CIDR: 10.0.0.0/16

スクリーンショット 2024-01-13 0.38.48.png

【サブネットの作成】

次にサブネットの作成を行います。

publicサブネットの設定

1.publicのサブネットを生成します。
スクリーンショット 2024-01-13 0.43.30.png

2.サブネットの作成をクリック。
スクリーンショット 2024-01-13 0.45.44.png

3.サブネットを作成する。
・名前「public-subnet-1a-prod」のようなpublicとわかる命名で登録。

IPv4の「10.0.1.0/24」を設定し、その他は画面通り。

スクリーンショット 2024-01-13 1.01.15.png

privateサブネットの作成

4.publicと同様の手順で1〜3を作成
命名規則を「private-subnet-1a-prod」のようなpublicとわかる命名で登録。

CIDRの設定を「10.0.2.0/24」とpublicと分けるようにしましょう。

スクリーンショット 2024-01-13 1.11.20.png

5.下記のようになります。
スクリーンショット 2024-01-13 1.12.58.png

6.RDSで2つのAZを求められるので、大阪リージョンでもpublicprivateを作成しておきましょう。
(※ALB用のサブネットは後で作成します。)

スクリーンショット 2024-01-20 23.17.38.png

【IGWの設定】

次に、インターネットゲートウェイ(以下、IGWと略)の設定をします。

インターネットゲートウェイ(Internet Gateway)は、Amazon Virtual Private Cloud(Amazon VPC)内のリソースにインターネットへのアクセスを提供するためのAWSサービスです。インターネットゲートウェイは、VPC内のパブリックサブネットと連携して、外部からのトラフィックの送受信を可能にします。

要は、publicサブネットにインターネット回線を持ってきてくれる設定で、これを設定することでネット接続できるようになります。(糊のようなものだと思ってください。)

1.IGWを検索
スクリーンショット 2024-01-15 21.32.54.png

2.IGWの作成を選択
スクリーンショット 2024-01-13 1.22.54.png

3.IGW名を決定し、作成
スクリーンショット 2024-01-13 1.21.20.png

4.作成後に、VPCにアタッチする。
スクリーンショット 2024-01-13 1.24.07.png

5.作成済みのVPCを選択し、アタッチ
スクリーンショット 2024-01-13 1.25.27.png

仮にprivateサブネットからネットアクセスを行う場合、NATゲートウェイを設定しましょう。
本アプリでの設定はここまでになりますので省略いたします。

名称 インターネット接続対象のサブネット IPアドレスの変換方法 許可される通信方向
インターネットゲートウェイ パブリックサブネット NAT 外向き、内向き
NATゲートウェイ プライベートサブネット NAPT 外向きのみ

【ルートグループ】

ルートテーブルとは、サブネットから外に出る通信をどこに向けて発信するかルール
になります。基本的には下記のような構成になります。

publicサブネットの構成要素

送信先 ターゲット
10.0.0.0/21 local
0.0.0.0/0 Internet gateway

1.ルートグループで検索
スクリーンショット 2024-01-13 1.30.01.png

2.サイドバーから「ルートテーブル」を選択します。
スクリーンショット 2024-01-13 1.31.34.png

3.既存のルートから「ルートを編集」をクリック。
スクリーンショット 2024-01-13 1.38.47.png

4.下記を設定

・送信先を「0.0.0.0」
・ターゲットを、先ほど設定したIGWに設定する。

スクリーンショット 2024-01-13 1.36.35.png

5.ルートテーブル↔️サブネットへの紐付け
スクリーンショット 2024-01-15 23.00.19.png

6.「関連付けを保存」をpublicで行う
スクリーンショット 2024-01-15 23.03.13.png

privateサブネットの構成要素

送信先 ターゲット
10.0.0.0/21 local

7.privateも同様にルートテーブルを作成する。
スクリーンショット 2024-01-15 23.50.06.png

8.privateサブネットの関連付けを作成する。
スクリーンショット 2024-01-15 23.54.05.png

9.privateの関連付けを保存する。
スクリーンショット 2024-01-15 23.56.17.png

10.2つの関連付けが下記のようになっていれば問題なしです!
Image from Gyazo

【セキュリティグループの作成】

次は、セキュリティーグループを作成します。
主に通信を制御するFW機能・インスタンスのアクセス許可や制御などの役割を果たします。
今回は、EC2とRDSのセキュリティグループを作成します。

セキュリティグループの概要

役割 名称 許可ポート アクセス元
ロードバランサー web-system-alb-sg HTTPS(443番ポート) どこからでも許可
踏み台サーバー web-system-bastion-sg SSH(22番ポート) 自分のグローバルIPアドレス
WEBサーバー web-system-sg HTTP(80番ポート) ロードバランサーからのみ
WEBサーバー web-system-sg SSH(22番ポート) 踏み台サーバーからのみ

【EC2のセキュリティグループを作成】

1.VPCのセキュリティグループを選択
スクリーンショット 2024-01-13 1.52.12.png

2.セキュリティグループを作成
スクリーンショット 2024-01-13 1.54.37.png

3.下記のように編集

・VPC:デフォルトVPCを使用
・インバウンドルール:
- 1つ目
・タイプ:HTTP
・ソース:Anywher IPv4 0.0.0.0/0
- 2つ目
・タイプ:SSH
・ソース:Anywher IPv4 0.0.0.0/0
・アウトバウンドルール:そのまま
・タグも不要

スクリーンショット 2024-01-13 2.00.27.png

4.EC2のセキュリティグループができたことを確認。(https通信用は後で設定する。)
スクリーンショット 2024-01-13 2.03.53.png

【RDS用のセキュリティグループを作成】

5.RDS用のセキュリティグループを記述していく。
スクリーンショット 2024-01-15 23.27.33.png

・セキュリティグループ:db-sg
・説明:db-sg
・VPC:作成した物
・インバウンドルール
 タイプ:使用するDBを選択
 ソース:カスタム
 先ほど作成したセキュリティグループを作成
 ・アウトバウンドルール:そのまま
 ・タグも不要

6.下記のようにセキュリティグループがそれぞれ作成できたことを確認。
スクリーンショット 2024-01-15 23.31.55.png

【エンドポイントの作成】

エンドポイントの設定です。
privateサブネットから、S3などにアクセスするために設定するものになります。

選択し間違えると、課金されてしまいます。

オンプレ以外は、gatewayのタイプを選びましょう。

特徴 インターフェイス型 ゲートウェイ型
経路 awsネットワーク経由 awsネットワーク経由
オンプレ環境からの使用※1 可能 不可
ピアリング先からの使用※1 可能 不可
料金 有料 無料
使用されるIPアドレス※2 プライベートIP パブリックIP
アクセス制限 SG+エンドポイントポリシー エンドポイントポリシー
アクセス方法※3 エンドポイントのDNS名を追加で使用 S3のUriのみで可
作成時の紐付け対象 サブネット ルートテーブル

1.「エンドポイント」を選択
スクリーンショット 2024-01-13 2.08.14.png

2.「エンドポイントを作成」を選択
スクリーンショット 2024-01-13 2.09.13.png

3.下記のように選択。

・VPC:デフォルトVPCを選択
・サービスカテゴリ:「AWSのサービス」を選択
・サービス:「com.amazonaws.ap-northeast-1.s3」を選択
・VPC:デフォルトVPCを選択
・アベイラビリティーゾーン:「ap-northeast-1a」を選択
・サブネット:
・アベイラビリティーゾーン:ap-northeast-1a
・サブネットID:privateサブネットのものを選択
・IPアドレスタイプ:IPv4
・セキュリティグループ:先に作成したセキュリティグループを選択
・ポリシー:フルアクセス
・ルートテーブル: 先ほど作成したprivateなルートテーブル

スクリーンショット 2024-01-16 0.25.44.png
スクリーンショット 2024-01-16 0.27.20.png

4.完了した場合、このようになります!
スクリーンショット 2024-01-16 0.31.02.png

※ちなみに、privateルートテーブルで紐付けを行わない場合はErrorが発生します。
スクリーンショット 2024-01-13 2.27.07.png

その場合、DNSを有効化にする設定が必要です。
スクリーンショット 2024-01-13 2.31.11.png

ここで編集後に再度、実行。
スクリーンショット 2024-01-13 2.32.50.png

無事、作成出来ました!!🎉🎉(基本はセキュリティ上、前者の対応が良さそうな気がします。)
スクリーンショット 2024-01-13 2.34.15.png

【RDS】

【セキュリティの設定】

1.作成したセキュリティグループを、サブネットグループに紐付けを行う。
スクリーンショット 2024-01-18 22.17.30.png

2.「DBサブネットグループを作成」をクリック。
スクリーンショット 2024-01-18 22.28.27.png

3.下記、設定を行う。
スクリーンショット 2024-01-18 22.36.58.png

4.AZを2つ選択。
スクリーンショット 2024-01-19 0.08.20.png

5.上記AZに対応するprivate-subnetを紐づける。
スクリーンショット 2024-01-19 0.09.20.png

6.下記のように作成されることを確認。
スクリーンショット 2024-01-19 0.11.16.png

【KMSの設定】

DBの復元などを行う設定です。

1.キーの作成をクリック。
スクリーンショット 2024-01-19 2.00.57.png

2.下記のようになっていることを確認し、「次へ」をクリック。
スクリーンショット 2024-01-19 2.03.28.png

3.ラベルを追加にて、下記を参照し、変更。
スクリーンショット 2024-01-19 2.05.50.png

4.キーアクセス許可をIAMユーザーに紐づける。
スクリーンショット 2024-01-19 2.08.03.png

5.キーの使用法アクセス許可を定義
スクリーンショット 2024-01-19 2.09.54.png

6.設定内容を確認し、問題なければ作成。
スクリーンショット 2024-01-19 2.10.52.png

7.作成できたことを確認。(RDS作成で使用します。)
スクリーンショット 2024-01-19 2.12.10.png

【データベースの作成】

1.「データベースを作成する」を選択。
スクリーンショット 2024-01-18 21.32.01.png

2.データベースの内容を細かく設定。
(下記参照。ただし、ポート番号など必要項目は要件に合わせてください。)
スクリーンショット 2024-01-19 1.53.33.png
スクリーンショット 2024-01-19 0.16.09.png
スクリーンショット 2024-01-19 1.55.01.png
スクリーンショット 2024-01-19 1.56.06.png
スクリーンショット 2024-01-19 1.58.02.png
スクリーンショット 2024-01-19 2.19.06.png

※念の為、概算コストなどは確認しておきましょう。(今回はコスト記載概要を満たすため、問題なしです。)
スクリーンショット 2024-01-19 2.21.14.png

作成されるまで、少しお待ちしておきましょう。
スクリーンショット 2024-01-19 2.24.08.png
できました!!
スクリーンショット 2024-01-19 2.39.40.png

【EC2】

1.EC2と打鍵後、インスタンスを選択
スクリーンショット 2024-01-13 2.36.50.png

2.「インスタンスの起動」を選択
スクリーンショット 2024-01-13 2.38.36.png

・名前「分かりやすい命名規則」
・OS「Amazon Linux 2 AMI (HVM) - Kernel 5.10, SSD Volume Type(64ビット x86)」
・インスタンスタイプ「t2.micro」
・VPC「デフォルト値」
・サブネット「publicを指定」
・セキュリティグループ:先ほど設定したグループを指定。
・その他はデフォルトのまま

3.下記のように出来たら作成。
スクリーンショット 2024-01-13 2.48.52.png
スクリーンショット 2024-01-19 3.03.24.png

キーペアの作成は忘れないようにしましょう!

Image from Gyazo
スクリーンショット 2024-01-13 2.49.53.png
スクリーンショット 2024-01-13 2.50.52.png

4.EC2とRDSの紐付けを行う。
スクリーンショット 2024-01-19 3.10.37.png

5.紐付きができると下記の画面になります。
スクリーンショット 2024-01-19 3.12.34.png

【Elastic IPアドレス】

1.Elastic IPを選択する。
スクリーンショット 2024-01-19 3.16.04.png

2.割り当てを行う。
スクリーンショット 2024-01-19 3.17.58.png

3.そのまま割り当てを行う
スクリーンショット 2024-01-19 3.24.13.png

4.作成後に、IPの割り当てを行う(ElasticIPアドレスは控えておきましょう。)
スクリーンショット 2024-01-20 23.54.22.png

5.先ほど起動したインスタンスを選択
スクリーンショット 2024-01-20 23.55.55.png

【Route 53】

通常は、お名前.comなど格安のサイトで取得すべきですが、今回は、こちらの方法で取得します。

1.Route 53で検索
スクリーンショット 2024-01-13 3.16.44.png

2.使用可能であれば、そのまま進めましょう。
※ただし、ドメイン名によって値段が上下するので比較して検討してください。
スクリーンショット 2024-01-13 3.18.59.png

3.「チェックアウトに進む」をクリック。
スクリーンショット 2024-01-18 19.50.01.png

4.「次へ」をクリック。
スクリーンショット 2024-01-18 19.55.23.png

5.個人情報を登録し、次のように作成。
スクリーンショット 2024-01-18 20.00.24.png

6.作成されたことを確認します。
スクリーンショット 2024-01-18 20.44.50.png

【S3】の設定

S3は別記事で紹介しておりますので、下記をご参照ください。
ただし、下記記事はRailsの写真保存の内容ですので、ログ退避の設定はご自身で調査お願いします。

【デプロイ前準備】

お待たせしました!いよいよデプロイです。

1.EC2で作成したpemキーを.ssh直下に先ほど取得したキーを設定する。
スクリーンショット 2024-01-19 3.48.07.png

2.下記をコピーし、ターミナルで実行。(インスタンスの権限を許可・実行をする)
スクリーンショット 2024-01-19 3.53.27.png

3.下記稼働確認を行う

※ もしこのような場合。。。。
スクリーンショット 2024-01-19 4.01.31.png

下記の設定を行ってください。
スクリーンショット 2024-01-19 5.40.54.png

下記のようになればログインできてます。

EC2
xxx .ssh % ssh -i "xxxx.pem" xxxxx.xxxx.xxx.xx.xx.amazonaws.com
Last login: xxxxxxxxxxxxx
   ,     #_
   ~\_  ####_        Amazon Linux 2
  ~~  \_#####\
  ~~     \###|       AL2 End of Life is 2025-06-30.
  ~~       \#/ ___
   ~~       V~' '->
    ~~~         /    A newer version of Amazon Linux is available!
      ~~._.   _/
         _/ _/       Amazon Linux 2023, GA and supported until 2028-03-15.
       _/m/'           https://aws.amazon.com/linux/amazon-linux-2023/

EC2環境の設定

パッケージのアップデートを行う。

ターミナル
$ sudo yum -y update #パッケージのアップデート

yumパッケージのインストールを行う。
(下記は、MySQLのコマンド。別でpostgersを用意します。)

ターミナル
$ sudo yum -y install \
git make gcc-c++ patch curl \
openssl-devel \
libcurl-devel libyaml-devel libffi-devel libicu-devel \
libxml2 libxslt libxml2-devel libxslt-devel \
zlib-devel readline-devel \
mysql mysql-server mysql-devel \
ImageMagick ImageMagick-devel \
epel-release

Node.jsをインストールするためのリポジトリを設定するスクリプトを実行。

ターミナル
$ curl -sL https://rpm.nodesource.com/setup_19.x | sudo bash -

先ほど参照できるよう設定したリポジトリファイルからNode.jsをインストール

ターミナル
$ sudo yum install -y https://rpm.nodesource.com/pub_14.x/el/7/x86_64/nodesource-release-el7-1.noarch.rpm

Nodeの細かい設定など。。。

ターミナル
$ sudo yum install -y gcc-c++ make #開発ツールやコンパイラなどをインストール
$ curl -sL https://rpm.nodesource.com/setup_14.x | sudo -E bash - # Node.jsをインストールするためのリポジトリの設定スクリプトをダウンロード
$ sudo yum install -y nodejs # Node.js本体をインストールするためのコマンド

$ which node # download場所を確認
┗上記で、表示されればインストール完了。

Yarnの場合

ターミナル
$ curl -sL https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo # Yarnをインストールためのリポジトリ

Yarnを環境にインストール

ターミナル
$ sudo yum -y install yarn # Yarnをインストール

Rubyのbuild作業

ターミナル
[ec2-user@ip... ~]$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
[ec2-user@ip... ~]$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
[ec2-user@ip... ~]$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
[ec2-user@ip... ~]$ source ~/.bash_profile

下記を実行。
# ruby-buildインストールしてrubyをインストール
[ec2-user@ip... ~]$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
[ec2-user@ip... ~]$ rbenv install -v 3.1.4 #とんでもなく長いです。ティーブレイクしましょう。。。。
[ec2-user@ip... ~]$ rbenv global 3.1.4
[ec2-user@ip... ~]$ rbenv rehash
[ec2-user@ip... ~]$ ruby -v
ruby 3.1.4p223 (2023-03-30 revision 957bb7cb81) [x86_64-linux]

自身のレポジトリの紐付けを行う

ターミナル
[ec2-user@ip... ~]$ ssh-keygen -t rsa

上記のコマンド実行後空エンターを押して実行する

=begin
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ec2-user/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/ec2-user/.ssh/id_rsa.
Your public key has been saved in /home/ec2-user/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:YL6LzJmOgIQh+Qcyb+1GjjRF8PMPEAjLIM590RVPHQU ec2-user@ip-10-0-1-192.ap-northeast-1.compute.internal
The key's randomart image is:
+---[RSA 2048]----+
以下、略。
+----[SHA256]-----+
=end

発行した公開鍵を取得。

cd .ssh
cat id_rsa.pub  #表示された内容をコピー

SSHキーとして登録する。
スクリーンショット 2024-01-20 19.58.27.png

Githubと連携。

EC2
[ec2-user@ip... ~]$ ssh -T git@github.com
# 下記メッセージが出たらyesを入力する
Are you sure you want to continue connecting (yes/no)? # yes

# Hi! Githubアカウント名!!が出れば完了。

アプリでの設定

database.ymlファイルで下記記述を追加する。

database.yml
default: &default
#  adapter: postgresql
#  encoding: unicode
#  username: user
#  password: pass
#  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  host: <%= Rails.application.credentials.production[:MYAPP_DATABASE_HOST] %>

production:
  <<: *default
  database: <%= Rails.application.credentials.production[:MYAPP_DATABASE_NAME] %>
  username: <%= Rails.application.credentials.production[:MYAPP_DATABASE_USERNAME] %>
  password: <%= Rails.application.credentials.production[:MYAPP_DATABASE_PASSWORD] %>

credential.ymlを開く。

開発環境のターミナル
EDITOR="vim" rails credentials:edit

credential.ymlを下記のように編集する。

credential.yml
MYAPP_DATABASE_HOST: "AWSのDBのホスト名"
MYAPP_DATABASE_NAME: "database-1"
MYAPP_DATABASE_USERNAME: "postgres"
MYAPP_DATABASE_PASSWORD: "自身で設定したpassword"

AWSのDBは下記からコピペしましょう。
スクリーンショット 2024-01-20 20.17.46.png

EC環境にpostgresのインストール

EC2
sudo yum install postgresql-libs
sudo yum install postgresql-devel

⇨psql --version 
┗psql (PostgreSQL) 12.15 のように表示されればOK

Githubソースの格納

EC2
[ec2-user@ip... ~]$ cd /
[ec2-user@ip... /]$ sudo mkdir /var/www/
[ec2-user@ip... /]$ sudo chown ec2-user /var/www/
[ec2-user@ip... /]$ cd /var/www
[ec2-user@ip... www]$ git clone クローンするレポジトリ名

config/master.keyの設定

EC2
cd /アプリ名
vim config/master.key
ローカルのmaster.keyの値を入力保存

bundle準備

EC2
[ec2-user@ip... `アプリ名`]$ gem list bundler #bundlerのver確認 

***LOCAL GEMS***

bundler (default: 2.3.17)

bundle install

EC2
[ec2-user@ip... `アプリ名`]$ gem install bundler `ローカルと同じバージョン`

[ec2-user@ip... `アプリ名`]$ bundle install

# Error時には、local環境で編集し、push後に再度pullしましょう。

下記のようなエラーが発生した場合は、記事をご参照ください。

EC2
An error occurred while installing pg (1.5.4), and Bundler cannot continue.

In Gemfile:
  pg

マイグレーション

EC2
# DBを作成
[ec2-user@ip... `アプリ名`]$ rails db:create RAILS_ENV=production
# テーブル作成
[ec2-user@ip... `アプリ名`]$ rails db:migrate RAILS_ENV=production

Nginxのインストール

負荷分散を行うために、導入します。

EC2
[ec2-user@ip... ~]$ sudo amazon-linux-extras install nginx1 #install設定。

Elastic IPアドレスをアドレスバーに打鍵し、サイトが表示されたら成功。

スクリーンショット 2024-01-21 0.06.25.png

Nginxの設定を行う。

EC2
[ec2-user@ip... ~]$ cd /etc/nginx/conf.d
[ec2-user@ip... conf.d]$ sudo vi aws-test-infra.conf

conf内の設定をする。(log管理用)

aws-test-infra.conf
error_log  /var/www/アプリ名/log/nginx.error.log;
access_log /var/www/アプリ名/log/nginx.access.log;

client_max_body_size 2G;
upstream aws-test-app {
  server unix:///var/www/アプリ名/tmp/sockets/puma.sock fail_timeout=0;
}
server {
  listen 80;
  server_name xxx.xxx.xxx.xxx; # 作成したEC2の ElasticIPアドレス。
  keepalive_timeout 5;
  root /var/www/アプリ名/public;
  try_files $uri/index.html $uri.html $uri @app;
  location @app {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://aws-test-app;
  }

  error_page 500 502 503 504 /500.html;
  location = /500.html {
      root /var/www/アプリ名/public;
  }
}

Pumaサーバを本番環境で使用できるように設定。

config/puma/production.rb
environment "production"

tmp_path = "#{File.expand_path("../../..", __FILE__)}/tmp"
bind "unix://#{tmp_path}/sockets/puma.sock"

threads 3, 3
workers 2
preload_app!

pidfile "#{tmp_path}/pids/puma.pid"
# stdout_redirect "#{tmp_path}/logs/puma.stdout.log", "#{tmp_path}/logs/puma.stderr.log", true

plugin :tmp_restart

アプリの実行。

EC2
[ec2-user@ip... ~]$ cd /var/www/アプリ名/
[ec2-user@ip... アプリ名]$ RAILS_ENV=production rails assets:precompile
[ec2-user@ip... アプリ名]$ bundle exec puma -C config/puma/production.rb -e production

Nginxのスタート

EC2(新しいターミナル)
[ec2-user@ip... アプリ名]$ sudo nginx -s stop #反映させるため、一時停止
[ec2-user@ip... アプリ名]$ sudo service nginx start #スタート

ここまできたら稼働確認します。ElasticIPを打鍵し、下記のようになれば成功です。

スクリーンショット 2024-01-20 20.23.10.png

※ 2回目以降のログインで、socketが割り当てられている場合、下記打鍵後に、立ち上げ直してください。

rm /var/www/aws_test_app/tmp/sockets/puma.sock

【Route53】

Aレコードを作成し、ElasticIPアドレスと紐付けを行います。

1.DNSの紐付けを行う
スクリーンショット 2024-01-19 19.21.30.png
2.IPアドレスを紐づける。
スクリーンショット 2024-01-19 19.26.19.png

Aレコードを作成後、しばらく待ってから立ち上げ直すとDNSでログインできるようになります。
スクリーンショット 2024-01-20 20.24.40.png

【CM】

SSH化を行うための証明書をここで発行します。
ALBを使用する場合は、無料になります。(ALBは有料ですが。。。)

1.下記のように設定。
スクリーンショット 2024-01-20 1.14.37.png

2.証明書が発行済みになるのを確認。
スクリーンショット 2024-01-19 21.00.21.png

3.「レコードの作成」をクリック。
スクリーンショット 2024-01-19 20.33.33.png

【ALB】

1.ALBのセキュリティグループを作成。
スクリーンショット 2024-01-21 0.40.23.png

2.EC2のセキュリティグループを編集。(ALB経由のみに絞る。)
スクリーンショット 2024-01-21 1.11.57.png

2.EC2からロードバランサーを選択。
スクリーンショット 2024-01-19 21.02.38.png

3.ALBを選択。
スクリーンショット 2024-01-19 21.03.55.png

3.「ALB」を作成。下記参照。
スクリーンショット 2024-01-19 21.08.15.png
スクリーンショット 2024-01-19 21.09.28.png
スクリーンショット 2024-01-21 0.47.53.png
スクリーンショット 2024-01-19 21.56.17.png

【ALBとRoute53の紐付け】


1.先ほど、ElasticIPアドレスで作成したレコードを変更します。
スクリーンショット 2024-01-21 0.23.55.png

立ち上げ直してSSH化できていれば問題なしです!!(証明書も問題ないですね!)
スクリーンショット 2024-01-21 0.27.41.png

【WAFv2の設定】

DNSでは、ログインできましたが、IPアドレス直打ちの場合、http通信のままになります。
そのため、下記で、regexのパターンマッチで対策しましょう。

(本記事では割愛させていただきます。)

【終わりに】


ここまで読んでくださり、ありがとうございました。
AWSでのデプロイを通して、様々な周辺知識が身についたと思います。
AWSの無料期間内で経験したいと思い、本記事を作成しながらハンズオンしました。
データ分析など突き詰めればいろんなことができそうですが、個人開発レベルではこの記事レベルのことを押さえておけばいいいかな〜と思います。(CloudFontはふれたかったですが。。。)

また、注意でも触れたのですが、今回使用したものはお片付けしておきましょう。

使用していなくても、課金されてしまいます!!

関連付けなど解除しながら丁寧にお片付けして下さい。
(※VPCなど課金されないものもありますが、不安な方は全て削除しておきましょう。)

【引用】


45
52
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
45
52

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?