ALB + VPC Lambda環境をCloudFormationでサクッと構築してALB経由でVPC Lambdaをつっついてみた
VPC Lambdaの動作検証用の環境がほしく、構築しましたのでアウトプットします。
本エントリでは、CloudFormationで環境を構築し、検証として外部/内部ALBからVPC Lambdaに接続してみました。
構成
構築
上記構成を一撃で作成するCloudFormationテンプレートを用意しました。
パラメーターにキーペアが必要なので、テンプレートを利用する際は、事前にキーペアを作成しておいてください。 ここでのVPC Lambdaは、確認のためメッセージを返すだけの作りになっています。
CloudFormation実行後、コンソールよりALBのDNS名が確認できますので、こちらを利用して動作確認を行います。
動作確認
ローカルから外部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を使用するかどうか判断するためのデシジョンツリーも用意されていますので、検討時にこちらを利用してみてはいかがでしょうか。