

# VPC に接続された Lambda 関数にインターネットアクセスを有効にする
<a name="configuration-vpc-internet"></a>

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

## VPC をまだ持っていません
<a name="new-vpc"></a>

### VPC を作成する
<a name="create-vpc-internet"></a>

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

**VPC を作成するには**

1. Amazon VPC コンソールの [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/) を開いてください。

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

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

1. **VPC を設定する**

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

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

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

1. **サブネットを設定する**

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

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

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

   1. パブリックサブネットのデフォルトの CIDR ブロックをそのまま使用することも、**[サブネット CIDR ブロックをカスタマイズする]** を展開して CIDR ブロックを入力することもできます。詳細については、「[サブネット CIDR ブロック](https://docs.aws.amazon.com/vpc/latest/userguide/subnet-sizing.html)」を参照してください。

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

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

1. **[VPC エンドポイント]** は、デフォルトの **[S3 ゲートウェイ]** のままにします。このオプションには費用はかかりません。詳細については、「[Amazon S3 向け VPC エンドポイントの種類](https://docs.aws.amazon.com/AmazonS3/latest/userguide/privatelink-interface-endpoints.html#types-of-vpc-endpoints-for-s3)」を参照してください。

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

1. **[Create VPC（VPC の作成）]** を選択します。

### Lambda 関数を設定
<a name="vpc-function-internet-create"></a>

**関数の作成時に VPC を設定するには**

1. Lambda コンソールの [[関数]](https://console.aws.amazon.com/lambda/home#/functions) ページを開きます。

1. [**関数の作成**] を選択してください。

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

1. **[詳細設定]** を展開します。

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

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

1. **[サブネット]** では、すべてのプライベートサブネットを選択します。プライベートサブネットは、NAT ゲートウェイ経由でインターネットにアクセスできます。関数をパブリックサブネットに接続しても、インターネットにアクセスできません。
**注記**  
**[デュアルスタックサブネットの IPv6 トラフィックを許可する]** を選択した場合は、選択したすべてのサブネットに IPv4 CIDR ブロックと IPv6 CIDR ブロックが必要です。

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

1. [**関数の作成**] を選択してください。

Lambda は、「[AWSLambdaVPCAccessExecutionRole](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambdaVPCAccessExecutionRole.html)」 AWS 管理ポリシーをで実行ロールを自動的に作成します。このポリシーのアクセス許可は、VPC 設定の Elastic Network Interface を作成するためにのみに必要であり、関数を呼び出すためではありません。最小特権のアクセス許可を適用するには、関数および VPC 設定を作成した後に、実行ロールから **[AWSLambdaVPCAccessExecutionRole]** ポリシーを削除できます。詳細については、「[必要な IAM 許可](configuration-vpc.md#configuration-vpc-permissions)」を参照してください。

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

既存の関数に VPC 設定を追加するには、関数の実行ロールに [Elastic Network Interface を作成して管理する許可](configuration-vpc.md#configuration-vpc-permissions) が必要です。「[AWSLambdaVPCAccessExecutionRole](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambdaVPCAccessExecutionRole.html)」 AWS 管理ポリシーには、必要な許可が含まれています。最小特権のアクセス許可を適用するには、VPC 設定を作成した後に、実行ロールから **[AWSLambdaVPCAccessExecutionRole]** ポリシーを削除できます。

1. Lambda コンソールの [[関数ページ]](https://console.aws.amazon.com/lambda/home#/functions) を開きます。

1. 関数を選択します。

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

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

1. VPC を選択します。

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

1. **[サブネット]** では、すべてのプライベートサブネットを選択します。プライベートサブネットは、NAT ゲートウェイ経由でインターネットにアクセスできます。関数をパブリックサブネットに接続しても、インターネットにアクセスできません。
**注記**  
**[デュアルスタックサブネットの IPv6 トラフィックを許可する]** を選択した場合は、選択したすべてのサブネットに IPv4 CIDR ブロックと IPv6 CIDR ブロックが必要です。

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

1. **[保存]** を選択します。

### 関数をテストする
<a name="vpc-function-internet-test"></a>

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

------
#### [ Node.js ]

1. Lambda コンソールの **[コードソース]** ペインで、次のコードを **[index.mjs]** ファイルに貼り付けます。この関数はパブリックエンドポイントに HTTP GET リクエストを行い、HTTP レスポンスコードを返し、関数がパブリックインターネットにアクセスできるかどうかをテストします。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/code-source-nodejs.png)  
**Example — async/await を持つ HTTP リクエスト**  

   ```
   const url = "https://aws.amazon.com/";
   
   export const handler = async(event) => {
       try {
           const res = await fetch(url);
           console.info("status", res.status);
           return res.status;
       }
       catch (e) {
           console.error(e);
           return 500;
       }
   };
   ```

1. **[DEPLOY]** セクションで、**[デプロイ]** を選択して関数のコードを更新します。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/getting-started-tutorial/deploy-console.png)

1. **[テスト]** タブを選択します。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/test-tab.png)

1. **[テスト]** を選択します。

1. 関数は `200` ステータスコードを返します。つまり、この関数はアウトバウンドのインターネットアクセスができることを意味します。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/test-successful-200.png)

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

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

------
#### [ Python ]

1. Lambda コンソールの **[コードソースペイン]** ペインで、次のコードを **[lambda\$1function.py]** ファイルに貼り付けます。この関数はパブリックエンドポイントに HTTP GET リクエストを行い、HTTP レスポンスコードを返し、関数がパブリックインターネットにアクセスできるかどうかをテストします。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/code-source-python.png)

   ```
   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
   ```

1. **[DEPLOY]** セクションで、**[デプロイ]** を選択して関数のコードを更新します。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/getting-started-tutorial/deploy-console.png)

