VPC 内にある Lambda 関数に、インターネットへのアクセス許可を付与する方法を教えてください。

最終更新日: 2020 年 3 月 11 日

Amazon Virtual Private Cloud (Amazon VPC) に接続している AWS Lambda 関数でインターネットアクセスを許可したいと考えています。この場合の、Amazon VPC の設定方法を教えてください。

簡単な説明

Relational Database Service (Amazon RDS) DB インスタンスや Amazon Elastic Compute Cloud (Amazon EC2) インスタンスなどのプライベートな Amazon VPC リソースにアクセスするには、Amazon VPC の Lambda 関数を 1 つ以上のプライベート サブネットに関連付けます。

関数にインターネットアクセスを許可するには、関連する VPC がパブリックサブネットに NAT ゲートウェイ (または NAT インスタンス) を持っている必要があります。

注: サブネットがプライベートであるかパブリックであるかは、そのルートテーブルにより決まります。パブリックサブネットにはインターネットゲートウェイを指すルートがあり、プライベートサブネットにはありません。

解決方法

既存の Amazon VPC を使用している場合は、「VPC コンポーネントを作成する」に進み、NAT ゲートウェイを持つパブリックサブネットと 1 つ以上のプライベートサブネットを作成します。お使いの VPC に NAT ゲートウェイを持つパブリックサブネットと 1 つ以上のプライベートサブネットがすでにある場合は、「VPC 用の Lambda 実行ロールを作成する」に進んでください。

新しい VPC を作成してセットアップを行う場合は、VPC ウィザードを立ち上げて、[パブリックとプライベートサブネットを持つ VPC] をクリックします詳細については「パブリックサブネットとプライベートサブネットを持つ VPC (NAT)」をご参照ください。(Amazon VPC コンソールでは、サブネットの名前が、それぞれ「Public subnet」および「Private subnet」になります) 。 次に、「VPC 用の Lambda 実行ロールを作成する」に進みます。

VPC コンポーネントを作成する

  1. VPC に 2 つ以上の新しいサブネットを作成します。作成中に、名前タグに、どのサブネットがパブリックで、どのサブネットがプライベートであるかを識別するのに役立つ名前をつけてください。たとえば、1 つは Public Subnet、もう 1 つは Private Lambda (または複数のプライベートサブネットに、Private Lambda 1Private Lambda 2) といったように。
    注: 冗長性のため、そして Lambda が関数に対して高可用性を確保できるように、異なるアベイラビリティーゾーンにまたがって複数のプライベートサブネットを作成することをお勧めします。
  2. インターネットゲートウェイを作成して、VPC にアタッチします
  3. NAT ゲートウェイを作成します。作成中、[サブネット] で、公開するサブネットを選択します(たとえば、Public Subnet のように名前を付けているとしたらそれを選択します)。
    注: 作成後の NAT ゲートウェイのテストについては、 NAT ゲートウェイのテストをご参照ください。

サブネットのルートテーブルを作成および変更する

注: Amazon VPC に接続された Lambda 関数では、リクエストの度に関連付けられたサブネットをランダムに選択します。誤って設定されたサブネットを使用することで、Lambda がエラーをランダムに発生することを防ぐため、関数が使用するすべてのサブネットの設定は同一にする必要があります。

  1. Amazon VPC コンソールの [Route Tables ペイン]で、VPC 用に2 つのカスタムルートテーブルを作成します。
    ヒント: 作成中、[名前タグ] に名前を追加すると、ルートテーブルがどのサブネットに関連付けられているか識別しやすくできます。たとえば、1 つを Public Subnet、もう 1 つを Private Lambda といったように。
  2. パブリックサブネットルートテーブル (Public Subnet) を、パブリックにするサブネットに関連付けます。
  3. このルートテーブルに新しいルートを追加します。以下を指定してください。
    [宛先] には、0.0.0.0/0 を入力します。
    [ターゲット] で [インターネットゲートウェイ] を選択してから、作成したインターネットゲートウェイの ID (igw--123example) を選択します。
    [ルートの保存] をクリックします。関連付けられたサブネットはパブリックサブネットになりました。
  4. 他のルートテーブル (Private Lambda) をプライベートサブネットに関連付けます。
  5. このルートテーブルに新しいルートを追加します。以下を指定してください。
    [宛先] には、0.0.0.0/0 を入力します。
    [ターゲット] で [NAT ゲートウェイ] を選択してから、作成した NAT ゲートウェイの ID (nat-123example) を選択します(NAT インスタンスを使用している場合は、上記の代わりに [ネットワークインターフェイス] を選択します)。
    [ルートの保存] をクリックします。

注: NAT ゲートウェイへのルート が、active ステータスになっていることを確認してください。NAT ゲートウェイを削除した後でルートが未更新の場合、ステータスは blackhole になります。詳細については「Updating Your Route Table」をご参照ください。

ネットワーク ACL の設定

Amazon VPC の デフォルトのネットワークアクセスコントロールリスト (ACL) では、インバウンドトラフィックとアウトバウンドトラフィックがすべて許可されています。ネットワーク ACL ルールを変更した場合 (またはその予定がある場合) は、Lambda 関数からのアウトバウンドリクエストを引き続き許可してください。また、VPC の設定に応じてインバウンドトラフィックも許可します。

詳細については「Internetwork Traffic Privacy in Amazon VPC」をご参照ください。

VPC 用の Lambda 実行ロールを作成する

  1. AWS Identity and Access Management (IAM) コンソールの左側ナビゲーションペインにある [ロール] ペインで、[ロールの作成] を選択します。
  2. [ロールの作成] ページで、次の手順を実行します。
    [信頼できるエンティティの種類の選択] で、[AWS サービス] が選択されていることを確認します。
    [ユースケースを選択] で、[Lambda] を選択します。
    [次へ: アクセス許可] をクリックします。
  3. [アクセス許可ポリシーのアタッチ] の下で、AWSLambdaVPCAccessExecutionRole を検索します。その名前のポリシーを選択してから、[次へ: タグ] を選択します。
  4. 希望する場合は任意でタグを追加し、その後 [次へ: 確認] をクリックします。
  5. [レビュー] の下で、次の操作を行います。
    [ロール名] には、この Lambda 実行ロールの名前を入力します。例えば、lambda_vpc_basic_execution
    (オプション) [ロールの説明] では、必要に応じて説明を編集してください。
    [ロールの作成] を選択します。

詳細については、「AWS Lambda 実行ロール」を参照してください。

Lambda 関数を設定する

  1. Lambda コンソールの [Functions] ペインで 、Amazon VPC に接続する関数の名前を選択します。
  2. [設定] ペインの [実行ロール] で、[既存ロール] として作成した IAM 実行ロールを選択します。(例えば、lambda_vpc_basic_execution。)
  3. [設定] ペインの [VPC] で、以下の手順を実行します。
    [Virtual Private Cloud (VPC)] では、ご使用の VPC を選択します。
    [サブネット] では、作成したプライベートサブネットを選択します。サブネット ID (および名前を付けている場合は名前) でそれを識別します。
    [セキュリティグループ] では、セキュリティグループを選択します。
    注: デフォルトのセキュリティーグループはすべてのアウトバウンドインターネットトラフィックを許可するため、ほとんどのユースケースにはこれで十分です。詳しくは、「VPC のセキュリティグループ」を参照してください。
  4. [保存] をクリックします。