1. ホーム
  2. 記事一覧
  3. 【Part 2/4】AWSの環境構築で学ぶトラブルシューティング【NAT Gateway】

2023.11.21

【Part 2/4】AWSの環境構築で学ぶトラブルシューティング【NAT Gateway】

本記事で学べること

本記事は「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(任意)
AMIUbuntu Server 22.04 LTS
インスタンスタイプt2.micro
キーペアnetworking-key
VPCnetworking-1-vpc
サブネットprivate1(privateのいずれかを任意)
パブリックIPの自動割り当て無効化
セキュリティグループnetworking-1-sg

使用する環境の情報

以後の説明で出てくる環境の情報を以下にまとめました。

インスタンス名呼称パブリックIPアドレスプライベートIPアドレス
networking-1-ec2-public1-ec2-public3.113.16.8310.0.14.48
networking-1-ec2-private1-ec2-private-10.0.132.166

以後の説明では、networking-1-ec2-public1-ec2-publicnetworking-1-ec2-private1-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 コマンドを実行した際に接続できないというエラーメッセージが表示される場合、主に以下のような原因が考えられます。

  1. リポジトリサーバーのダウン
  2. ネットワーク接続の問題

この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

NATNetwork 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. 1-ec2-privateに紐付いているサブネット情報から、ルートテーブルページにいき、追加したルートを削除します。
    2. NAT Gatewayのページにいき、作成したNAT Gatewayを削除します。
    3. 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未経験者必見 USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話

プログラミング塾に半年通えば、一人前になれると思っているあなた。それ、勘違いですよ。「なぜ間違いなの?」「正しい勉強法とは何なの?」ITを学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。

「フリーランスエンジニア」

近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。

「成功する人とそうでない人の違いは何か?」

私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。

比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。

多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、

note記事3000いいね超えの殿堂記事 今すぐ読む

エンベーダー編集部

エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。

RareTECH 無料体験授業開催中! オンラインにて実施中! Top10%のエンジニアになる秘訣を伝授します! RareTECH講師への質疑応答可

関連記事