CloudFront+ELB+EC2+RDSのスケーラブルなシステム構成構築 – 2.NAT構築編

前回(以下記事)からの続きです。

プライベートサブネットからインターネットへ出るために

アプリケーションサーバ(EC2)をプライベートサブネットに置くと、yum updateや、パッケージのダウンロード等でインターネットに出ていくことができません。
そこで、プライベートサブネットのEC2インスタンスをインターネットと通信させるために、NATインスタンスをパブリックサブネットに設置し、NAT経由で外部でに出れるようにします。

NAT用セキュリティグループの設定

踏み台・NATサーバ用(sg-ssh-nat)セキュリティグループに以下を追加します。

Inbound

TypeProtocolPortSource
HTTP(80)TCP(6)80ap server のセキュリティグループ
HTTPS(443)TCP(6)443ap server のセキュリティグループ
全てのICMP -IPv4ICMP(1)全てap server のセキュリティグループ
カスタムTCPルール*TCP(6)587ap server のセキュリティグループ

ここで注意することとして、サイトからお問い合わせフォーム入力時などのメール送信する場合は、ポート587(又は465)もNATしてあげる必要があります。その場合は踏み台・NATサーバは常時立ち上げておく必要があります。
その他にも、プライベートサブネット内のEC2インスタンスから外部のサービスにアクセスするような場合は、以下のように、NATインスタンスのセキュリティーグループにこのインスタンスからの接続許可を追加します。
以下の追加設定が考えられる。

  • 問い合わせフォームからメール送信するために、ポート587(又は465)を許可
  • AWS CodeCommit にSSHでアクセスするために、22番ポートを許可
  • 外部サイトから、git clone でソースコードを取得するためにGitプロトコル 9418番ポートを許可

 NATインスタンスの作成

AMIからインスタンスを立ち上げる

AWSのサイトによると、以下のようにNATインスタンスとして設定されたAMIが用意されているようです。

Amazon では、NAT インスタンスとして実行されるように設定された Amazon Linux AMI を提供しています。これらの AMI の名前には文字列 amzn-ami-vpc-nat が含まれているので、Amazon EC2 コンソールで検索できます。NAT AMI からインスタンスを起動すると、次の設定がインスタンスで発生します。

  • IPv4 転送が有効になり、ICMP リダイレクトが /etc/sysctl.d/10-nat-settings.conf で無効になります
  • /usr/sbin/configure-pat.sh にあるスクリプトが起動時に実行され、iptables IP マスカレードが設定されます

このAMIでNATインスタンスを作成します。また、このインスタンスは踏み台サーバとしても利用します。
AMI選択画面で「amzn-ami-vpc-nat 2017(現在の西暦)」を検索して一番新しいAMIを選択して、インスタンスを立ち上げます。

今回作成したVPCを設定し、サブネットは Availability Zone ap-northeast-1a のパブリックサブネット「public-subnet-front1」を指定します。

送信元/送信先チェックを無効にする

AWSのサイトによると、以下の理由によりインスタンスの「送信元/送信先チェック」を無効にする必要があります。

EC2 インスタンスは、送信元/送信先チェックをデフォルトで実行します。つまり、そのインスタンスは、そのインスタンスが送受信する任意のトラフィックの送信元または送信先である必要があります。しかし、NAT インスタンスは、送信元または送信先がそのインスタンスでないときにも、トラフィックを送受信できなければなりません。したがって、NAT インスタンスでは送信元/送信先チェックを無効にする必要があります。

このNATインスタンスには、外部からアクセスしますのでEIPを割り当て、Route53のDNSレコードに追加しておきます。

アプリケーションサブネット用 Route Table への追加設定

アプリケーションサーバーサブネット用 Route Table へ、インターネット向け通信(0.0.0.0/0)をNATサーバのインスタンスへ向ける「ルート」を追加します。

NAT接続する側のインスタンス(アプリケーションサーバ)作成

NATサーバに接続する側のアプリケーションサーバのインスタンスを作成します。
今回作成したVPCを設定し、サブネットは Availability Zone ap-northeast-1a のプライベートサブネット「private-subnet-ap1」を指定します。
アプリケーションサーバは「KUSANAGI」で構築しますが、ここでは構築手順は割愛します。以下の記事にてKUSANAGIでアプリケーションサーバ構築の手順を記載しています。

NAT経由での外部接続の確認

アプリケーションサーバのインスタンスが作成できたら、NATインスタンスを経由して外部のインターネットにアクセスができるか確認します。

ここで、アプリケーションサーバはプライベートサブネットに設置しているため、ローカルPCから直接ログインできません。
AWSコンソール画面で発行したキーペア( *****.pem )をWinSCP等で踏み台/NATサーバに転送し、以下のコマンドでアプリケーションサーバへログインします。(pemファイルのパーミッションは600にしておく)