1. **[テスト]** タブを選択します。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/test-tab.png)

1. **[テスト]** を選択します。

1. 関数は `200` ステータスコードを返します。つまり、この関数はアウトバウンドのインターネットアクセスができることを意味します。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/test-successful-200.png)

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

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

------

## VPC を既に持っています
<a name="existing-vpc"></a>

VPC は既にあるが、Lambda 関数用にパブリックインターネットアクセスを設定する必要がある場合は、次の手順に従ってください。この手順では、VPC に少なくとも 2 つのサブネットがあることを前提としています。サブネットが 2 つない場合、Amazon VPC ユーザーガイドの「[サブネットを作成する](https://docs.aws.amazon.com/vpc/latest/userguide/create-subnets.html)」を参照してください。

### ルートテーブルの設定を確認する
<a name="vpc-internet-routes"></a>

1. Amazon VPC コンソールの [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/) を開いてください。

1. **[VPC ID]** を選択します。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/vpc-id.png)

1. **[リソースマップ]** セクションまでスクロールダウンします。ルートテーブルのマッピングをメモします。サブネットにマッピングされている各ルートテーブルを開きます。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/route-table-associations.png)

1. **[ルート]** タブまでスクロールダウンします。ルートをチェックして、VPC に次の両方のルートテーブルがあるかどうかを確認します。この各要件は、個別のルートテーブルで満たされる必要があります。
   + インターネット向けトラフィック (IPv4 用に `0.0.0.0/0`、IPv6 用に `::/0`) は、インターネットゲートウェイ (`igw-xxxxxxxxxx`) にルーティングされます。つまり、ルートテーブルに関連付けられているサブネットはパブリックサブネットです。
