はじめに
今回はEC2を利用してRailsアプリをAWSにデプロイするということをやっていきます。
僕も本記事を書き起こすまではAWSやインフラという言葉に怯えながら学習をしていました・・・😅
また、今回書くにあたってさまざまな記事を拝見させていただきましたが、どれもAWSのバージョン違いにより操作がしにくかったりと難点がありました。
そこで自分が最新版のAWSを使った記事を書くことで、インフラ環境を構築するのに苦戦している初学者の方を助けられのではないかと考えました。
AWSとは
AWSとは、Amazon Web Servicesの略で、Amazon.comが提供しているクラウドコンピューティングプラットフォームです。AWSは、企業や個人がインターネット経由でコンピューティングリソースやサービスを利用できるようにすることで、柔軟性、拡張性、信頼性を提供しています。
まあ要するに自分のウェブサイトを公開したい場合、AWSのサービスを使えばウェブサーバーを簡単に立ち上げることができ、また大量のデータを保存したい場合は、AWSのストレージサービスを利用することができるってことですね。
詳しくは公式をご参照ください!
周辺環境の構築について
VPC
それでは周辺環境を構築していきます。
まずはVPCについてです。VPCは、Virtual Private Cloudの略でAWSが提供する仮想ネットワーキング環境のことです。
これは自分の土地のようなものでこの中にサーバーやデータベースなどを作成していきます。
それでは作成していきます。
サービスのところからVPCを検索し選択します。
その後、VPCを作成というボタンが出てくるのでそこをクリックします。
VPC作成をクリックすると以下のようなページに切り替わります。
今回は以下のように入力していきます。
環境構築するにあたって見慣れない単語が出てくると思うのでそれについても解説していきます。
-
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ネットワークをより小さなセグメントに分割するための手法です。
要するにネットワークのことです。グループを外部通信用や内部通信用というふうに分けることができ、機能をそれぞれ整備しています。
それでは作成していきます。
まずはサブネットのページで移動してください。
その後サブネットを作成をクリックします。
そうしましたら、先ほど作成したVPCを選択してください。
その後新しく詳細画面が表示されると思うので以下のように入力してください。
ここで一度出てきた用語について解説していきます。
-
アベイラビリティゾーン(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の範囲)です。
- test_1a: CIDRブロック 10.0.1.0/24 :
インターネットゲートウェイ
続いてインターネットゲートウェイを作成していきます。インターネットゲートウェイ(Internet Gateway)は、AWS(におけるネットワークサービスの一つです。インターネットゲートウェイは、VPC内のプライベートなリソースがインターネットと通信するための接続ポイントです。
要するに窓口の役割を果たしており、通信が外のパブリック空間へ出ていくためにはここを通過しないといけません。
そしたらインターネットゲートウェイのページに移動して作成をクリックします。
その後名前を設定していきます。
今回は以下の画像のようにします。
無事作成されているか確認し、VPCとの紐付けを行なっていきます。
先ほど作成したVPCと紐付けを行い、ゲートウェイとアタッチさせましょう。
そしたらVPCにアタッチを選択します。
その後に以下のようなページに移動します。
そしたら先ほど作成したVPCを選択し、アタッチをクリックします。
紐付けが完了し無事にインターネットゲートウェイの作成も完了しました!
ルートテーブル
次にルートテーブルを作成していきます。
ルートテーブル(Route Table)は、ネットワーク上でデータパケットの転送を制御するために使用されるテーブルです。ルートテーブルはネットワークデバイス(ルーターやスイッチ)や仮想ネットワーキング環境(VPCやサブネット)に関連付けられており、送信元IPアドレスに基づいてデータパケットを正しい宛先に転送するためのルールを定義します。
要約すると通信のルールブックでサブネット内の通信がどこに送られて欲しいかを設定するものです。
今回は、先ほど作成したインターネットゲートウェイを通るように設定したルートテーブルを作成し、それをサブネットと紐付けしていきたいと思います。
まずはルートテーブルの画面に移動します。
その後いつものように作成のところをクリックします。
そしたらルートテーブルの名前を画像のように設定し、先ほど作成したVPCと紐付けしていき、作成をクリックします。
ひとまずルートテーブルの作成は終わりましたね・・・
しかし、まだインターネットゲートウェイを通過するようには設定できていないので、このまま設定を進めていきます。
作成したルートテーブルの下にあるルートの編集ボタンをクリックします。
そうすると以下のようなページに移動すると思います。
今回は先ほど作成したインターネットゲートウェイを通過して欲しいので以下のように設定します。
次にサブネットと紐付けしていきます。
サブネットの関連付けに移動し、編集ボタンをクリックします。
そうするとすでに作成したサブネットが2つ表示されると思うので、それらを選択し保存をクリックします。
これでルートテーブルとサブネットの紐付けは完了です。
まだまだ続きますが、ひとまずはお疲れ様でした。笑
セキュリティグループ
セキュリティグループ(Security Group)は、AWSの仮想ネットワーキング環境(VPCやEC2インスタンスなど)において、ネットワークトラフィックの制御とセキュリティの設定を行うための仕組みです。セキュリティグループはファイアウォールの役割を果たし、インバウンド(入力)およびアウトバウンド(出力)トラフィックを制御するためのルールを定義します。
要するにグループごとのルール設定のことです。
また、詳しい図の説明についてはこちらを参照してください。
今回、作成するEC2サーバ-は一般のユーザーがインターネットで閲覧できる通信と、開発者がSSH接続でログインするという2つの通信を許可する必要があります。
また、RDSデータベースはEC2サーバーの通信許可が必要です。
以上の条件を踏まえて具体的な設定を進めていきましょう!
まずはセキュリティグループを選択し、作成ボタンをクリックします。
次のページに移動したら、http用、production用、ssh用の3つのセキュリティグループを作成します。
次にルールを設定していきます。
まずはhttp用のものから設定していきます。
画像の通り、インバウンドのルールを編集をクリックしてください。
同様にproduction、sshのセキュリティグループも設定していきます。
これでセキュリティグループの登録が完了しました!
次からインスナンスの作成に移っていきます。頑張りましょう🔥
また、セキュリティグループのルール設定にて出てきた用語について少し解説します。
-
タイプは通信受け入れの設定でこの方の通信が来たら受け入れるといったような設定かできる。
-
プロトコルは、コンピュータや通信ネットワークなどのシステムでデータの交換や通信を行うための規約や手順のセットです。プロトコルは、データの送受信方法、メッセージのフォーマット、エラー処理、認証手順などの通信に関するルールや手順を定義します。
- タイプhttp、httpsを選択すると、プロコトルは自動でTCPが選択される
- TCPとは、相手に通信がしっかり届いていることを保証してくれる通信方式のこと
-
ポート番号は、ネットワーク通信において特定のアプリケーションやサービスが識別されるために使用される番号です。ネットワーク上のデータパケットは、送信元と宛先のIPアドレスに加えて、ポート番号によって特定のプロセスやサービスにルーティングされます。簡単にいうとマンションやアパートの部屋番号のようなものです。
-
ソースとは、どんなIPアドレスであれば通信を許可するか指定するもの。ここでいう0.0.0.0/0はすべてのIPアドレスを指定しています。
インスタンスの作成について
RDS
RDS(Relational Database Service)は、AWSが提供する、クラウドベースのリレーショナルデータベースサービスです。
RDSは、データベースのセットアップ、管理、パッチ適用、バックアップ、リストアなどのタスクを自動化します。
早速作成していきましょう!
それではRDSの作成画面に移動してください。
その後、データベースの作成を選択します。
画面が移動したらエンジンのオプションを選択していきましょう。
今回デプロイする予定のアプリがMySqlを使用しているのでそちらを選択しました。
次にテンプレートですが、今回は無料利用枠を使用して作成していきます。
設定ですが、こちらはすべてtestとします。
パスワードは忘れないようにしてください。
インスタンスサイズはt2.microという無料枠で使用可能なサイズを選択しました。
インスタンスサイズについての詳しい詳細はこちらの記事を参考にしてください。
ストレージは最小の構成で選択しています。
運用していく中で容量を調整してください。
接続はどのVPC、サブネットグループ、セキュリティグループを使用するかを設定していきます。
また今回はセキュリティグループとしてtest_prductionを選択しました。以前productionはグループに所属しているものの全てのアクセス許可をするよう設定しましたね。
ですので、今回作成したRDSをproductionのグループに所属させることによって、同じproductionに属しているものからしアクセスできない、つまり、EC2サーバーからのアクセスしか許可しないといった設定にすることができるのです!
データベース認証はRDSにログインするための認証方法の設定をします。
今回はパスワード認証を選択していきます。
そうしましたら作成ボタンをクリックしてください。
ステータスの欄が利用可能になっていれば成功です。
そしたら一度、RDSの作成時に出てきた用語について解説していきます。
-
マルチAZ(Multi-AZ)は、AWSのAmazon RDS(Relational Database Service)におけるデータベースの冗長性を高める機能です。通常、Amazon RDSではデータベースを単一のアベイラビリティーゾーン(AZ)に配置します。しかし、マルチAZを有効にすると、データベースが同期的に別のアベイラビリティーゾーンにも複製されます。
要するに災害などが起こった際に片方の物理マシンがダメージを受けてサービスの提供に支障が出ても、もう一方の物理マシンが無事ならそのままサービスを継続して提供することができるということ。
EC2
いよいよコアであるEC2についての設定をしていきます。
EC2(Elastic Compute Cloud)は、AWSのクラウドコンピューティングサービスのひとつです。
EC2は仮想サーバー(インスタンス)を提供し、ユーザーはこの仮想サーバー上でアプリケーションを実行することができます。
サーバーというのはパソコンという認識でも大丈夫です。
つまりEC2を作成する=クラウド上に自分専用のパソコンを作成するということです。
作成手順ですが、まずはトップ画面からEC2に移動し、インスタンスを選択します。その後、インスタンスの起動をクリックします。
まずはタグを設定します。
インスタンスを認識しやすくするために、testとしておきましょう。
次はマシンイメージですね。
AMI(Amazon Machine Image)は、Amazon Web Services(AWS)のElastic Compute Cloud(EC2)で使用される仮想マシンイメージのことです。
AMIは、EC2インスタンスを起動するためのテンプレートとして機能します。AMIには、オペレーティングシステム(Windows、Linuxなど)や事前インストールされたアプリケーション、設定などのイメージが含まれています。
つまり今から作成するパソコンのタイプを選択するということです。
今回はAmazon Linux2 AMIを選択します。
インスタンスのタイプは練習用の無料枠であるt2.microプランを選択します。
慣れていない場合、できるだけお金をかからないものを選択しましょう。
次にキーペアの設定です。
キーペアは、AWSのサービスであるEC2において、インスタンスへの安全なリモートアクセスを確保するための認証手段です。キーペアは公開鍵暗号方式を使用しており、インスタンスへのログインや暗号化された通信を行うために重要です。
つまり、SSHの接続を行う際にどの鍵を使用するのかといった選択のことで、このキーペアが外部へ漏れてしまうとセキュリティがガバリます。笑
次にネットワークの設定です。
VPCやサブネットは先ほど作成したものを選択します。
セキュリティグループ設定も同様に先ほど作成した3つのセキュリティグループを選択します。
今作成しているEC2はインターネット経由での不特定多数アクセス(http, https)、SSH経由での開発者アクセス(ssh)という二つの外部アクセスに加え、データベースとの通信(production)という限られた相手との通信も想定されているのでそれぞれの通信に許可を出します。
有料の記事にはなりますが、詳しくはこちらを参考にしてください。大変勉強になりました。
その他詳細については以下のように設定しました。
自動的割り当てパブリックIP: 無し
キャパシティの予約: 開く
シャットダウン動作: 停止
テナンシー: 共有
その他変更なし
それでは作成ボタンを押してみましょう。
以下のようになっていれば問題なく使用できる状態です。
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を設定していきましょう。
いつものように設定画面まで移動します。
すでに必要な設定がされているのでそのまま割り当てボタンをクリックします。
そして追加されたELastic IPと先ほど作成したEC2を関連づけていきます。
EC2の画面へ移動して、取得したIPアドレスがEC2インスタンスのELastic IPと紐付けされていれば完了です。
これでRDSとEC2の作成及び設定作業は終了です!
色々と慣れないことばかりで疲弊しますね・・・笑
次からはEC2内の環境を整えていくところが中心になっていくのでターミナルでの作業に移ります。
頑張っていきましょう!
EC2内の環境設定
キーペアの移動
先ほど作成したキーペアを適切なディレクトリへ配置し直す必要があります。
SSHログインができませんので・・・
そうしましたらダウンロードディレクトリから~/.sshディレクトリに移動させましょう
% mv ~/Downloads/test_keypair.pem ~/.ssh
その後.sshディレクトリに移動して次のコマンドを実行します。
% cd ~/.ssh
その後lsコマンドでキーペアが存在するか確認します。
% ls
test_keypair.pem
きちんと確認できました!
これで完了です。
SSH接続
SSH接続(Secure Shell)では、クライアントとサーバー間の通信が暗号化され、データの盗聴や改ざんから保護されます。これにより、安全なリモートアクセスやファイル転送、コマンド実行などの操作が可能になります。
先ほど作成したEC2インスタンスを確認すると、接続というボタンがあることがわかります。
ここをクリックするとSSH接続に関する詳細を確認できます。
SSHクライアントを選択すると接続用のコマンドが表示されます。
このコマンドは、
% ssh ログインユーザ名@ログインホスト
というSSHのログインコマンドに、「鍵はこれを使用しますよ」ということを明示的に指定するための-iオプションが付与された形となります。
それではコマンドを実行してみます!
% 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を使用して訳してもらいます。
ホスト「54.199.161.0 (54.199.161.0)」の信頼性を確立できません。
ED25519キーのフィンガープリントはSHA256:1npPBa9wmza1gU3li8j/muYgEiHhLXcSlGr1VKonyZsです。
この鍵は他の名前では知られていません。
本当に接続を続行しますか(はい/いいえ/[指紋])?
まあ要するにこの接続は初めてですが信用できますか?みたいなことを言ってるわけですね。
yesを入力してENTERキーを押しましょう!
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ディレクトリで実行してください。
% 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コマンドを使用します。
% chmod 600 test_keypair.pem
chmod 600 test_keypair.pem
は、test_keypair.pem
というファイルのパーミッションを設定するためのコマンドです。
具体的には、600
はオクテット表記であり、所有者に読み取りと書き込みの権限を与え、グループやその他のユーザーには権限を与えないという意味です。
具体的なパーミッションは次の通りです:
- 所有者: 読み取り(4) + 書き込み(2)+ 実行(1) = 6
- グループ: 権限なし
- その他のユーザー: 権限なし
したがって、このコマンドを実行すると、test_keypair.pem
ファイルの所有者には読み取りと書き込みの権限が与えられ、グループとその他のユーザーには何の権限も与えられません。
では、変更されたか確認していきます。
% ls -al
-rw------- 1 asone0420 staff 1674 6 30 11:17 test_keypair.pem
きちんと変更されていますね。
再度SSH接続してみましょう。
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という名前のユーザーを作成していきましょう。
[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 で保存&編集完了
編集が完了したら以下のコマンドを入力してください。
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ディレクトリに鍵を作成していきたいので、
% 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つのファイルが作成されます。
確認してみましょう。
asone0420 % ls
id_rsa.pub id_rsa test_keypair.pem
きちんと作成されていますね。
それぞれ、「.pub」がついている方が公開鍵、ついていない方が秘密鍵です。
次はリモートで公開鍵を登録していきましょう。
公開鍵の中身は以下のように確認します。
% cd ~/.ssh
% cat id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EA・・・
確認したものはコピーしておきます。
そしたらEC2サーバ内にtestユーザーとしてログインします。
そして以下の手順で公開鍵の中身を登録していきます。
[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回目以降の接続で入力の手間を省けるので大変便利です。
頑張って設定していきましょう!
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が指定されています。
これらを記載することによって、ログイン時は
% 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を削除しましょう。
[test@ip-10-0-1-202 ~]$ sudo userdel -r ec2-user
パッケージのインストール
それではデプロイに必要な環境を整えていきます。
RailsアプリをEC2インスタンス内で動くようにしなければならないので、管理ツールを使って環境構築していきましょう!
それでは根幹になるパッケージをダウンロードしたいので以下のコマンドを実行してください。
sudo yum
はyumコマンドを使用してパッケージをインストールするためのコマンドです。
また、コマンドの改行(\)は継続行を表すためのものです。
[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をインストールします。
[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の設定を追加し、設定を反映させるためのものです。以下にそれぞれのコマンドの目的と効果を説明します:
-
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
:~/.bash_profile
ファイルに、rbenvの実行ファイルへのパスを追加する設定を追記します。これにより、rbenvのコマンドを実行するために必要なパスが環境変数に追加されます。 -
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
:~/.bash_profile
ファイルに、rbenvの初期化スクリプトを実行する設定を追記します。これにより、rbenvが正しく初期化され、シェルでrbenvを使用できるようになります。 -
source .bash_profile
:.bash_profile
ファイルの変更を現在のシェルセッションに反映させます。source
コマンドは、指定されたスクリプトを現在のシェルで実行するために使用されます。ここでは、.bash_profile
ファイルの変更を読み込み、設定を有効にします。
これらのコマンドを実行することで、rbenvの設定が~/.bash_profile
に追加され、現在のシェルセッションでrbenvが利用可能になります。これにより、rbenvを使用してRubyのバージョンを管理することができるようになります。
そしたらruby-buildもインストールしましょう。
[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をインストールしていきましょう。
[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という表示が返ってくれば成功です!
うまくいかない場合はこちらを参照してください。
Nodejsのインストール
Node.jsは、サーバーサイドでJavaScriptを実行するためのオープンソースのランタイム環境です。JavaScriptは通常、Webブラウザでクライアントサイドのスクリプトとして実行されますが、Node.jsを使用することで、サーバーサイドのアプリケーションやスクリプトをJavaScriptで開発することができます。
今回は、ver15系をインストールしていきましょう。
nvm
のインストールスクリプトをダウンロードします。
[test@ip-10-0-1-202 ~] $ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash
インストールスクリプトを実行すると、nvm
がインストールされます。ターミナルを再起動するか、以下のコマンドを実行してnvmを有効化します。
[test@ip-10-0-1-202 ~] $ source ~/.bashrc
再度、以下のコマンドを実行してみてください。
[test@ip-10-0-1-202 ~] $ nvm --version
nvm
のバージョンが表示されれば、正しくインストールされています。
その後、以下のコマンドでNode.jsのバージョン15.14.0をインストールします。
[test@ip-10-0-1-202 ~] $ nvm install 15.14.0
インストールが完了したら、以下のコマンドを実行してNode.jsのバージョンを確認してください。
[test@ip-10-0-1-202 ~]$ node -v
v15.14.0
バージョンが表示されれば、Node.jsのインストールが正常に完了しています。
もしエラーが出てしまう場合は、公式ドキュメントを参照してください。
yarnのインストール
Yarnは、JavaScriptのパッケージマネージャーです。Node.jsプロジェクトで使用され、依存関係の管理やパッケージのインストール、ビルドプロセスの管理などを行います。
まずはyarnのレポジトリ追加です。
[test@ip-10-0-1-202 ~] $ curl -sL https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo
yarn本体をインストールします。
[test@ip-10-0-1-202 ~] $ sudo yum -y install yarn
yarnのバージョンが表示されれば完了です。
[test@ip-10-0-1-202 ~] $ yarn -v
1.22.19
これで無事にEC2内の必要な環境設定が終わりましたね。
おわりに
だいぶきつい前半戦でしたね。ほんと長かった・・・
次回はGithubからデプロイするのとWeb・アプリケーションサーバーの設定を中心に行なっていきます。
頑張りましょう!
引用文献