$ ssh -i *****.pem centos@10.0.100.214 __ ____ _______ ___ _ _____ __________ / //_/ / / / ___// | / | / / | / ____/ _/ / ,< / / / /\__ \/ /| | / |/ / /| |/ / __ / / / /| / /_/ /___/ / ___ |/ /| / ___ / /_/ // / /_/ |_\____//____/_/ |_/_/ |_/_/ |_\____/___/ Version 8.0.7, Powered by Prime Strategy.

踏み台サーバから無事アプリケーションサーバにログインできました。

では、プライベートサブネットに設置されたアプリケーションサーバから、外部インターネットへアクセスできるか確かめます。

ping を打ってみます。

$ ping google.co.jp
PING google.co.jp (172.217.24.131) 56(84) bytes of data.
64 bytes from nrt20s01-in-f3.1e100.net (172.217.24.131): icmp_seq=1 ttl=52 time=1.88 ms
64 bytes from nrt20s01-in-f131.1e100.net (172.217.24.131): icmp_seq=2 ttl=52 time=2.08 ms
64 bytes from syd09s06-in-f3.1e100.net (172.217.24.131): icmp_seq=3 ttl=52 time=2.10 ms
^C
--- google.co.jp ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 1.883/2.025/2.107/0.100 ms

 

ping通りました。次に curl で Webページを取得します。

