Help us understand the problem. What is going on with this article?

VPC内のLambdaからインターネットにアクセスする

More than 3 years have passed since last update.

VPC内にLambdaを配置すると、VPC内のサービスへの接続はとても簡単だけど、インターネットに疎通させようとした時に一手間必要だったので、そのメモ。

手順

以下の手順を踏むことになります。

  1. Lambdaに「AWSLambdaVPCAccessExecutionRole」の権限をアタッチしたIAMロールを割り当てる
  2. プライベートサブネットとパブリックサブネットを作成する
  3. パブリックサブネット内でNATゲートウェイを作成する
  4. NAT/インターネットゲートウェイを各サブネットのルートテーブルで割り当てる
  5. Lambdaをプライベートサブネットに配置する

出来上がる構成はこんな感じになります。(あんまり自信ないけどこうなるはず)
インターネットアクセスの先として、DynamoDBをとりあえず考えた場合の構成になってます。

スクリーンショット 2017-02-12 14.03.15.png

一つずつ内容を残しておきます。

Lambdaに「AWSLambdaVPCAccessExecutionRole」の権限をアタッチしたIAMロールを割り当てる

書いてある通りです。Lambdaを実施する際のロールは、「AWSLambdaVPCAccessExecutionRole」を割り当てられている必要があります。正確には以下の3つ。

        "ec2:CreateNetworkInterface",
        "ec2:DescribeNetworkInterfaces",
        "ec2:DeleteNetworkInterface"

カスタムポリシーとして割り当ててもいいですが、「AWSLambdaVPCAccessExecutionRole」を割り当てておけば大丈夫です。

プライベートサブネットとパブリックサブネットを作成する

操作自体単純です。まだインターネットゲートウェイなど割り当ててませんが、とりあえずサブネットを2つ作っておきます。

スクリーンショット 2017-02-12 13.39.15.png

パブリックサブネット内でNATゲートウェイを作成する

作成する際のサブネット選択を間違えないように注意。パブリックサブネット内で作成することがポイントになります。

スクリーンショット 2017-02-12 13.41.52.png

NAT/インターネットゲートウェイを各サブネットのルートテーブルで割り当てる

プライベートとして扱うサブネットにはNATゲートウェイを、パブリックとして扱うサブネットにはインターネットゲートウェイを割り当てます。(インターネットゲートウェイの作成方法は省略)

パブリック側はインターネットゲートウェイと繋げる
スクリーンショット 2017-02-12 13.55.49_02.png

プライベート側はNATゲートウェイと繋げる
スクリーンショット 2017-02-12 13.56.17_02.png

Lambdaをプライベートサブネットに配置する

Lambdaの設定で設置先をプライベートサブネットにします。パブリック側に置いてしまうとLambdaの仕様上インターネットに接続できません。

スクリーンショット 2017-02-12 13.59.46_02.png

Lambdaを実行してみる

一通り設定したのでLambdaを実行してみます。テスト用のコードは単純にGoogleにアクセスするものになってます。

var http = require ('http');
exports.handler = function(event, context) {
    http.get("http://www.google.com/index.html", function(res) {
        console.log("Got response: " + res.statusCode);
    }).on('error', function(e) {
        context.done('error', e);
    });
};

とりあえずつながったようです。

START RequestId: d7a05c09-f0e0-11e6-xxxx-000000000000 Version: $LATEST
2017-02-12T05:05:25.896Z    d7a05c09-f0e0-11e6-xxxx-000000000000    Got response: 200
END RequestId: d7a05c09-f0e0-11e6-xxxx-000000000000
REPORT RequestId: d7a05c09-f0e0-11e6-xxxx-000000000000  Duration: 575.61 ms Billed Duration: 600 ms     Memory Size: 128 MB Max Memory Used: 9 MB   

ちなみにVPC内のLambdaからインターネット初回アクセス時には、ENIを自動で作成してからのアクセスになるため、実行時間が2回目以降に比べて長くなります。(今回も2回目の実行時間は200ms程度になりました。)

自動で生成されるENIですが、ある程度の時間アクセスがないと自動的に削除される仕様のようなので、その辺は気にしなくてもよいらしいです。

料金とかは?

NATゲートウェイはマネージド型のNATインスタンスですので、自分でNATインスタンスを立てて運用するよりも堅牢である反面、コストはかかるようになります。
本記事執筆時が最安値のリージョンを利用して1時間0.045ドル。1ヶ月使い続けると30ドル程度かかる計算になります。(例えばt2.microで同様のインスタンスを組んだ場合、もう少し安くできる)

この辺は求められる性能や用途などを考慮しながらどちらがいいかを選択する必要があります。もっとも、すぐにでもVPC内のLambdaをインターネットに接続させたい、というのであればNATゲートウェイを作成した方が早いですがね。

kojiisd
Acroquest Technology株式会社 SpringCloud/AWS/Angular/Microservices/kintone JAWS-UG 横浜 ミャンマー支社CTO
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした