#
ドキュメント

Document

自分のための備忘録です。

Internal ALB

alb-endpoint

やりたいこと

internal-alb

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

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

  • fooのプライベートサブネットにWebサーバ用EC2インスタンスが2つ稼働している
    • APIサーバにはinternalなALBを使ってアクセスする
  • barのプライベートサブネットにEC2インスタンスが稼働している
  • ↑のインスタンスから(fooの)Webサーバにリクエストする

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

ALBとターゲットグループ

設定

internalなALBはプライベートサブネットにしか設置できない。

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

  1. ターゲットグループのPortを8080に設定する(値は任意)
  2. インスタンスのセキュリティグループのインバウンドでカスタムTCP 8080を許可する
  3. ALBのリスナに↑で作成したターゲットを指定することで、ALBの80のアクセスを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を指定する例)

Target_groups___EC2_Management_Console

Amazon Linuxを使用した確認

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

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

Route_53_Console_Hosted_Zones

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

VPC エンドポイントでlambdaアクセス

VPC エンドポイントを使ってVPCからlambdaにアクセスするサンプル。

手順

vpc-endpoint

  1. プライベートサブネットにlambdaを呼び出すインスタンを作成
  2. インスタンスにlambdaを実行するロールを付与
  3. lambdaのエンドポイントを作成(サービス:com.amazonaws.ap-northeast-1.lambda)プライベートサブネットに配置
  4. lambdaを作成(関数名はhello-worldにした)
  5. インスタンスからlambdaを呼び出す

インスタンスにlambdaを実行するロールを付与

  • 許可
  • 信頼関係

許可:

  • AWSLambdaExecute
  • AWSLambdaRole

信頼関係:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "ec2.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

lambdaを作成

ランタイムにNode.js 14.xを選択したときにデフォルトで入力されているサンプルを使用。 関数名はhello-worldにした。

exports.handler = async (event) => {
    // TODO implement
    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };
    return response;
};

インスタンスからlambdaを呼び出す

$ aws --region ap-northeast-1 lambda invoke --function-name hello-world response.json

{
    "ExecutedVersion": "$LATEST",
    "StatusCode": 200
}

疑問

DNSの理解

https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-dns.html#vpc-dns-support

なぜVPCエンドポイントを作成しなくてもS3にアクセスできるのか

おそらくNATゲートウェイを通してアクセスしている。 この場合もバケットのパブリックアクセスをすべてブロックが有効でも接続できる。

Private DNS can't be enabled because the service com.amazonaws.ap-northeast-1.s3 does not provide a private DNS name.