$ curl https://kusanagi.tokyo/character/
$ curl https://kusanagi.tokyo/character/
<!DOCTYPE html><html lang="ja" class="no-js"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width,initial-scale=1.0" /><link rel="profile" href="http://gmpg.org/xfn/11" /><link rel="pingback" href="https://kusanagi.tokyo/xmlrpc.php" /> <!--[if lte IE 9]> <script type="text/javascript" src="https://kusanagi.tokyo/wp-content/themes/kusanagi/js/ie-polyfill.min.js"></script> <link rel="stylesheet" id="ie-style-css" href="https://kusanagi.tokyo/wp-content/themes/kusanagi/ie-style.css" type="text/css" media="all" /> <![endif]--><meta property="og:type" content="website" /><meta property="og:site_name" content="KUSANAGI" /><meta property="og:description" content="超高速WordPress仮想マシン [高速化チューニング済みWordPressサーバ]" /><meta property="og:image" content="https://kusanagi.tokyo/wp-content/themes/kusanagi/images/ogp.png" /><meta property="og:image:width" content="320" /><meta property="og:image:height" content="320"/> <script>function fvmuag(){if(navigator.userAgent.match(/x11.*fox\/54|oid\s4.*xus.*ome\/62|oobot|ighth|tmetr|eadles|ingdo/i))return!1;if(navigator.userAgent.match(/x11.*ome\/75\.0\.3770\.100/i)){var e=screen.width,t=screen.height;if("number"==typeof e&&"number"==typeof t&&862==t&&1367==e)return!1}return!0}</script><title>ロゴ・キャラクター &#8211; KUSANAGI</title><link rel='stylesheet' id='fvm-header-0-css' href='https://kusanagi.tokyo/wp-content/uploads/cache/fvm/1572254227/out/header-d5682d38.min.css' type='text/css' media='all' /><link rel='https://api.w.org/' href='https://kusanagi.tokyo/wp-json/' /><link rel="canonical" href="https://kusanagi.tokyo/character/" /><link rel="alternate" type="application/json+oembed" href="https://kusanagi.tokyo/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fkusanagi.tokyo%2Fcharacter%2F" /><link rel="alternate" type="text/xml+oembed" href="https://kusanagi.tokyo/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fkusanagi.tokyo%2Fcharacter%2F&#038;format=xml" /><style type="text/css">#wpadminbar { position: fixed !important; } #wpadminbar #wp-admin-bar-wp-performances { color: white; background-color: green; } #wpadminbar #wp-admin-bar-wp-performances > .ab-item { color: inherit; background-color: inherit; } #wpadminbar #wp-admin-bar-wp-performances > .ab-item:before, #wpadminbar #wp-admin-bar-select-language > .ab-item:before { color: white; } #wpadminbar #wp-admin-bar-wp-performances > .ab-item:before { content: "\f311"; } #wpadminbar #wp-admin-bar-select-language > .ab-item:before { content: "\f326"; } @media screen and (max-width: 782px) { #wpadminbar #wp-admin-bar-wp-performances > .ab-item .label, #wpadminbar #wp-admin-bar-select-language > .ab-item .label { display: none; } #wpadminbar #wp-admin-bar-wp-performances > .ab-item:before, #wpadminbar #wp-admin-bar-select-language > .ab-item:before { display: block; text-indent: 0; font: 400 32px/1 dashicons; speak: none; top: 7px; width: 52px; text-align: center; } #wpadminbar #wp-admin-bar-wp-performances > .ab-item { padding-right: 10px; } #wpadminbar #wp-admin-bar-select-language { display: block !important; } }</style><style type="text/css" media="print">#wpadminbar { display:none; }</style><style type="text/css" media="screen">html { margin-top: 32px !important; } * html body { margin-top: 32px !important; } @media screen and ( max-width: 782px ) { html { margin-top: 46px !important; } * html body { margin-top: 46px !important; } }</style><link rel="shortcut icon" href="https://kusanagi.tokyo/wp-content/uploads/2016/09/saya32-02.png" ><link rel="icon" href="https://kusanagi.tokyo/wp-content/uploads/2016/11/Blue32.png" type="image/png" ></head><body class="page-template-default page page-id-56 admin-bar no-customize-support" ontouchstart="" data-path="/character/">
<div id="page" class="hfeed"><p class="marketing"><a href="https://www.prime-strategy.co.jp/microsoft-interview-20190729/" rel="noopener noreferrer" target="_blank" class="marketing-link"><i class="marketing-icon">特別対談!</i><span class="marketing-text">【Microsoft × プライム・ストラテジー】~VUCA時代、世界に勝負を挑む日本企業が進むべき道とは~</span></a></p><!-- OUR STORY BEGINS --> <nav id="sticky-navigation" class="site-navigation" role="navigation"><div class="view"> <a class="brand" href="https://kusanagi.tokyo/"><img src="https://kusanagi.tokyo/wp-content/themes/kusanagi/images/nav_logo.png" alt="Ultrafast WordPress Virutal Machine KUSANAGI" /></a><div class="menu-sticky-menu-container"><ul id="menu-sticky-menu" class="menu"><li id="menu-item-1462" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-1462"><a href="https://kusanagi.tokyo/about/">KUSANAGI</a></li><li id="menu-item-1463" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-1463"><a href="https://kusanagi.tokyo/cloud/">PUBLIC CLOUD</a></li><li id="menu-item-3687" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-3687"><a href="https://kusanagi.tokyo/jirei/">CASE STUDY</a></li><li id="menu-item-1464" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-1464"><a href="https://kusanagi.tokyo/document/">DOCUMENT</a></li><li id="menu-item-4639" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-4639"><a href="https://kusanagi.tokyo/contact/">CONTACT</a></li></ul></div></div> </nav> <header id="header" role="banner"><div class="view"><div class="sleeve"> <a class="brand" href="https://kusanagi.tokyo/"><img src="https://kusanagi.tokyo/wp-content/themes/kusanagi/images/logo@2x.png" srcset="https://kusanagi.tokyo/wp-content/themes/kusanagi/images/logo.svg" alt="Ultrafast WordPress Virutal Machine KUSANAGI" /></a> <nav id="primary-navigation" class="site-navigation" role="navigation"> <input id="primary-menu-toggle" class="menu-toggle redstone" type="checkbox" /> <label class="menu-toggle button" for="primary-menu-toggle"></label><div class="menu-container"><ul id="menu-primary-menu" class="menu"><li id="menu-item-1469" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-1469"><a href="https://kusanagi.tokyo/about/">KUSANAGIとは</a></li><li id="menu-item-5883" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-5883"><a href="https://kusanagi.tokyo/edition_and_upgrade/">エディションとアップグレード</a></li><li id="menu-item-1470" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-1470"><a href="https://kusanagi.tokyo/cloud/">パブリッククラウド</a></li><li id="menu-item-3962" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-3962"><a target="_blank" rel="noopener noreferrer" href="https://www.prime-strategy.co.jp/achievements/achievements-service/kusanagi_cases/">KUSANAGI導入事例</a></li><li id="menu-item-4392" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-4392"><a target="_blank" rel="noopener noreferrer" href="https://kusanagi-hosting.com/">KUSANAGI公式サポートサービス</a></li><li id="menu-item-1471" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-1471"><a href="https://kusanagi.tokyo/document/">ドキュメント</a></li><li id="menu-item-5159" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-5159"><a href="https://kusanagi.tokyo/kusanagi-news-registration/">最新ニュースの配信登録</a></li></ul> <label class="menu-close button" for="primary-menu-toggle">Close</label></div> </nav></div><div class="jacket"><p class="kusanagi-news"><a class="solid-button-a" href="/kusanagi-news-registration/">WordPressの最新ニュース<br>登録はこちら</a></p></div></div> </header> <main id="main" role="main"><div class="view"> <article id="post-56" class="post-56 page type-page status-publish hentry"> <header class="entry-header"><h1 class="entry-title">ロゴ・キャラクター</h1><div class="share"><span class="embed twitter"><!-- DO NOT EDIT [ --> <a href="https://twitter.com/share" class="twitter-share-button" data-dnt="true">Tweet</a> <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script> <!-- ] --></span><span class="embed facebook"><!-- DO NOT EDIT [ --> <iframe src="https://www.facebook.com/plugins/like.php?locale=en_US&href=https%3A%2F%2Fkusanagi.tokyo%2Fcharacter%2F&width=140&layout=button_count&action=like&show_faces=false&share=true&height=20&appId" width="140" height="20" style="border:none;overflow:hidden" scrolling="no" frameborder="0" allowTransparency="true"></iframe> <!-- ] --></span></div> </header><div class="entry-content"><p>超高速WordPress仮想マシン「KUSANAGI」のロゴマーク、バナー、マスコットキャラクターを紹介いたします。</p>
(以下略)

