この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
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を使用するかどうか判断するためのデシジョンツリーも用意されていますので、検討時にこちらを利用してみてはいかがでしょうか。