Architect's Log

I'm a Cloud Architect. I'm highly motivated to reduce toils with driving DevOps.

Today I Learned - 2026-05-28

til (Today I Learned) をブログに投稿する試み。

NLBを複数の踏み台サーバーのエンドポイントにしたい

現状

  • NLB がポート 22 でリッスンしている
  • 転送先:踏み台サーバーA(ポート 22)
  • 踏み台サーバーB にも転送したい

別ポートでリスナーを追加

リスナーポート ターゲットグループ (ポート) ターゲット (ポート)
22 ターゲットグループA(22) 踏み台サーバーA (22) 既存
2222 ターゲットグループB(22) 踏み台サーバーB (22) 新規

NLBのセキュリティグループで新しいリスナーポートを許可

  • NLB のセキュリティグループで、ポート 2222 へのインバウンドルールを追加
  • NLB がセキュリティグループをサポートする前に作成されたため、今回はセキュリティグループがなかった

あとからセキュリティグループを関連付けることはできる?

セキュリティグループを関連付けずに NLB を作成した場合、あとからセキュリティグループを関連付けることはできない。

セキュリティグループを関連付けずに Network Load Balancer を作成した場合、後でセキュリティグループを Network Load Balancer に関連付けることはできません。Network Load Balancer を作成するときに、セキュリティグループを Network Load Balancer に関連付けることをお勧めします。

セキュリティグループを関連付けて Network Load Balancer を作成した後は、Network Load Balancer に関連付けられたセキュリティグループはいつでも変更できます。

https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/network/load-balancer-security-groups.html

amazon-cloudwatch-agent-ctl

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/start-CloudWatch-Agent-on-premise-SSM-onprem.html

fetch-config アクションを使用して、設定を CloudWatch エージェントに適用できる。

/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl \
  -a fetch-config \
  -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json \
  -s
オプション 意味
-a fetch-config アクション:設定を取得して適用する
-c file:/opt/... 設定ソース:どこから設定を読み込むか
-s (値なし) Start:設定適用後にエージェントを起動する

-c オプションには、SSM パラメータストアも指定できる。

-c ssm:configuration-parameter-store-name

ターミナルからコピーペーストしてファイルを作成する際のバリデーション

セッションマネージャー (SSM) コンソールで疑似 SSH アクセスしている環境がある。

SSM のターミナルではファイルコピーができないため、ターミナルからコンテンツをクリップボードにコピーし、WSL のターミナルにペーストしてファイルを作成した。

双方のコンテンツ同一性を検証するにはファイルのハッシュ値を突き合わせるとよい。

# SHA256
sha256sum filename

Webサーバーを構成していないターゲットに対してALBのエンドポイントにリクエストして疎通確認する方法

ここではインフラ観点での疎通確認を指す。Web サーバーなどのアプリケーションが構成されていないターゲットに対して、ALB のエンドポイントにリクエストしてターゲットへの疎通を確認する方法。

以下の経路を想定する。

ALB (HTTP:443) -> ターゲットグループ (HTTP:8443) -> ターゲット (HTTP:8443)

Python の組み込み HTTP サーバーを使用して、ターゲットで HTTP リクエストを受け付けるようにする。リクエストパスに関わらず常に 200 OK を返すので、ヘルスチェックパスを気にせずに疎通確認できる。

python3 -c "
import http.server, socketserver

class Handler(http.server.BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.end_headers()
        self.wfile.write(b'OK')
    def log_message(self, format, *args):
        pass  # ログ抑制

with socketserver.TCPServer(('', 8443), Handler) as httpd:
    httpd.serve_forever()
"

まず、ターゲットで HTTP サーバーを起動して、ローカルでリクエストしてみる。

curl http://localhost:8443/my-health-check-path
# OK

次に、ターゲットグループのヘルスチェックで Unhealthy が Healthy に変わるのを確認する。

なお、Healthy になるには、該当ターゲットグループを ALB に関連付ける必要があるので気を付けること。関連付けられていない場合は、ヘルスステータスは Unused: Target group is not configured to receive trafficfrom the load balancer となる。

Healthy になったら、ALB のエンドポイントにリクエストしてみる。

curl https://alb-endpoint/
# OK

このときに ALB の DNS 名と証明書のドメイン名が一致していないため、証明書の検証エラーになるので注意。

curl: (60) SSL: no alternative certificate subject name matches target host name 'my-alb.ap-northeast-1.elb.amazonaws.com'
More details here: https://curl.se/docs/sslcerts.html
curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.

疎通確認が目的なので、証明書の検証はスキップする。

curl -k https://alb-endpoint/
# OK

または、ドメインに対してリクエストする。

curl https://my-domain.com/
# OK

確認が終わったら、ターミナルで Ctrl + C して HTTP サーバーを停止する。