internalなALB

Pocket

プライベートサブネットのインスタンスからinternalなALBを経由してプライベートサブネットのインスタンスにアクセスする簡単なサンプル。

概要

VPC fooとbarを作成して、ALBとアクセス先をfoo配置する。
アクセス元をbarに配置する。

  • fooのプライベートサブネットにEC2インスタンスを2つ起動して、それぞれにWebサーバを稼働する
  • barのプライベートサブネットにEC2インスタンスを稼働する
  • ↑のインスタンスから(fooの)internalなALBを経由してWebサーバにリクエストする

foo, barともにプライベートサブネットに配置したインスタンスにアクセスするための踏み台サーバをパブリックサブネットに配置している。

ALBとターゲットグループ

今回は後述するようにWebサーバとしてSimpleHTTPServerをPort 8080で稼働する。
ALBおよびターゲットグループを以下のように設定する。

  1. ターゲットグループのPortを8080に設定する(Portの値は任意だが今回は8080にした)
  2. インスタンスのセキュリティグループのインバウンドでカスタムTCP 8080を許可する
  3. ALBのリスナに↑で作成したターゲットを指定する

ALBのセキュリティグループのインバウンドでHTTPを許可するのを忘れない。

ターゲットグループでPort 8080を指定する例

接続確認

barのプライベートサブネットのインスタンスから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

Amazon Linuxを使用した確認

例としてプライベートサブネットのEC2インスタンスにWebサーバ(PythonのSimpleHTTPServer)を起動する例を記載する(EC2はAmazon Linuxを使用)。

$ mkdir www
$ cd www
$ vim index.html
$ python -m SimpleHTTPServer 8080
Serving HTTP on 0.0.0.0 port 8080 ...

index.htmlの内容。

<html>
  <head>
    <title>Internal alb sample</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

プライベートホストゾーンを設定

Route 53のプライベートホストゾーンを設定する。

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 アドレスは、プライマリアドレスまたはセカンダリアドレスを問わず、インスタンスが停止して起動、または休止して起動した際に、ネットワークインターフェイスに関連付けられたままになり、インスタンスを終了すると解放されます。

ref. https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-instance-addressing.html#concepts-private-addresses

プライベートホストゾーンにつけた名前空間が重複する場合の優先順序は以下に記載されている。

https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/hosted-zone-private-considerations.html?utm_source=pocket_mylist

コメント

No comments yet.

コメントの投稿

改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。