VPC に接続された Lambda 関数にインターネットアクセスを有効にする - AWS Lambda

VPC に接続された Lambda 関数にインターネットアクセスを有効にする

デフォルトでは、Lambda 関数は、インターネットにアクセスできる Lambda 管理型 VPC で実行されます。アカウントで VPC のリソースにアクセスするには、VPC 設定を関数に追加できます。これにより、VPC がインターネットにアクセスできる場合を除き、機能は VPC 内のリソースに制限されます。このページでは、VPC に接続された Lambda 関数にインターネットアクセスを提供する方法について説明します。

VPC を作成する

[VPC ワークフローの作成] は、サブネット、NAT ゲートウェイ、インターネットゲートウェイ、ルートテーブルエントリなど、Lambda 関数がプライベートサブネットからパブリックインターネットにアクセスするために必要なすべての VPC リソースを作成します。

VPC を作成するには
  1. Amazon VPC コンソール (https://console.aws.amazon.com/vpc/) を開きます。

  2. ダッシュボードで、[VPC を作成] を選択します。

  3. [Resources to create] (作成するリソース) で、[VPC and more] (VPC など) を選択します。

  4. VPC を設定する

    1. [名前タグの自動生成] に、VPC の名前を入力します。

    2. [IPv4 CIDR ブロック] で、デフォルトの候補を維持するか、アプリケーションまたはネットワークが必要とする CIDR ブロックを入力します。

    3. アプリケーションが IPv6 アドレスを使用して通信する場合は、[IPv6 CIDR ブロック][Amazon が提供する IPv6 CIDR ブロック] を選択します。

  5. サブネットを設定する

    1. [アベイラビリティゾーンの数] で、[2] を選択します。高可用性を実現するには、少なくとも 2 つの AZ をお勧めします。

    2. [Number of public subnets] (パブリックサブネットの数) で 2 を選択します。

    3. [Number of private subnets] (プライベートサブネットの数) は、2 を選択します。

    4. パブリックサブネットのデフォルトの CIDR ブロックをそのまま使用することも、[サブネット CIDR ブロックをカスタマイズする] を展開して CIDR ブロックを入力することもできます。詳細については、「サブネット CIDR ブロック」を参照してください。

  6. [NAT ゲートウェイ][AZ ごとに 1] を選択すると、回復性が高まります。

  7. [Egress 専用インターネットゲートウェイ] では、IPv6 CIDR ブロックを含める場合は [はい] を選択します。

  8. [VPC エンドポイント] は、デフォルトの [S3 ゲートウェイ] のままにします。このオプションには費用はかかりません。詳細については、「Amazon S3 向け VPC エンドポイントの種類」を参照してください。

  9. [DNS オプション]については、デフォルト設定のままにします。

  10. [Create VPC (VPC の作成)] を選択します。

Lambda 関数を設定

関数の作成時に VPC を設定するには
  1. Lambda コンソールの [関数ページ] を開きます。

  2. [Create function (関数の作成)] を選択します。

  3. [基本的な情報] の [関数名] に、関数の名前を入力します。

  4. [Advanced settings (詳細設定)] を展開します。

  5. [VPC を有効にする] を選択したら、VPC を選択します。

  6. (オプション) アウトバウンド IPv6 トラフィックを許可するには、[デュアルスタックサブネットの IPv6 トラフィックを許可] をクリックします。

  7. [サブネット] では、すべてのプライベートサブネットを選択します。プライベートサブネットは、NAT ゲートウェイ経由でインターネットにアクセスできます。関数をパブリックサブネットに接続しても、インターネットにアクセスできません。

    注記

    [デュアルスタックサブネットの IPv6 トラフィックを許可する] を選択した場合は、選択したすべてのサブネットに IPv4 CIDR ブロックと IPv6 CIDR ブロックが必要です。

  8. [セキュリティグループ] では、アウトバウンドトラフィックを許可するセキュリティグループを選択します。

  9. [Create function (関数の作成)] を選択します。

Lambda は、「AWSLambdaVPCAccessExecutionRole」 AWS 管理ポリシーをで実行ロールを自動的に作成します。このポリシーのアクセス許可は、VPC 設定の Elastic Network Interface を作成するためにのみに必要であり、関数を呼び出すためではありません。最小特権のアクセス許可を適用するには、関数および VPC 設定を作成した後に、実行ロールから [AWSLambdaVpcAccessExecutionRole] ポリシーを削除できます。詳細については、「必要な IAM 許可」を参照してください。

既存の関数に対して VPC を設定するには

既存の関数に VPC 設定を追加するには、関数の実行ロールに Elastic Network Interface を作成して管理する許可 が必要です。「AWSLambdaVPCAccessExecutionRole」 AWS 管理ポリシーには、必要な許可が含まれています。最小特権のアクセス許可を適用するには、VPC 設定を作成した後に、実行ロールから [AWSLambdaVpcAccessExecutionRole] ポリシーを削除できます。

  1. Lambda コンソールの [関数ページ] を開きます。

  2. 関数を選択します。

  3. [設定] タブを選択したら、[VPC] を選択します。

  4. [VPC] で、[編集] を選択します。

  5. VPC を選択します。

  6. (オプション) アウトバウンド IPv6 トラフィックを許可するには、[デュアルスタックサブネットの IPv6 トラフィックを許可] をクリックします。

  7. [サブネット] では、すべてのプライベートサブネットを選択します。プライベートサブネットは、NAT ゲートウェイ経由でインターネットにアクセスできます。関数をパブリックサブネットに接続しても、インターネットにアクセスできません。

    注記

    [デュアルスタックサブネットの IPv6 トラフィックを許可する] を選択した場合は、選択したすべてのサブネットに IPv4 CIDR ブロックと IPv6 CIDR ブロックが必要です。

  8. [セキュリティグループ] では、アウトバウンドトラフィックを許可するセキュリティグループを選択します。

  9. [Save] を選択します。

関数をテストする

次のサンプルコードを使用し、VPC に接続された関数がパブリックインターネットにアクセスできることを確認します。正常に処理された場合、コードは 200 ステータスコードを返します。失敗した場合、関数がタイムアウトします。

Node.js

この例では、nodejs18.x 以降のランタイムで利用できる fetch を使用します。

  1. Lambda コンソールの [コードソース] ペインで、次のコードを [index.mjs] ファイルに貼り付けます。この関数はパブリックエンドポイントに HTTP GET リクエストを行い、HTTP レスポンスコードを返し、関数がパブリックインターネットにアクセスできるかどうかをテストします。

    Lambda コンソールのコードエディター。
    例 — async/await を持つ HTTP リクエスト
    const url = "https://aws.amazon.com/"; export const handler = async(event) => { try { // fetch is available with Node.js 18 and later runtimes const res = await fetch(url); console.info("status", res.status); return res.status; } catch (e) { console.error(e); return 500; } };
  2. [デプロイ] を選択します。

  3. [テスト] タブを選択します。

    Lambda コンソールのテストタブ。
  4. [テスト] を選択します。

  5. 関数は 200 ステータスコードを返します。つまり、この関数はアウトバウンドのインターネットアクセスができることを意味します。

    Lambda コンソールのテストタブ。

    関数がパブリックインターネットにアクセスできない場合、次のようなエラーメッセージが表示されます。

    { "errorMessage": "2024-04-11T17:22:20.857Z abe12jlc-640a-8157-0249-9be825c2y110 Task timed out after 3.01 seconds" }
Python
  1. Lambda コンソールの [コードソースペイン] ペインで、次のコードを [lambda_function.py] ファイルに貼り付けます。この関数はパブリックエンドポイントに HTTP GET リクエストを行い、HTTP レスポンスコードを返し、関数がパブリックインターネットにアクセスできるかどうかをテストします。

    Lambda コンソールのコードエディター。
    import urllib.request def lambda_handler(event, context): try: response = urllib.request.urlopen('https://aws.amazon.com') status_code = response.getcode() print('Response Code:', status_code) return status_code except Exception as e: print('Error:', e) raise e
  2. [デプロイ] を選択します。

  3. [テスト] タブを選択します。

    Lambda コンソールのテストタブ。
  4. [テスト] を選択します。

  5. 関数は 200 ステータスコードを返します。つまり、この関数はアウトバウンドのインターネットアクセスができることを意味します。

    Lambda コンソールのテストタブ。

    関数がパブリックインターネットにアクセスできない場合、次のようなエラーメッセージが表示されます。

    { "errorMessage": "2024-04-11T17:22:20.857Z abe12jlc-640a-8157-0249-9be825c2y110 Task timed out after 3.01 seconds" }

VPC は既にあるが、Lambda 関数用にパブリックインターネットアクセスを設定する必要がある場合は、次の手順に従ってください。この手順では、VPC に少なくとも 2 つのサブネットがあることを前提としています。サブネットが 2 つない場合、Amazon VPC ユーザーガイドの「サブネットを作成する」を参照してください。

ルートテーブルの設定を確認する

  1. Amazon VPC コンソール (https://console.aws.amazon.com/vpc/) を開きます。

  2. [VPC ID] を選択します。

    VPC の VPC コンソールリスト。
  3. [リソースマップ] セクションまでスクロールダウンします。ルートテーブルのマッピングをメモします。サブネットにマッピングされている各ルートテーブルを開きます。

    VPC コンソールリソースマップのセクション
  4. [ルート] タブまでスクロールダウンします。ルートを確認し、次のいずれかが正しいかどうかを判断します。この各要件は、個別のルートテーブルで満たされる必要があります。

    • インターネット向けトラフィック (IPv4 用に 0.0.0.0/0、IPv6 用に ::/0) は、インターネットゲートウェイ (igw-xxxxxxxxxx) にルーティングされます。つまり、ルートテーブルに関連付けられているサブネットはパブリックサブネットです。

      注記

      サブネットに IPv6 CIDR ブロックがない場合、IPv4 ルート (0.0.0.0/0) のみが表示されます。

      例 パブリックサブネットのルートテーブル
      インターネットゲートウェイへのルートを含むパブリックサブネットのルートテーブル
    • IPv4 (0.0.0.0/0) のインターネット向けトラフィックは、パブリックサブネットに関連付けられた NAT ゲートウェイ (nat-xxxxxxxxxx) にルーティングされます。つまり、サブネットは NAT ゲートウェイ経由でインターネットにアクセスできるプライベートサブネットです。

      注記

      サブネットに IPv6 CIDR ブロックがある場合、ルートテーブルはインターネット向け IPv6 トラフィック (::/0) も Egress-Only のインターネットゲートウェイ (eigw-xxxxxxxxxx) にルーティングする必要があります。サブネットに IPv6 CIDR ブロックがない場合、IPv4 ルート (0.0.0.0/0) のみが表示されます。

      例 プライベートサブネットのルートテーブル
      NAT ゲートウェイへのルートを含むプライベートサブネットのルートテーブル
  5. VPC のサブネットに関連付けられている各ルートテーブルを確認し、インターネットゲートウェイを含むルートテーブルおよび NAT ゲートウェイを含むルートテーブルがあることを確認できるまで、前の手順を繰り返します。

    インターネットゲートウェイへのルートおよび NAT ゲートウェイへのルートで構成される 2 つのルートテーブルがない場合、次の手順に従って不足しているリソースおよびルートテーブルのエントリを作成します。

次の手順に従って、ルートテーブルを作成し、サブネットに関連付けます。

Amazon VPC コンソールを使用してカスタムルートテーブルを作成する方法
  1. Amazon VPC コンソール (https://console.aws.amazon.com/vpc/) を開きます。

  2. ナビゲーションペインで、[Route tables] (ルートテーブル) を選択します。

  3. [ルートテーブルの作成] を選択します。

  4. (オプション) [Name] (名前) には、ルートテーブルの名前を入力します。

  5. [VPC] で、ユーザーの VPC を選択します。

  6. (オプション) タグを追加するには、[Add new tag] (新しいタグを追加) を選択し、タグキーとタグ値を入力します。

  7. [ルートテーブルの作成] を選択します。

  8. [Subnet Associations] (サブネットの関連付け) タブで、 [Edit subnet associations] (サブネットの関連付けの編集) を選択します。

    VPC にインターネットゲートウェイをアタッチする
  9. ルートテーブルに関連付けるサブネットのチェックボックスをオンにします。

  10. [Save associations] (関連付けを保存する) を選択します。

次の手順を実行してインターネットゲートウェイを作成し、VPC にアタッチしてパブリックサブネットのルートテーブルに追加します。

インターネットゲートウェイを作成するには
  1. Amazon VPC コンソール (https://console.aws.amazon.com/vpc/) を開きます。

  2. ナビゲーションペインで、[Internet gateways] (インターネットゲートウェイ) を選択します。

  3. [インターネットゲートウェイの作成] を選択します。

  4. (オプション) インターネットゲートウェイの名前を入力します。

  5. (オプション) タグを追加するには、[Add new tag] (新しいタグを追加) を選択し、そのタグのキーと値を入力します。

  6. [インターネットゲートウェイの作成] を選択します。

  7. 画面上部のバナーから [VPC にアタッチ] を選択し、利用可能な VPC を選択したら、[インターネットゲートウェイをアタッチする] を選択します。

    VPC にインターネットゲートウェイをアタッチする
  8. [VPC ID] を選択します。

    インターネットゲートウェイの詳細ページ
  9. [VPC ID] を再び選択し、VPC 詳細ページを開きます。

    Amazon VPC コンソールのフィルタリングされた VPC リスト
  10. [リソースマップ] セクションまでスクロールダウンし、サブネットを選択します。サブネットの詳細は新しいタブに表示されます。

    サブネットのリストが含まれる VPC コンソールのリソースマップ。
  11. [ルートテーブル] のリンクを選択します。

    サブネット詳細ページのルートテーブルへのリンク
  12. [ルートテーブル ID] を選択し、ルートテーブルの詳細ページを開きます。

    フィルタリングされたルートテーブルリスト
  13. [ルート] で、[ルートを編集する] を選択します。

    [ルートを編集する] ボタンが付いたルートリスト
  14. [ルートを追加する] を選択し、[宛先] ボックスに 0.0.0.0/0 と入力します。

    新しいルートの宛先を追加する
  15. [ターゲット]] には、[インターネットゲートウェイ] を選択し、先ほど作成したインターネットゲートウェイを選択します。サブネットに IPv6 CIDR ブロックがある場合、同じインターネットゲートウェイに ::/0 のルートも追加する必要があります。

    新しいルートのターゲットを追加する
  16. [Save changes] (変更の保存) をクリックします。

次の手順に従って NAT ゲートウェイを作成し、パブリックサブネットに関連付けて、プライベートサブネットのルートテーブルに追加します。

NAT ゲートウェイを作成してパブリックサブネットに関連付ける方法
  1. ナビゲーションペインで [NAT ゲートウェイ] を選択します。

  2. [NAT ゲートウェイを作成] を選択します。

  3. (オプション) NAT ゲートウェイの名前を入力します。

  4. [サブネット] では、VPC のパブリックサブネットを選択します。(パブリックサブネットは、ルートテーブルにインターネットゲートウェイへの直接ルートを持つサブネットです。)

    注記

    NAT ゲートウェイはパブリックサブネットに関連付けられていますが、ルートテーブルのエントリはプライベートサブネットにあります。

  5. [Elastic IP 配分 ID] には、Elastic IP アドレスを選択するか、[Elastic IP を配分する] を選択します。

  6. [NAT ゲートウェイを作成] を選択します。

プライベートサブネットのルートテーブルで NAT ゲートウェイにルートを追加する方法
  1. ナビゲーションペインで、[Subnets(サブネット)] を選択します。

  2. VPC 内のプライベートサブネットを選択します。(プライベートサブネットは、ルートテーブルにインターネットゲートウェイへのルートがないサブネットです。)

  3. [ルートテーブル] のリンクを選択します。

    サブネット詳細ページのルートテーブルへのリンク
  4. [ルートテーブル ID] を選択し、ルートテーブルの詳細ページを開きます。

    フィルタリングされたルートテーブルリスト
  5. スクロールダウンして[ルート] タブを選択し、[ルートを編集する] を選択します。

    ルートテーブルの詳細ページの [ルート] タブ
  6. [ルートを追加する] を選択し、[宛先] ボックスに 0.0.0.0/0 と入力します。

    新しいルートの宛先を追加する
  7. [ターゲット] には、[NAT ゲートウェイ] を選択し、先ほど作成した NAT ゲートウェイを選択します。

    新しいルートのターゲットを追加する
  8. [Save changes] (変更の保存) をクリックします。

次の手順に従って Egress-Only のインターネットゲートウェイを作成し、プライベートサブネットのルートテーブルに追加します。

Egress-Only インターネットゲートウェイを作成するには
  1. ナビゲーションペインで、[Egress Only インターネットゲートウェイ] を選択します。

  2. [Egress Only インターネットゲートウェイの作成] を選択します。

  3. (オプション) 名前を入力します。

  4. Egress-Only インターネットゲートウェイを作成する VPC を選択します。

  5. [Egress Only インターネットゲートウェイの作成] を選択します。

  6. [アタッチされた VPC ID] のリンクを選択します。

    Egress-Only のインターネットゲートウェイの詳細ページ
  7. [VPC ID] のリンクを選択し、VPC の詳細ページを開きます。

  8. [リソースマップ] セクションまでスクロールダウンし、プライベートサブネットを選択します。(プライベートサブネットは、ルートテーブルにインターネットゲートウェイへのルートがないサブネットです。) サブネットの詳細は新しいタブに表示されます。

    サブネットのリストが含まれる VPC コンソールのリソースマップ。
  9. [ルートテーブル] のリンクを選択します。

    サブネット詳細ページのルートテーブルへのリンク
  10. [ルートテーブル ID] を選択し、ルートテーブルの詳細ページを開きます。

    フィルタリングされたルートテーブルリスト
  11. [ルート] で、[ルートを編集する] を選択します。

    [ルートを編集する] ボタンが付いたルートリスト
  12. [ルートを追加する] を選択し、[宛先] ボックスに ::/0 と入力します。

    新しいルートの宛先を追加する
  13. [ターゲット] では、[Egress Only インターネットゲートウェイ] を選択し、先ほど作成したゲートウェイを選択します。

    新しいルートのターゲットを追加する
  14. [Save changes] (変更の保存) をクリックします。

Lambda 関数を設定

関数の作成時に VPC を設定するには
  1. Lambda コンソールの [関数ページ] を開きます。

  2. [Create function (関数の作成)] を選択します。

  3. [基本的な情報] の [関数名] に、関数の名前を入力します。

  4. [Advanced settings (詳細設定)] を展開します。

  5. [VPC を有効にする] を選択したら、VPC を選択します。

  6. (オプション) アウトバウンド IPv6 トラフィックを許可するには、[デュアルスタックサブネットの IPv6 トラフィックを許可] をクリックします。

  7. [サブネット] では、すべてのプライベートサブネットを選択します。プライベートサブネットは、NAT ゲートウェイ経由でインターネットにアクセスできます。関数をパブリックサブネットに接続しても、インターネットにアクセスできません。

    注記

    [デュアルスタックサブネットの IPv6 トラフィックを許可する] を選択した場合は、選択したすべてのサブネットに IPv4 CIDR ブロックと IPv6 CIDR ブロックが必要です。

  8. [セキュリティグループ] では、アウトバウンドトラフィックを許可するセキュリティグループを選択します。

  9. [Create function (関数の作成)] を選択します。

Lambda は、「AWSLambdaVPCAccessExecutionRole」 AWS 管理ポリシーをで実行ロールを自動的に作成します。このポリシーのアクセス許可は、VPC 設定の Elastic Network Interface を作成するためにのみに必要であり、関数を呼び出すためではありません。最小特権のアクセス許可を適用するには、関数および VPC 設定を作成した後に、実行ロールから [AWSLambdaVpcAccessExecutionRole] ポリシーを削除できます。詳細については、「必要な IAM 許可」を参照してください。

既存の関数に対して VPC を設定するには

既存の関数に VPC 設定を追加するには、関数の実行ロールに Elastic Network Interface を作成して管理する許可 が必要です。「AWSLambdaVPCAccessExecutionRole」 AWS 管理ポリシーには、必要な許可が含まれています。最小特権のアクセス許可を適用するには、VPC 設定を作成した後に、実行ロールから [AWSLambdaVpcAccessExecutionRole] ポリシーを削除できます。

  1. Lambda コンソールの [関数ページ] を開きます。

  2. 関数を選択します。

  3. [設定] タブを選択したら、[VPC] を選択します。

  4. [VPC] で、[編集] を選択します。

  5. VPC を選択します。

  6. (オプション) アウトバウンド IPv6 トラフィックを許可するには、[デュアルスタックサブネットの IPv6 トラフィックを許可] をクリックします。

  7. [サブネット] では、すべてのプライベートサブネットを選択します。プライベートサブネットは、NAT ゲートウェイ経由でインターネットにアクセスできます。関数をパブリックサブネットに接続しても、インターネットにアクセスできません。

    注記

    [デュアルスタックサブネットの IPv6 トラフィックを許可する] を選択した場合は、選択したすべてのサブネットに IPv4 CIDR ブロックと IPv6 CIDR ブロックが必要です。

  8. [セキュリティグループ] では、アウトバウンドトラフィックを許可するセキュリティグループを選択します。

  9. [Save] を選択します。

関数をテストする

次のサンプルコードを使用し、VPC に接続された関数がパブリックインターネットにアクセスできることを確認します。正常に処理された場合、コードは 200 ステータスコードを返します。失敗した場合、関数がタイムアウトします。

Node.js

この例では、nodejs18.x 以降のランタイムで利用できる fetch を使用します。

  1. Lambda コンソールの [コードソース] ペインで、次のコードを [index.mjs] ファイルに貼り付けます。この関数はパブリックエンドポイントに HTTP GET リクエストを行い、HTTP レスポンスコードを返し、関数がパブリックインターネットにアクセスできるかどうかをテストします。

    Lambda コンソールのコードエディター。
    例 — async/await を持つ HTTP リクエスト
    const url = "https://aws.amazon.com/"; export const handler = async(event) => { try { // fetch is available with Node.js 18 and later runtimes const res = await fetch(url); console.info("status", res.status); return res.status; } catch (e) { console.error(e); return 500; } };
  2. [デプロイ] を選択します。

  3. [テスト] タブを選択します。

    Lambda コンソールのテストタブ。
  4. [テスト] を選択します。

  5. 関数は 200 ステータスコードを返します。つまり、この関数はアウトバウンドのインターネットアクセスができることを意味します。

    Lambda コンソールのテストタブ。

    関数がパブリックインターネットにアクセスできない場合、次のようなエラーメッセージが表示されます。

    { "errorMessage": "2024-04-11T17:22:20.857Z abe12jlc-640a-8157-0249-9be825c2y110 Task timed out after 3.01 seconds" }
Python
  1. Lambda コンソールの [コードソースペイン] ペインで、次のコードを [lambda_function.py] ファイルに貼り付けます。この関数はパブリックエンドポイントに HTTP GET リクエストを行い、HTTP レスポンスコードを返し、関数がパブリックインターネットにアクセスできるかどうかをテストします。

    Lambda コンソールのコードエディター。
    import urllib.request def lambda_handler(event, context): try: response = urllib.request.urlopen('https://aws.amazon.com') status_code = response.getcode() print('Response Code:', status_code) return status_code except Exception as e: print('Error:', e) raise e
  2. [デプロイ] を選択します。

  3. [テスト] タブを選択します。

    Lambda コンソールのテストタブ。
  4. [テスト] を選択します。

  5. 関数は 200 ステータスコードを返します。つまり、この関数はアウトバウンドのインターネットアクセスができることを意味します。

    Lambda コンソールのテストタブ。

    関数がパブリックインターネットにアクセスできない場合、次のようなエラーメッセージが表示されます。

    { "errorMessage": "2024-04-11T17:22:20.857Z abe12jlc-640a-8157-0249-9be825c2y110 Task timed out after 3.01 seconds" }