ALB + VPC Lambda環境をCloudFormationでサクッと構築してALB経由でVPC Lambdaをつっついてみた

VPC Lambdaの動作検証用の環境がほしく、構築しましたのでアウトプットします。 本エントリでは、CloudFormationで環境を構築し、検証として外部/内部ALBからVPC Lambdaに接続してみました。
2019.05.18

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

VPC Lambdaの動作検証用の環境がほしく、構築しましたのでアウトプットします。

本エントリでは、CloudFormationで環境を構築し、検証として外部/内部ALBからVPC Lambdaに接続してみました。

構成

01

構築

上記構成を一撃で作成するCloudFormationテンプレートを用意しました。

パラメーターにキーペアが必要なので、テンプレートを利用する際は、事前にキーペアを作成しておいてください。 ここでのVPC Lambdaは、確認のためメッセージを返すだけの作りになっています。

CloudFormation実行後、コンソールよりALBのDNS名が確認できますので、こちらを利用して動作確認を行います。

02

動作確認

ローカルから外部ALBへ接続

外部ALB経由でVPC Lambdaにアクセスしてみたいと思います。(構成図:赤線の経路)

まずは、接続先がパブリックIPアドレスを持つ、外部ALBであることを確認しました。

$ dig test-public-alb-1124373377.ap-northeast-1.elb.amazonaws.com

; <<>> DiG 9.10.6 <<>> test-public-alb-1124373377.ap-northeast-1.elb.amazonaws.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 2583
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 4, ADDITIONAL: 5

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1280
;; QUESTION SECTION:
;test-public-alb-1124373377.ap-northeast-1.elb.amazonaws.com. IN	A

;; ANSWER SECTION:
test-public-alb-1124373377.ap-northeast-1.elb.amazonaws.com. 60	IN A 52.68.75.241
test-public-alb-1124373377.ap-northeast-1.elb.amazonaws.com. 60	IN A 13.231.78.234

;; AUTHORITY SECTION:
ap-northeast-1.elb.amazonaws.com. 22 IN	NS	ns-1683.awsdns-18.co.uk.
ap-northeast-1.elb.amazonaws.com. 22 IN	NS	ns-982.awsdns-58.net.
ap-northeast-1.elb.amazonaws.com. 22 IN	NS	ns-54.awsdns-06.com.
ap-northeast-1.elb.amazonaws.com. 22 IN	NS	ns-1325.awsdns-37.org.

;; ADDITIONAL SECTION:
ns-54.awsdns-06.com.	3330	IN	A	205.251.192.54
ns-982.awsdns-58.net.	3330	IN	A	205.251.195.214
ns-1325.awsdns-37.org.	3330	IN	A	205.251.197.45
ns-1683.awsdns-18.co.uk. 3330	IN	A	205.251.198.147

;; Query time: 10 msec
;; SERVER: 192.168.11.1#53(192.168.11.1)
;; WHEN: Sat May 18 19:15:45 JST 2019
;; MSG SIZE  rcvd: 320

パブリックIPが返されましたので、外部ALBであることが確認できました。正常にアクセスできると、VPC Lambdaからメッセージが返ってきます。

$ curl test-public-alb-1124373377.ap-northeast-1.elb.amazonaws.com
"Hello from Lambda!"

ローカルから内部ALBへ接続

内部ALB経由でVPC Lambdaにアクセスしてみたいと思います。(構成図:黒線の経路)

内部ALBのDNS名も、パブリックに名前解決が可能です。

接続先がプライベートIPアドレスを持つ、内部ALBであることを確認します。

$ dig internal-test-private-alb-1008032074.ap-northeast-1.elb.amazonaws.com

; <<>> DiG 9.10.6 <<>> internal-test-private-alb-1008032074.ap-northeast-1.elb.amazonaws.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4334
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 4, ADDITIONAL: 5

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1280
;; QUESTION SECTION:
;internal-test-private-alb-1008032074.ap-northeast-1.elb.amazonaws.com. IN A

;; ANSWER SECTION:
internal-test-private-alb-1008032074.ap-northeast-1.elb.amazonaws.com. 60 IN A 10.0.3.126
internal-test-private-alb-1008032074.ap-northeast-1.elb.amazonaws.com. 60 IN A 10.0.2.254

;; AUTHORITY SECTION:
ap-northeast-1.elb.amazonaws.com. 230 IN NS	ns-1683.awsdns-18.co.uk.
ap-northeast-1.elb.amazonaws.com. 230 IN NS	ns-1325.awsdns-37.org.
ap-northeast-1.elb.amazonaws.com. 230 IN NS	ns-54.awsdns-06.com.
ap-northeast-1.elb.amazonaws.com. 230 IN NS	ns-982.awsdns-58.net.

;; ADDITIONAL SECTION:
ns-54.awsdns-06.com.	2040	IN	A	205.251.192.54
ns-982.awsdns-58.net.	2040	IN	A	205.251.195.214
ns-1325.awsdns-37.org.	2040	IN	A	205.251.197.45
ns-1683.awsdns-18.co.uk. 2040	IN	A	205.251.198.147

;; Query time: 24 msec
;; SERVER: 192.168.11.1#53(192.168.11.1)
;; WHEN: Sat May 18 19:27:18 JST 2019
;; MSG SIZE  rcvd: 330

ローカル環境からはプライベートIPに接続できませんので、内部ALBに接続しても、VPC Lambdaが実行されることはありません。(ここではALBのセキュリティグループに制限をかけていません。)

$ curl test-public-alb-1124373377.ap-northeast-1.elb.amazonaws.com
curl: (52) Empty reply from server

EC2から内部ALBへ接続

VPC内に起動したEC2から、内部ALB経由でVPC Lambdaにアクセスしたいと思います。(構成図:青線の経路)

EC2にログインし、接続先がプライベートIPアドレスを持つ、内部ALBであることを確認します。

$ dig internal-test-private-alb-1008032074.ap-northeast-1.elb.amazonaws.com

; <<>> DiG 9.9.4-RedHat-9.9.4-73.amzn2.1.2 <<>> internal-test-private-alb-1008032074.ap-northeast-1.elb.amazonaws.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 28818
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;internal-test-private-alb-1008032074.ap-northeast-1.elb.amazonaws.com. IN A

;; ANSWER SECTION:
internal-test-private-alb-1008032074.ap-northeast-1.elb.amazonaws.com. 60 IN A 10.0.3.126
internal-test-private-alb-1008032074.ap-northeast-1.elb.amazonaws.com. 60 IN A 10.0.2.254

;; Query time: 33 msec
;; SERVER: 10.0.0.2#53(10.0.0.2)
;; WHEN: Sat May 18 10:37:34 UTC 2019
;; MSG SIZE  rcvd: 130

VPC環境からアクセス可能なプライベートIPが返されていますので、EC2からはVPC Lambdaにアクセスすることが可能です。

$ curl internal-test-private-alb-1008032074.ap-northeast-1.elb.amazonaws.com
"Hello from Lambda!"

さいごに

VPC Lambdaは、RDS等のパブリックに公開できないリソースにアクセスする時以外に利点はないと、ドキュメントに記載されています。

Lambdaと比べ、VPC Lambdaは、様々な制約がありますので、特性を理解した上で利用するようにしましょう。 上記ドキュメントには、VPC Lambdaを使用するかどうか判断するためのデシジョンツリーも用意されていますので、検討時にこちらを利用してみてはいかがでしょうか。