本記事で学べること
本記事は「AWSの環境構築で学ぶトラブルシューティング」シリーズの第2回目となっています。
本シリーズは、実際に手を動かしながらWSの環境構築とその過程でトラブルが起こった場合の対処方法や問題の特定方法などを体系的に学べる内容になっています。また、トラブルシューティングのセクションでは、遭遇した問題の問題の特定方法や解決方法について解説します。
今回は、一般的なWeb3層アーキテクチャのDB層の環境を構築します。外部からのネットワークを遮断した安全な環境を作成する方法を学習します。
「AWSの環境構築で学ぶトラブルシューティング」シリーズはこちら
https://envader.plus/article/259
環境構築のゴール
本記事における、環境構築のゴールを以下の図にまとめました。プライベートサブネットに配置したインスタンスでMySQLをインストールすることがゴールです。
環境構築
現時点の環境は、以下の図のようになっており、こちらに追加する形で環境を構築します。
現時点までの環境構築に関しては、Part 1の以下の記事をご参照ください。
【Part 1】**AWSの環境構築で学ぶトラブルシューティング**【VPC Peering】 **の記事**
キーペアの作成
DBは顧客情報などを含む様々な情報を扱いますので、外部からアクセスされないようにする必要があります。そのため、DBはプライベートサブネットに配置し、パブリックIPの割り当てを行わないようにします。
サーバーがパブリックIPを持っていない場合、通常ローカルからアクセスすることができません。しかし、インスタンスをDBとして設定するために、そのインスタンスにアクセスする必要があります。
ではどうするかというと、いくつか方法はありますが、今回は同VPC内のパブリックIPを持つインスタンスを介してパブリックIPを持たないインスタンスにアクセスする方法を取ります。パブリックIPを持たないインスタンスにアクセスするために利用されるもののことは踏み台と呼ばれます。
踏み台のインスタンスからプライベートサブネットに配置するインスタンスに接続するためのSSHキーを作成します。
-
SSHキーの作成
踏み台となる
1-ec2-public
にSSH接続後、SSHキーを作成します。$ ssh-keygen -t ed25519 ... The key's randomart image is: +--[ED25519 256]--+ | ...o=| | . ==| | + + X| | . + + O.| | o E .S . * *o.| | o . = . + * o+| | o + + . .+ | |. ..o+. . o .| | +==+ . | +----[SHA256]-----+
-
公開鍵の値をコピーする
まず、作成した公開鍵の値をクリップボードにコピーします。
$ ls ~/.ssh authorized_keys id_ed25519 id_ed25519.pub $ cat ~/.ssh/id_ed25519.pub # 出力された値をコピー
-
公開鍵をインポートする
AWSマネージメントコンソールから、キーペアセクションにいき、キーペアをインポートします。
設定項目 入力/選択項目 名前 networking-key キーペアファイル id_ed25519.pubの値を貼り付ける
プライベートサブネットにインスタンスを作成
networking-1-vpc
のプライベートサブネットに設置するインスタンスを作成します。このインスタンスがDBとして構築するインスタンスです。
設定項目 | 入力/選択項目 |
---|---|
名前 | networking-1-ec2-private(任意) |
AMI | Ubuntu Server 22.04 LTS |
インスタンスタイプ | t2.micro |
キーペア | networking-key |
VPC | networking-1-vpc |
サブネット | private1(privateのいずれかを任意) |
パブリックIPの自動割り当て | 無効化 |
セキュリティグループ | networking-1-sg |
使用する環境の情報
以後の説明で出てくる環境の情報を以下にまとめました。
インスタンス名 | 呼称 | パブリックIPアドレス | プライベートIPアドレス |
---|---|---|---|
networking-1-ec2-public | 1-ec2-public | 3.113.16.83 | 10.0.14.48 |
networking-1-ec2-private | 1-ec2-private | - | 10.0.132.166 |
以後の説明では、networking-1-ec2-public
は1-ec2-public
、networking-1-ec2-private
は1-ec2-private
と簡略化して呼称します。
作成したインスタンスにMySQLをインストールする
作成したインスタンスにMySQLをインストールします。手順として、踏み台からプライベートサブネットに配置したインスタンスにSSH接続してから、MySQLをインストールします。
-
1-ec2-public
から1-ec2-private
にSSH接続する1-ec2-public
にSSH接続している状態から以下のコマンドを叩きます。$ ssh ubuntu@10.0.132.166 ... ubuntu@ip-10-0-132-166:~$ # 1-ec2-privateにSSH接続できていることを確認する # `inet 10.0.132.166/20`から、1-ec2-privateに接続できていることが確認できます ubuntu@ip-10-0-132-166:~$ ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc fq_codel state UP group default qlen 1000 link/ether 06:6d:41:36:f9:b9 brd ff:ff:ff:ff:ff:ff inet 10.0.132.166/20 metric 100 brd 10.0.143.255 scope global dynamic eth0 valid_lft 3403sec preferred_lft 3403sec inet6 fe80::46d:41ff:fe36:f9b9/64 scope link valid_lft forever preferred_lft forever
-
MySQLをインストールする
まず、最新のMySQLをインストールするために、パッケージをアップデートします。
ubuntu@ip-10-0-132-166:~$ sudo apt update ... W: Failed to fetch http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu/dists/jammy/InRelease Could not connect to ap-northeast-1.ec2.archive.ubuntu.com:80 (35.74.21.248), connection timed out Could not connect to ap-northeast-1.ec2.archive.ubuntu.com:80 (54.199.234.19), connection timed out Could not connect to ap-northeast-1.ec2.archive.ubuntu.com:80 (13.231.188.197), connection timed out Could not connect to ap-northeast-1.ec2.archive.ubuntu.com:80 (18.179.24.57), connection timed out Could not connect to ap-northeast-1.ec2.archive.ubuntu.com:80 (18.182.10.247), connection timed out Could not connect to ap-northeast-1.ec2.archive.ubuntu.com:80 (18.183.160.212), connection timed out ...
Failed…
と出力され、パッケージがアップデートできませんでした。
トラブルシューティング
sudo apt update
コマンドを実行した際に接続できないというエラーメッセージが表示される場合、主に以下のような原因が考えられます。
- リポジトリサーバーのダウン
- ネットワーク接続の問題
この2つ以外にも問題がある場合も考えられますが、まず上記の2つの問題に的を絞り、順を追って確認し、問題を特定していきます。
リポジトリサーバーのダウン
パッケージのアップデートが失敗したログで出力されたhttp://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu/dists/jammy/InRelease
に対し、1-ec2-public
からping
を送り、リポジトリサーバーがダウンしているかどうかを確認します。
-
pingを送る
ping
コマンドはドメイン名またはIPアドレスに対して使用されますが、URL全体に対しては使用できません。したがって、http://
とパス部分を取り除いて、ドメイン名のみをping
する必要があります。以下のようにping
を実行します。$ ping -c 10 ap-northeast-1.ec2.archive.ubuntu.com PING ap-northeast-1.ec2.archive.ubuntu.com (18.179.24.57) 56(84) bytes of data. 64 bytes from ec2-18-179-24-57.ap-northeast-1.compute.amazonaws.com (18.179.24.57): icmp_seq=1 ttl=63 time=1.75 ms 64 bytes from ec2-18-179-24-57.ap-northeast-1.compute.amazonaws.com (18.179.24.57): icmp_seq=2 ttl=63 time=1.83 ms 64 bytes from ec2-18-179-24-57.ap-northeast-1.compute.amazonaws.com (18.179.24.57): icmp_seq=3 ttl=63 time=1.82 ms 64 bytes from ec2-18-179-24-57.ap-northeast-1.compute.amazonaws.com (18.179.24.57): icmp_seq=4 ttl=63 time=1.82 ms 64 bytes from ec2-18-179-24-57.ap-northeast-1.compute.amazonaws.com (18.179.24.57): icmp_seq=5 ttl=63 time=1.85 ms 64 bytes from ec2-18-179-24-57.ap-northeast-1.compute.amazonaws.com (18.179.24.57): icmp_seq=6 ttl=63 time=1.76 ms 64 bytes from ec2-18-179-24-57.ap-northeast-1.compute.amazonaws.com (18.179.24.57): icmp_seq=7 ttl=63 time=1.81 ms 64 bytes from ec2-18-179-24-57.ap-northeast-1.compute.amazonaws.com (18.179.24.57): icmp_seq=8 ttl=63 time=1.88 ms 64 bytes from ec2-18-179-24-57.ap-northeast-1.compute.amazonaws.com (18.179.24.57): icmp_seq=9 ttl=63 time=1.85 ms 64 bytes from ec2-18-179-24-57.ap-northeast-1.compute.amazonaws.com (18.179.24.57): icmp_seq=10 ttl=63 time=2.60 ms --- ap-northeast-1.ec2.archive.ubuntu.com ping statistics --- 10 packets transmitted, 10 received, 0% packet loss, time 9012ms rtt min/avg/max/mdev = 1.745/1.897/2.601/0.237 ms
-c
オプションを使用するとpingを送る回数を指定できます。リポジトリサーバーへの
ping
は全て応答があり、パケットロスもありません。この結果から、リポジトリサーバーがダウンしているわけではないことが確認できました。
ネットワーク接続の問題
次に、ネットワーク接続の問題を確認します。1-ec2-private
のネットワーク接続をテストするために、8.8.8.8
というIPアドレスに対してpingを送ります。
8.8.8.8
というIPアドレスはGoogleのパブリックIPアドレスで、世界中でアクセス可能な公開DNSサーバーのIPアドレスです。信頼性の高さや高速で応答すること、8.8.8.8
という覚えやすい数字の並びであることから多くのユーザーと技術者がネットワークの問題を診断する際に8.8.8.8
を使用しています。これが一種の非公式な標準となっています。そのため、8.8.8.8
のIPアドレスは、ネットワークのテストやトラブルシューティングでよく使用されます。
-
1-ec2-privateから8.8.8.8に対してpingを送る
1-ec2-private
にSSH接続し、以下のコマンドを実行します。
ubuntu@ip-10-0-132-166:~$ ping -c 10 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
--- 8.8.8.8 ping statistics ---
10 packets transmitted, 0 received, 100% packet loss, time 9219ms
ping
の結果、送った全てのping
の応答はなく、100%のパケットロスが発生しました。つまり、1-ec2-private
のネットワーク接続に問題があると、問題を特定することができました。
トラブルシューティングの結果
ここまでのトラブルシューティングで、以下の図のように問題のある箇所を特定することができました。1-ec2-private
からリポジトリへの通信が上手く行っていない状態です。
実際の原因は、このセクションの最初に説明した通り、1-ec2-private
がパブリックIPを持っていないことによるものです。そのため、1-ec2-private
がインターネットに接続できるようにする必要があります。
NAT Gateway
NAT(Network Address Translation)は、プライベートネットワークのIPアドレスを公開インターネットのIPアドレスに変換する技術です。NATに関しての詳細は、以下の記事をご参照ください。
https://envader.plus/article/15
-
問題点の整理
現在の問題を整理します。プライベートサブネットに配置したインスタンスはDBサーバーとして運用したいのでMySQLなどをインストールしたいです。しかし、パブリックIPを持っていないのでインターネットを使用できません。
しかし、パブリックIPを割り当てれば良いか、というとそうではありません。パブリックIPを割り当てるとそのインスタンスはインターネットから直接アクセスされ、情報が漏洩する恐れがあります。
では、どうするかというと、今回はAWSのサービスのNAT Gatewayを使用します。
NAT Gatewayの機能により、外部からはプライベートネットワーク内のインスタンスからのトラフィックはNAT GatewayのIPアドレスから来ているように見えます。これにより、内部リソースのプライベートIPアドレスは外部に公開されず、安全にインターネットと通信できるようになります。
-
NAT Gatewayの作成
※NAT Gatewayの利用は1時間当たり0.045USD(1USD = 151.323 JPY)がかかります。利用後は削除することをおすすめします。
設定項目 選択入力/選択項目 名前 networking-1-natgw サブネット networking-1-subnetのpublic1 接続タイプ パブリック ElasticIPの割り当て クリックし、割り当てる -
ルーティングの設定
1-ec2-private
に紐付いているサブネット情報から、ルートテーブルページにいき、ルートを追加します。設定項目 入力/選択項目 送信先 0.0.0.0/0 ターゲット NAT ゲートウェイ → networking-1-natgw 既に設定されている以外のその他の通信はNAT Gateway宛に通信を送るようにします。
MySQLのインストール
1-ec2-private
からのインターネット接続の通信をNAT Gateway宛に送るように設定したので、再度1-ec2-private
にMySQLのインストールを試します。
# 1-ec2-publicにSSH接続した状態です
$ ssh ubuntu@10.0.132.166
ubuntu@ip-10-0-132-166:~$ sudo apt update
...
Fetched 28.2 MB in 5s (5934 kB/s)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
42 packages can be upgraded. Run 'apt list --upgradable' to see them.
パッケージのアップデートが問題なく完了しました。続いてMySQLをインストールします。
ubuntu@ip-10-0-132-166:~$ sudo apt install mysql-server -y
...
ubuntu@ip-10-0-132-166:~$ mysql --version
mysql Ver 8.0.35-0ubuntu0.22.04.1 for Linux on x86_64 ((Ubuntu))
正常にインストールが完了した場合、MySQLのバージョンの情報が確認できます。
本記事の片付け
NAT Gatewayは放置すると料金がかかりますので、削除の手順についても解説します。また、プライベートサブネットに配置したインスタンスも削除します。削除する場合は、以下の手順に沿って行ってください。
-
NAT Gatewayの削除
1-ec2-private
に紐付いているサブネット情報から、ルートテーブルページにいき、追加したルートを削除します。- NAT Gatewayのページにいき、作成したNAT Gatewayを削除します。
- Elastic IPのページにいき、NAT Gatewayに割り当てしたElastic IPを解放します。解放しないと料金がかかりますのでご注意ください。
-
networking-1-ec2-privateの削除
EC2のページからインスタンスで
networking-1-ec2-private
を選び、インスタンスの状態 → 終了を選択します。終了とは削除のことです。
まとめ
今回は前シリーズで学んだネットワーク通信コマンドを利用し、問題の特定を行うことができました。
ping
はネットワークのトラブルシューティングにはよく使用します。また、記事中で紹介したGoogleの8.8.8.8
のIPアドレスはネットワークに関するトラブルシューティングで利用する機会が多いです。ping
と合わせて押さえておきましょう。
引き続き本シリーズを学習していただき、トラブルシューティングのレベルを上げていきましょう。
【番外編】USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
プログラミング塾に半年通えば、一人前になれると思っているあなた。それ、勘違いですよ。「なぜ間違いなの?」「正しい勉強法とは何なの?」ITを学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。
「フリーランスエンジニア」
近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。
「成功する人とそうでない人の違いは何か?」
私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。
比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。
多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、
エンベーダー編集部
エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。
関連記事
2020.02.25
完全未経験からエンジニアを目指す爆速勉強法
USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
- キャリア・学習法
- エンジニア
2022.12.30
【AWS】Amazon S3イベント通知の活用法
S3バケットで特定のイベントが発生したときにAWSの他のサービスに通知することが出来ます。
- AWS
2024.08.01
ECSのデプロイ戦略を比較 ブルー/グリーンとローリングアップデート
デプロイメント戦略は、アプリケーションの更新をスムーズかつ安全に行うための重要な手段です。適切な戦略を選ぶことで、ダウンタイムを最小限に抑え、ユーザーへの影響を軽減できます。本記事では、ECSで利用可能な2つの主要なデプロイメント戦略、ブルー/グリーンデプロイメントとローリングアップデートについて解説します。
- AWS
2024.07.23
【Terraformハンズオン】ECS Fargateでアプリケーションデプロイを実践してみよう
ECSでは、Dockerコンテナが実行されている1つ以上のEC2インスタンスを「クラスタ」と呼ばれる単位で扱います。 そのクラスタは、「EC2起動型」と「Fargate」から選択することができ、今回の記事ではFargateをTerraformで構築する手順を解説します。
- AWS