※ Webアプリケーションサーバと踏み台サーバとは同じ公開鍵/秘密鍵を使用することを前提とする。
VPC Peering
でVPCを接続してinternal
なALB
を使って相互通信する。
パブリックサブネット
、持たないサブネットをプライベートサブネット
と呼ぶパブリックサブネット
とプライベートサブネット
の違いは文字通りインターネットへのルートを持つかどうかの違いinternalなALBにはDNS名(internal-xxxxxxxxx.ap-northeast-1.elb.amazonaws.com
)でアクセスする。
DNS ホスト名
を有効
にするDNS解決
を有効化
するよくないが一旦とりあえすべてのソースからのHTTPを許可して解決(適切な制御を考える)。
VPC-Foo
とVPC-B
があるVPC-Foo
に(intenalな)ALBが配置されておりEC2にバランシングVPC-Foo
とVPC-Bar
はVPC Peering
で接続VPC Peering
はVPC-Bar
がリクエスタでVPC-Foo
がアクセプタVPC-Bar
からVPC-Foo
に疎通を確認VPC Peeringには必ずリクエスタVPCとアクセプタVPCが存在する。
ref. AWS::EC2::VPCPeeringConnection
The ID of the VPC with which you are creating the VPC peering connection. You must specify this parameter in the request.
※ PeerOwnerId
The AWS account ID of the owner of the accepter VPC.
他アカウントに対してVPC Peeringを設定する場合はアクセプタのAWS アカウントIDを指定。
VPC Peeringは異なるアカウントでも接続できる(PeerOwnerIdを指定)
AWS::EC2::VPCPeeringConnection
のProperties
。
The ID of the VPC.
The ID of the VPC with which you are creating the VPC peering connection. You must specify this parameter in the request.
The AWS account ID of the owner of the accepter VPC.
プライベートサブネットのインスタンスからinternalなALBを経由してプライベートサブネットのインスタンスにアクセスする。
今回はfoo/barと2つのVPCを作成する。
ALBとアクセス先をfooに作成する。
アクセス元をbarに作成する。
foo, barともにプライベートサブネットのインスタンスにアクセスするために、パブリックサブネットに踏み台サーバを配置している。
今回は後述するようにWebサーバとしてSimpleHTTPServer
をPort 8080
で稼働する。
ALBおよびターゲットグループを以下のように設定する。
カスタムTCP 8080
を許可する※ ALBのセキュリティグループのインバウンドでHTTPを許可するのを忘れない。
ALBにはDNS 名(例 internal-foo-internal-alb-xxxxxxxxxx.ap-northeast-1.elb.amazonaws.com)でアクセスできる。
$ curl -v internal-foo-internal-alb-xxxxxxxxxx.ap-northeast-1.elb.amazonaws.com
ターゲットグループでPort 8080を指定する例は以下のとおり。
ALBの疎通確認のために、プライベートサブネットのEC2インスタンスにWebサーバ(PythonのSimpleHTTPServer)を起動する。 例はAmazon Linuxを使用している。
$ mkdir www
$ cd www
$ vim ndex.html
$ python -m SimpleHTTPServer 8080
Serving HTTP on 0.0.0.0 port 8080 ...
<html>
<head>
<title>Welcom to web1</title>
</head>
<body>
Hello World
</body>
</html>
ALBのリスナにターゲットが設定されるとヘルスチェックが行われる。
以下は上記で稼働したSimpleHTTPServerにヘルスチェックが行われている例。
$ python -m SimpleHTTPServer 8080
Serving HTTP on 0.0.0.0 port 8080 ...
10.2.1.175 - - [12/Mar/2022 11:15:16] "GET / HTTP/1.1" 200 -
10.2.2.171 - - [12/Mar/2022 11:15:17] "GET / HTTP/1.1" 200 -
10.2.1.175 - - [12/Mar/2022 11:15:46] "GET / HTTP/1.1" 200 -
10.2.2.171 - - [12/Mar/2022 11:15:47] "GET / HTTP/1.1" 200 -
10.2.1.175 - - [12/Mar/2022 11:16:16] "GET / HTTP/1.1" 200 -
10.2.2.171 - - [12/Mar/2022 11:16:17] "GET / HTTP/1.1" 200 -
10.2.1.175 - - [12/Mar/2022 11:16:46] "GET / HTTP/1.1" 200 -
10.2.2.171 - - [12/Mar/2022 11:16:47] "GET / HTTP/1.1" 200 -
10.2.1.175 - - [12/Mar/2022 11:17:16] "GET / HTTP/1.1" 200 -
VPC barのプライベートサブネットのインスタンスからの接続を確認する。
$ curl -v internal-foo-internal-alb-xxxxxxxxxx.ap-northeast-1.elb.amazonaws.com
* Trying 10.2.1.175:80...
* Connected to internal-foo-internal-alb-xxxxxxxxxx.ap-northeast-1.elb.amazonaws.com (xxx.xxx.xxx.xxx) port 80 (#0)
> GET / HTTP/1.1
> Host: internal-foo-internal-alb-xxxxxxxxxx.ap-northeast-1.elb.amazonaws.com
> User-Agent: curl/7.79.1
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Date: Sat, 12 Mar 2022 11:25:20 GMT
< Content-Type: text/html
< Content-Length: 103
< Connection: keep-alive
< Server: SimpleHTTP/0.6 Python/2.7.18
< Last-Modified: Sat, 12 Mar 2022 11:00:37 GMT
<
<html>
<head>
<title>Welcom to web1</title>
</head>
<body>
Hello World
</body>
</html>
* Connection #0 to host internal-foo-internal-alb-xxxxxxxxxx.ap-northeast-1.elb.amazonaws.com left intact
alb.homeでアクセス可能
$ curl -v alb.home
* Trying 10.2.2.171:80...
* Connected to alb.home (10.2.2.171) port 80 (#0)
> GET / HTTP/1.1
> Host: alb.home
> User-Agent: curl/7.79.1
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Date: Sat, 12 Mar 2022 11:34:13 GMT
< Content-Type: text/html
< Content-Length: 103
< Connection: keep-alive
< Server: SimpleHTTP/0.6 Python/2.7.18
< Last-Modified: Sat, 12 Mar 2022 11:00:37 GMT
<
<html>
<head>
<title>Welcom to web1</title>
</head>
<body>
Hello World
</body>
</html>
* Connection #0 to host alb.home left intact
プライベートアドレスは停止や休止では変更されない。
プライベート IPv4 アドレスは、プライマリアドレスまたはセカンダリアドレスを問わず、インスタンスが停止して起動、または休止して起動した際に、ネットワークインターフェイスに関連付けられたままになり、インスタンスを終了すると解放されます。
プライベートホストゾーンの名前空間が重複する際の優先順序は以下に記載されている。