**注記**  
サブネットに IPv6 CIDR ブロックがない場合、IPv4 ルート (`0.0.0.0/0`) のみが表示されます。  
**Example パブリックサブネットのルートテーブル**    
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/routes-public.png)
   + 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`) のみが表示されます。  
**Example プライベートサブネットのルートテーブル**    
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/routes-private.png)

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

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

### ルートテーブルの作成
<a name="create-route-table"></a>

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

**Amazon VPC コンソールを使用してカスタムルートテーブルを作成する方法**

1. Amazon VPC コンソールの [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/) を開いてください。

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

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

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

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

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

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

1. [**Subnet Associations**] (サブネットの関連付け) タブで、 [**Edit subnet associations**] (サブネットの関連付けの編集) を選択します。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/route-table-subnet.png)

1. ルートテーブルに関連付けるサブネットのチェックボックスをオンにします。

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

### インターネットゲートウェイを作成する
<a name="create-igw"></a>

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

**インターネットゲートウェイを作成するには**

1. Amazon VPC コンソールの [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/) を開いてください。

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

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

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

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

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

1. 画面上部のバナーから **[VPC にアタッチ]** を選択し、利用可能な VPC を選択したら、**[インターネットゲートウェイをアタッチする]** を選択します。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/igw-attach-vpc.png)

1. **[VPC ID]** を選択します。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/igw-subnet-1.png)

1. **[VPC ID]** を再び選択し、VPC 詳細ページを開きます。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/igw-your-vpcs.png)

1. **[リソースマップ]** セクションまでスクロールダウンし、サブネットを選択します。サブネットの詳細は新しいタブに表示されます。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/vpc-subnets.png)

1. **[ルートテーブル]** のリンクを選択します。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/subnet-route-table.png)

1. **[ルートテーブル ID]** を選択し、ルートテーブルの詳細ページを開きます。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/route-table-id.png)

1. **[ルート]** で、**[ルートを編集する]** を選択します。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/edit-routes.png)

1. **[ルートを追加する]** を選択し、**[宛先]** ボックスに `0.0.0.0/0` と入力します。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/create-route-1.png)

1. **[ターゲット]**] には、**[インターネットゲートウェイ]** を選択し、先ほど作成したインターネットゲートウェイを選択します。サブネットに IPv6 CIDR ブロックがある場合、同じインターネットゲートウェイに `::/0` のルートも追加する必要があります。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/create-route-2.png)

1. **[Save changes]** (変更の保存) をクリックします。

### NAT ゲートウェイを作成する
<a name="create-nat-gateway"></a>

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

**NAT ゲートウェイを作成してパブリックサブネットに関連付ける方法**

1. ナビゲーションペインで **[NAT ゲートウェイ]** を選択します。

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

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

1. **[サブネット]** では、VPC のパブリックサブネットを選択します。(パブリックサブネットは、ルートテーブルにインターネットゲートウェイへの直接ルートを持つサブネットです。)
**注記**  
NAT ゲートウェイはパブリックサブネットに関連付けられていますが、ルートテーブルのエントリはプライベートサブネットにあります。

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

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

**プライベートサブネットのルートテーブルで NAT ゲートウェイにルートを追加する方法**

1. ナビゲーションペインで、[**サブネット**] を選択してください。

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

1. **[ルートテーブル]** のリンクを選択します。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/subnet-route-table.png)

1. **[ルートテーブル ID]** を選択し、ルートテーブルの詳細ページを開きます。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/route-table-id.png)

1. スクロールダウンして**[ルート]** タブを選択し、**[ルートを編集する]** を選択します。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/route-table-edit-routes.png)

1. **[ルートを追加する]** を選択し、**[宛先]** ボックスに `0.0.0.0/0` と入力します。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/create-route-1.png)

1. **[ターゲット]** には、**[NAT ゲートウェイ]** を選択し、先ほど作成した NAT ゲートウェイを選択します。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/create-route-nat.png)

1. **[Save changes]** (変更の保存) をクリックします。

### Egress-Only のインターネットゲートウェイ (IPv6 のみ) を作成する
<a name="create-egress-gateway"></a>

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

**Egress-Only インターネットゲートウェイを作成するには**

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

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

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

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

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

1. **[アタッチされた VPC ID]** のリンクを選択します。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/eigw-details.png)

1. **[VPC ID]** のリンクを選択し、VPC の詳細ページを開きます。

1. **[リソースマップ]** セクションまでスクロールダウンし、プライベートサブネットを選択します。(プライベートサブネットは、ルートテーブルにインターネットゲートウェイへのルートがないサブネットです。) サブネットの詳細は新しいタブに表示されます。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/vpc-subnet-private.png)

1. **[ルートテーブル]** のリンクを選択します。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/private-subnet-route-table.png)

1. **[ルートテーブル ID]** を選択し、ルートテーブルの詳細ページを開きます。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/route-table-id.png)

1. **[ルート]** で、**[ルートを編集する]** を選択します。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/edit-routes.png)

1. **[ルートを追加する]** を選択し、**[宛先]** ボックスに `::/0` と入力します。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/create-route-1.png)

1. **[ターゲット]** では、**[Egress Only インターネットゲートウェイ]** を選択し、先ほど作成したゲートウェイを選択します。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/eigw-route.png)

1. **[Save changes]** (変更の保存) をクリックします。

### Lambda 関数を設定
<a name="vpc-function-internet-create-existing"></a>

**関数の作成時に VPC を設定するには**

1. Lambda コンソールの [[関数]](https://console.aws.amazon.com/lambda/home#/functions) ページを開きます。

1. [**関数の作成**] を選択してください。

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

1. **[詳細設定]** を展開します。

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

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

1. **[サブネット]** では、すべてのプライベートサブネットを選択します。プライベートサブネットは、NAT ゲートウェイ経由でインターネットにアクセスできます。関数をパブリックサブネットに接続しても、インターネットにアクセスできません。
**注記**  
**[デュアルスタックサブネットの IPv6 トラフィックを許可する]** を選択した場合は、選択したすべてのサブネットに IPv4 CIDR ブロックと IPv6 CIDR ブロックが必要です。

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

1. [**関数の作成**] を選択してください。

Lambda は、「[AWSLambdaVPCAccessExecutionRole](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambdaVPCAccessExecutionRole.html)」 AWS 管理ポリシーをで実行ロールを自動的に作成します。このポリシーのアクセス許可は、VPC 設定の Elastic Network Interface を作成するためにのみに必要であり、関数を呼び出すためではありません。最小特権のアクセス許可を適用するには、関数および VPC 設定を作成した後に、実行ロールから **[AWSLambdaVPCAccessExecutionRole]** ポリシーを削除できます。詳細については、「[必要な IAM 許可](configuration-vpc.md#configuration-vpc-permissions)」を参照してください。

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

既存の関数に VPC 設定を追加するには、関数の実行ロールに [Elastic Network Interface を作成して管理する許可](configuration-vpc.md#configuration-vpc-permissions) が必要です。「[AWSLambdaVPCAccessExecutionRole](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambdaVPCAccessExecutionRole.html)」 AWS 管理ポリシーには、必要な許可が含まれています。最小特権のアクセス許可を適用するには、VPC 設定を作成した後に、実行ロールから **[AWSLambdaVPCAccessExecutionRole]** ポリシーを削除できます。

1. Lambda コンソールの [[関数ページ]](https://console.aws.amazon.com/lambda/home#/functions) を開きます。

1. 関数を選択します。

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

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

1. VPC を選択します。

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

1. **[サブネット]** では、すべてのプライベートサブネットを選択します。プライベートサブネットは、NAT ゲートウェイ経由でインターネットにアクセスできます。関数をパブリックサブネットに接続しても、インターネットにアクセスできません。
**注記**  
**[デュアルスタックサブネットの IPv6 トラフィックを許可する]** を選択した場合は、選択したすべてのサブネットに IPv4 CIDR ブロックと IPv6 CIDR ブロックが必要です。

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

1. **[保存]** を選択します。

### 関数をテストする
<a name="vpc-function-internet-test-existing"></a>

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

------
#### [ Node.js ]

1. Lambda コンソールの **[コードソース]** ペインで、次のコードを **[index.mjs]** ファイルに貼り付けます。この関数はパブリックエンドポイントに HTTP GET リクエストを行い、HTTP レスポンスコードを返し、関数がパブリックインターネットにアクセスできるかどうかをテストします。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/code-source-nodejs.png)  
**Example — async/await を持つ HTTP リクエスト**  

   ```
   const url = "https://aws.amazon.com/";
   
   export const handler = async(event) => {
       try {
           const res = await fetch(url);
           console.info("status", res.status);
           return res.status;
       }
       catch (e) {
           console.error(e);
           return 500;
       }
   };
   ```

1. **[DEPLOY]** セクションで、**[デプロイ]** を選択して関数のコードを更新します。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/getting-started-tutorial/deploy-console.png)

1. **[テスト]** タブを選択します。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/test-tab.png)

1. **[テスト]** を選択します。

1. 関数は `200` ステータスコードを返します。つまり、この関数はアウトバウンドのインターネットアクセスができることを意味します。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/test-successful-200.png)

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

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

------
#### [ Python ]

1. Lambda コンソールの **[コードソースペイン]** ペインで、次のコードを **[lambda\$1function.py]** ファイルに貼り付けます。この関数はパブリックエンドポイントに HTTP GET リクエストを行い、HTTP レスポンスコードを返し、関数がパブリックインターネットにアクセスできるかどうかをテストします。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/code-source-python.png)

   ```
   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
   ```

1. **[DEPLOY]** セクションで、**[デプロイ]** を選択して関数のコードを更新します。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/getting-started-tutorial/deploy-console.png)

1. **[テスト]** タブを選択します。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/test-tab.png)

1. **[テスト]** を選択します。

1. 関数は `200` ステータスコードを返します。つまり、この関数はアウトバウンドのインターネットアクセスができることを意味します。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/test-successful-200.png)

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

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

------