プライベートサブネットのインスタンスからinternalなALBを経由してプライベートサブネットのインスタンスにアクセスする。
今回はVPC fooとbarを作成して、ALBとアクセス先をfooに、アクセス元をbarに作成する。
foo, barともにプライベートサブネットに配置したインスタンスにアクセスするための踏み台サーバをパブリックサブネットに配置している。
internalなALBはプライベートサブネットにしか設置できない。
今回は後述するように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
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 ...
# Ubuntu 22.04
$ sudo mkdir www
$ sudo cd www
$ sudo python3 -m http.server
Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ...
``
```html
<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 アドレスは、プライマリアドレスまたはセカンダリアドレスを問わず、インスタンスが停止して起動、または休止して起動した際に、ネットワークインターフェイスに関連付けられたままになり、インスタンスを終了すると解放されます。
プライベートホストゾーンについけた名前空間が重複するの優先順序は以下に記載されている。
VPC エンドポイントを使ってVPCからlambdaにアクセスするサンプル。
許可:
信頼関係:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
ランタイムにNode.js 14.xを選択したときにデフォルトで入力されているサンプルを使用。 関数名はhello-worldにした。
exports.handler = async (event) => {
// TODO implement
const response = {
statusCode: 200,
body: JSON.stringify('Hello from Lambda!'),
};
return response;
};
$ aws --region ap-northeast-1 lambda invoke --function-name hello-world response.json
{
"ExecutedVersion": "$LATEST",
"StatusCode": 200
}
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-dns.html#vpc-dns-support
おそらくNATゲートウェイを通してアクセスしている。
この場合もバケットのパブリックアクセスをすべてブロック
が有効でも接続できる。