AWS LambdaのVPC内リソースへのアクセスが可能になるアップデートが行われました。これは昨年のre:Inventで発表のみされていたものの、その時点ではまだ使えず非常に多くの人がそのリリースを待ち望んでいた機能です。基本的な内容はこちらのブログ記事を参照頂くとして、ここではいくつかキーとなるポイントを簡単に紹介したいと思います。
概要
ブログを読んでもらえばわかるのですが簡単に説明すると、これまでAWS LambdaのファンクションはVirtual Private Cloud(VPC)内にあってパブリックなIPを持っていないAWSリソースにはアクセスできませんでした。従ってAWS Lambdaからデータベースにアクセスしようとした場合にはデータベースサーバのIPアドレスやポートをパブリックにした上でアクセスを許可する必要がありました。一方でAmazon ElastiCacheのようなそもそもインターネットからのアクセスがサポートされていないサービスにはどう頑張ってもアクセスできませんでした。今回のリリースはそういったVPC内にあるAWSリソースへAWS Lambdaからアクセスすることが可能になる、というものです。
基本的な設定
VPCにアクセスさせたいLambdaファンクションに対して、アクセスしたいリソースがあるVPCのサブネットとセキュリティグループを割り当てるだけです。新規の場合はもちろん、既存のものを変更することも可能です。
ENIを使って実現
今回のこの機能はElastic Network Interface(ENI)という本来Amazon Elastic Compute Cloud(EC2)で提供されていた機能を利用して実現されています。Lambdaファンクションに割り当てたVPCサブネット内に自動でENIが用意されてそれを用いてVPC内のリソースにアクセスする形になります。用意されたENIは自身のマネージメントコンソール上でも確認できます(EC2 -> Network Interfaces)。このENIは作成も削除もAWS Lambdaによってコントロールされます。最初のリクエストがあったタイミングで作成され、リクエストがしばらくないと自動的に削除されます。従って 最初のリクエストはENIの作成処理を含むためレイテンシが大きくなります。
IPアドレスを固定することは可能?
作成されるENIは指定したVPCサブネット内の任意のIPアドレスを持っています。これはDHCPによって割り当てられているものになります。また、ENI自体はLambdaによって管理されるのでリクエストが少なければ自動的に削除されることもありえます。従って、仮にあとから変更して任意のIPアドレスを割当たとしても削除されてしまう可能性があります。なお、ENI自体はIPアドレスを指定することが可能です。 ただし、グローバルIPに関してはManaged Nat Gatewayや独自のNATインスタンスを利用することで固定することは可能です。 従って、外部のWebサービスAPI等を叩く際などアクセス先から固定のIPを求められている場合はこの方法で対応が可能です。
特定Lambdaファンクションからのアクセスのみ許可したい
DBなどでアクセス元を特定のサーバやIP、ネットワークにのみ許可したいというのはよくある状況かと思います。しかし前述の通りLambdaのVPCアクセス機能ではIPアドレスを固定する方法でこれを実現することは難しいと言えます。ではどうやればいいかというと、セキュリティグループを利用して実現します。VPC内のリソースにアクセスさせたいファンクションにはサブネットだけでなくセキュリティグループも指定する必要があります。この指定したセキュリティグループをソースとするアクセスのみをアクセスする先(EC2インスタンスだったりRDSインスタンスだったり)のセキュリティグループで許可すると同等のことが実現できます。EC2を使っている人にはお馴染みの方法ですね。
ENI作成に伴うレイテンシ
ENIは新規のリクエストや久しぶりのリクエストが発生したときに自動的に作成されます。従ってそういったアクセスの場合は通常のLambdaファンクションの実行よりも初期化の処理に時間がかかると言えます。これは通常は数秒から数十秒で済みますが状況によっては最大で60秒ほどになる場合もあります。このLambdaファンクションを例えばAPI Gatewayのバックエンドとして利用している場合はタイムアウトしてしまう場合があるので、そういったことを避けるためのワークアラウンドとしてはLambdaのScheduled Eventを利用した定期的なポーリングを行うのがおすすめです。
以上簡単にいくつかのポイントを書きましたが、他にも思いつけば追記していきます。
なお、お約束ですが 本投稿は個人によるものであり、所属する企業や団体に関係するものでも代表するものでもありません。