curl で Webページも取得できました。プライベートサブネットに設置されたアプリケーションサーバから、NATインスタンスを経由して外部のインターネットにアクセスができるか確認するこができました。

踏み台サーバからのパスフレーズなしログイン

AWSコンソール画面で発行したキーペア( *****.pem )をサーバに置いておくのは気になるので、ログイン方法を変更します。

秘密鍵と公開鍵を生成

まず、SSH接続元サーバにて以下のコマンドで秘密鍵と公開鍵を生成します。

$ ssh-keygen -t rsa
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:
(省略)
The key's randomart image is:
+--[ RSA 2048]----+
(省略)

SSH接続元(踏み台サーバ)の~/.ssh に秘密鍵「id_rsa」と公開鍵「id_rsa.pub」が作成されましたので、公開鍵「id_rsa.pub」の内容をSSH接続先(アプリケーションサーバ)アカウントの~/.sshにある「authorized_keys」ファイルにコピーします。
これで、パスフレーズなしに踏み台サーバからアプリケーションサーバへパスフレーズなしにログインが可能になりました。

SSH接続を簡単にする

アプリケーションサーバにSSH接続するコマンドを簡単にするには、~/.ssh/config というファイルを下記の内容で作成しておきます。ファイルのパーミッションは「600」にしておいてください。

Host ap01
Hostname 10.0.xxx.xxx
User centos
IdentityFile ~/.ssh/id_rsa

この設定により「ssh ap01」を打つだけでアプリケーションサーバに接続できるようになります。

サーバー上に秘密鍵を置かない

ssh認証のエージェントPagentの利用

秘密鍵をサーバー上に保存するのはセキュリティ上よろしくないため、ssh認証のエージェントPagentを利用します。
Pagentによりssh認証のエージェント管理下の秘密鍵はメモリ上に保持されます。(Linuxのssh-agentに相当)。

まず、Windows10上のputtyインストールディレクトリにある「pagent.exe」のショートカットを作成し、スタートアップに登録します。

以下コマンドでスタートアップフォルダを開けます。

shell:startup

スタートアップフォルダ中のショートカットのプロパティを開き、以下のようにリンク先に記載されているpagent.exe の後ろに引数として秘密鍵(*.ppk)のファイル名(フォルダ名も含め)を記載すると、起動時に秘密鍵がインポートされます。

"C:\Program Files\PuTTY\pageant.exe" "C:\Users\ユーザー名\.ssh\id_rsa.ppk"

秘密鍵がフォルダに別れて複数あり、全ての秘密鍵のファイル名を記載し260文字を超えるとショートカットに記載しきれなくなります。
その際は、ショートカットに作業フォルダを指定し秘密鍵をそのフォルダに集めると、秘密鍵のファイル名のみショートカットの引数に追加すれば良くなる(フォルダ名が不要)ので、複数の秘密鍵も記載可能になります。

"C:\Program Files\PuTTY\pageant.exe" id_rsa1.ppk id_rsa2.ppk id_rsa3.ppk

インポートされている秘密鍵は、タスクトレイのPagentアイコンを右クリックして「View Keys」で確認できます。

~/.ssh/configの変更

~/.ssh/config に記載してある秘密鍵の記載を削除します。

Host ap01
Hostname 10.0.xxx.xxx
User centos

putty の踏台サーバー接続設定の変更

putty の踏台サーバー接続設定で「接続」→「SSH」→「認証」で「Pagentを使って認証する」「エージェントフォワーディングを認める」にチェックを入れれば、踏台サーバーに秘密鍵を置かなくてもその先のサーバーに接続できるようになります。

以下の記事に続きます。

コメントを残す

コメントは当サイト運営者の承認後に反映されます。
お名前はニックネームでも結構です。

Comments are allowed only in Japanese. / 日本語が含まれない投稿は無視されますのでご注意ください。