2
3

More than 1 year has passed since last update.

NATインスタンス を用いて、VPC内でLambdaを実行

Last updated at Posted at 2022-02-15

はじめに

APIサービスを利用するにあたり固定のIPにする必要があったため、Lambda + 固定IPのNATインスタンスを構築しましたので、まとめます。
NATゲートウェイの方が、運用は楽ですが、サービスが小規模かつ、コスト面でNATインスタンスの方が安いため、こちらを利用しました。

コスト

NATゲートウェイ:稼働時間料金で46 USD/月、+ データ処理および転送料金
NATインスタンス:稼働時間料金で10 USD/月(t3.micro)、+ 転送料金

完成図

スクリーンショット 2022-02-14 22.44.57.png

事前構築

VPCやサブネットは以下のように作成しましょう。

スクリーンショット 2022-02-14 22.41.56.png

可用性を考えて、AZを2つ作成するため、サブネットを4つ作成するのもよいです。

パブリックサブネット:10.0.0.0/24、10.0.1.0/24
プライベートサブネット:10.0.2.0/24、10.0.3.0/24

NATインスタンス起動

  1. AMIは、 バージョンが新しいものが良いので、↓網かけの部分が新しい年度のものを選択します。
    amzn-ami-vpc-nat-2018.03.0.20210408.0-x86_64-ebs
    スクリーンショット 2022-02-14 22.35.16.png

  2. サブネットは、パブリックサブネットを選択し、パブリックIPは不要です。
    スクリーンショット 2022-02-14 22.47.33.png

  3. ボリュームタイプは、gp3を選択します。
    (デフォルトは、マグネティックです。マグネティックの理由がわかりません。。)
    スクリーンショット 2022-02-14 22.50.16.png

  4. セキュリティーグループは、プライベートサブネットをソースにし、HTTP,HTTPSそれぞれ許可するCIDRを設定する。
    また、SSH接続できるように、自分のマイIPアドレスを指定する。(今回は、0.0.0.0/0
    スクリーンショット 2022-02-14 22.59.10.png

  5. 起動後、Elastic IPをNATインスタンスにアタッチする
    スクリーンショット 2022-02-16 0.01.57.png

スクリーンショット 2022-02-16 0.00.08.png

NATインスタンスの送信元/送信先チェックの無効化

インスタンスを選択し、[ネットワーキング][ソース/宛先チェックを変更]をクリックします。

送信元/送信先チェック中停止にチェックします。
スクリーンショット 2022-02-15 21.26.19.png
スクリーンショット 2022-02-15 21.26.49.png

チェックする理由として、パケット送信先がNATインスタンスでない場合でも、パケットは一度NATインスタンスを通る必要があるためです。

プライベートサブネットからのインターネット接続をNATインスタンス経由にする

プライベートサブネットのルートテーブルに、ターゲットをNATインスタンス経由にして、インターネット接続できるよう以下の設定を加えます。

送信先 ターゲット
0.0.0.0/0 NATインスタンスID

スクリーンショット 2022-02-15 21.32.09.png

スクリーンショット 2022-02-16 0.00.32.png

Lambda作成

IAMロールは、基本的な Lambda アクセス権限で新しいロールを作成にして作成します。

タイムアウト

3秒から20秒に変更

IAMロール

AWSLambdaVPCAccessExecutionRoleポリシーの権限をIAMロールに割り当てる

VPC設置

プライベートサブネットにLambdaを設置し、セキュリティーグループは、デフォルトにしました。
EC2用のセキュリティーグループでもよいです。
スクリーンショット 2022-02-15 22.53.17.png

コード

インターネットにアクセスできることを確認します。

import json
import urllib.request

url = "https://qiita.com/"

def lambda_handler(event, context):
    response = urllib.request.urlopen(url)
    return {
        'url': response.geturl(),
        'code': response.getcode(),
        'Content-Type': response.info()['Content-Type']
    }

テスト実行

タイムアウトエラーが出ず以下の結果が出ると成功です。

Response
{
  "url": "https://qiita.com/",
  "code": 200,
  "Content-Type": "text/html; charset=utf-8"
}

スクリーンショット 2022-02-14 22.44.57.png

エラー①

AWSLambdaVPCAccessExecutionRoleがアタッチされていない場合、VPC内にLambdaは設置できずエラーになります。
スクリーンショット 2022-02-15 22.55.25.png

エラー②

Lambdaがタイムアウトエラーになる場合、Elastic IPをNATインスタンスにアタッチしているか確認しましょう。

参考

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3