概要
表題の通りです。
下記がイメージ図になります。
VPCにNAT Gatewayを作成、そのNAT GatewayにEIP(パブリックIP)を割り当てます。
Lambdaはprivateセグメントを経由し、そこからpublicセグメントにあるNAT Gatewayを経由してインターネットへ接続を行います。
| セグメント | サブネット |
|:-:|:-:|:-:|
| public subnet | 10.0.10.0/24 |
| private subnet | 10.0.1.0/24 |
VPCの作成を行う
今回はLambda専用のVPCとして作成します。
左メニューからVPCを選択して、「VPCの作成」、今回は「lambda_vpc」というネームタグでCIDRは「10.0.0.0/16」で作成します。
インターネットゲートウェイ
VPCからインターネット接続を行う為のインターネットゲートウェイを作成します。
左メニュー「インターネットゲートウェイ」から作成します。ネームタグは「lambda_igw」で作ります。
先程作成した「lambda_vpc」にアタッチします。
サブネットの作成
次はサブネットの作成を行います。
インターネットに接続するpublicセグメントとインターネットに直接繋げないprivateセグメントを作成します。(図を見たら分かる通り、このprivateセグメントにLambdaが格納されます。)
左メニューのセグメントから「サブネットの作成」を選び、以下のように2つのセグメントを作成します。
publicセグメント
-
ネームタグ
- lambda_public
-
VPC
- 作成した「lambda_vpc」
-
アベイラビリティーゾーン
- ap-northeast-1a
-
CIDRブロック
- 10.0.10.0/24
privateセグメント
-
ネームタグ
- lambda_private
-
VPC
- 作成した「lambda_vpc」
-
アベイラビリティーゾーン
- ap-northeast-1a
-
CIDRブロック
- 10.0.1.0/24
publicサブネットのインターネットゲートウェイをデフォルトゲートウェイに設定
ルートテーブルから作成されているルートテーブルを選び、「ルート」の「編集」をクリックし、送信先に「0.0.0.0/0」を指定し、ターゲットに先ほど作成したインターネットゲートウェイ(lambda_igw)を指定し、保存します。
初期状態では名前がついていないので、分かりやすいように「lambda_public_rt」というネームタグを付けておきます。
「サブネットの関連付け」より先程作成した「lambda_public」を関連付けます。
ここまでの手順でインターネット接続が可能なpublicセグメントとインターネット接続が不可能なprivateセグメントが作成されました。
NAT Gatewayの作成
メニューから「NATゲートウェイ」を選択し、「NAT、ゲートウェイの作成」をクリックします。
サブネット欄にカーソルを当てるとサブネットの一覧が表示されるので、先ほど作成したpublicセグメント(lambda_public)を選択します。Elastic IPは今回は新規に作成しますので「新しいEIPの作成」を押してください。
これでNAT Gatewayの作成は完了です。
NAT Gatewayをprivateセグメントのデフォルトゲートウェイに設定
ルートテーブルから「ルートテーブルの作成」をクリックし、ネームタグを入力し、VPCに「Lambda_vpc」を選択します。
作成されたルートテーブルを選択し、「ルート」タブで「編集」をクリックし、「別ルートの追加」で以下のように送信先に「0.0.0.0/0」、ターゲットに作成したNAT Gatewayを指定し、保存します。
最後に「サブネットの関連付け」タブに移り、編集からprivateサブネットを関連付けます。
ここまでの手順でVPCの設定が完了です。
LambdaにVPCの設定を行う
LambdaにVPCの設定を行います。
以下のように作成した「lambda_vpc」を選択し、Subnetsにprivateサブネットである「lambda_private」を指定します。
security GroupsはとりあえずデフォルトでOKです。
※warningが出ていますが、これは「Lambdaに少なくとも2つのサブネットを選択しておいてね」という警告です。テストで使う分にはこれで十分なので今回はこのまま進めます。
インターネットに接続出来るか確認する
インターネットに接続が出来る事を確認します。
下記のコードは http://qiita.com/api/v2/schema に接続を行いJSON形式のデータを取得するサンプルです。
'use strict';
const request = require('request');
const headers = {
'Content-Type':'application/json'
};
const options = {
url: 'http://qiita.com/api/v2/schema',
method: 'GET',
headers: headers
};
exports.handler = (event, context, callback) => {
request(options, (error, response, body) => {
console.log(body);
callback(
null,
response
);
});
};
JSON形式のレスポンスがあれば成功です。
中身は長いので http://qiita.com/api/v2/schema を確認して下さい。
まとめ
LambdaにVPCを設定しインターネットに接続する手順をでした。
(ほとんどがVPCの設定の話になってしまいました)
この設定を行う事でElastiCache等のVPC内のリソースにアクセスしつつ、DynamoDBのようなサービスにも接続可能なLambda関数を定義出来ます。
公式ドキュメントを見ると・・・
VPC に充分な数の ENI またはサブネット IP がない場合は、リクエスト数が増えても Lambda 関数を拡張できず、関数の失敗数が増えます。現在 AWS Lambda では、ENI または IP アドレスの不足によって発生したエラーは CloudWatch Logs に記録されません。対応する CloudWatch Logs のないエラーが増えている場合は、Lambda 関数を同期的に実行してエラー応答を取得します (たとえば、AWS Lambda コンソールで Lambda 関数をテストすると、コンソールで Lambda 関数が同期的に呼び出され、エラーが表示されます)。
と記載がありますので、実際に運用する際は2つ以上のサブネットを割り当てておく事をオススメします。