Lambda 関数を専有 VPC に接続するにはどうしたらよいですか?

最終更新日: 2021 年 4 月 28 日

AWS Lambda 関数を専有の仮想プライベートクラウド (VPC) 内のリソースに接続したいと思っています。設定する方法を教えてください。

簡単な説明

Lambda は、専有テナント VPC での関数の実行をサポートしていません。Lambda 関数を専有 VPC に接続するには、まず、その関数を含むデフォルトのテナント VPC に専有 VPC をピアリングします。

このソリューションでは、Amazon Elastic Compute Cloud (Amazon EC2) のハードウェア専有インスタンスを使用する必要があります。このインスタンスにより AWS アカウントに料金の支払いが発生する点にご注意ください。Amazon EC2 インスタンスのテナントおよび VPC の詳細については、ハードウェア専有インスタンスの基礎をご参照ください。

解決方法

注: 以下の手順では、Node.jsLambda 関数の作成方法を理解する必要があります。

デフォルトのテナント VPC と専有テナント VPC を作成して設定する

注: 提供されたものとは別の CIDR ブロックを使用するように選択した場合は、2 つの VPC でブロックが重複しておらず、別々のものになっていることを確認します。

1.    Amazon VPC コンソールで、次の設定を持つデフォルトのテナント VPC を作成します。
[IPv4 CIDR block] (IPv4 CIDR ブロック) で、12.0.0.0/16 と入力します。
[Tenancy] (テナント) で、[Default] (デフォルト) を選択します。

2.    次の設定を持つ専有テナント VPC を作成します。
[IPv4 CIDR block] (IPv4 CIDR ブロック) で、11.0.0.0/16 と入力します。
[Tenancy] (テナント) で、[Dedicated] (専有) を選択します。

3.    インターネットゲートウェイを作成して、専有テナント VPC にアタッチします。
注: [Test connectivity] (接続をテスト) のセクションで、後に作成する HTTP サーバー用にインターネットゲートウェイが必要です。詳細については、インターネットアクセスを有効にするをご参照ください。

4.    各 VPC にサブネットを作成します。デフォルトのテナント VPC 用に、2 つ以上のサブネットを異なるアベイラビリティーゾーンで作成します。
注: 異なるアベイラビリティーゾーン間で複数のサブネットを作成することは、冗長性のためのベストプラクティスです。これにより、Lambda は関数に高可用性を提供することもできます。各 VPC で複数のサブネットがある場合は、VPC の CIDR ブロックのサブセットを使用します。VPC にサブネットを 1 つしか作成しない場合、VPC と同じ CIDR ブロックを使用できます。詳細については、IPv4 用の VPC とサブネットのサイズ設定をご参照ください。

5.    作成した 2 つの VPC 間で VPC ピアリング接続を作成します。[Create Peering Connection] ページで、次の操作を実行します。
(任意) [Peering connection name tag] に,、VPC ピアリング接続の名前を入力します。
[VPC (Requester)] で、作成したデフォルトテナント VPC を選択します。
[Account] で、[My account] を選択します。
[Region] で、[This region] を選択します。
[VPC (Accepter)] で、作成した専有テナント VPC を選択します。
[Create Peering Connection] を選択します。

6.    VPC ピアリング接続を承諾します

7.    次の例に示すように、新しい VPC のルートテーブルにルートを追加します。ルートテーブルを作成するときは、必ず次のことを行ってください。
pcx-... で始まる Target 値で、[Peering Connection] (ピア接続) を選択します。その後、作成したピア接続を選択します。
igw-... で始まる Target 値で、[Internet Gateway] (インターネットゲートウェイ) を選択します。その後、作成したインターネットゲートウェイを選択します。

詳細については、ルートテーブルでルートを追加および削除するをご参照ください。

デフォルトのテナント VPC ルートテーブルの例

送信先

ターゲット

ステータス

伝達済み

12.0.0.0/16

Local Active いいえ

11.0.0.0/16

pcx-1a2b3c4d5e6f7g8h9

Active

いいえ

専有テナント VPC ルートテーブルの例

送信先

ターゲット

ステータス

伝達済み

11.0.0.0/16

Local

Active

いいえ

12.0.0.0/16

pcx-1a2b3c4d5e6f7g8h9

Active

いいえ

0.0.0.0/0 igw-12345678a90b12c34 Active いいえ

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

注: Amazon VPC アクセスの Lambda 実行ロールが既に存在している場合は、このセクションはスキップしてかまいません。

1.    AWS Identity and Access Management (IAM) コンソールの左側のナビゲーションペインで、[ロール] を選択します。

2.    [Roles] (ロール) ペインで、[Create role] (ロールの作成) を選択します。

3.    [ロールの作成] ページで、次の手順を実行します。
[信頼できるエンティティの種類の選択] では、[AWS のサービス] を選択します。
[このロールを使用するサービスを選択してください] では、[Lambda] を選択します。
[Next: Permissions] (次の手順: アクセス権限) を選択します。

4.    [Attach permissions policies] (アクセス権限ポリシーのアタッチ) で、AWSLambdaVPCAccessExecutionRole を検索します。その名前のポリシーを選択してから、[Next: Tags] (次へ: タグ) を選択します。

5.    (オプション) 新しいリソースを識別して整理するためのタグを追加します。

6.    [Review] (確認) で、次のように入力します。
[Role name] (ロール名) で、この Lambda 実行ロールの名前を入力します。例えば、lambda_vpc_basic_execution です。
(オプション) [Role description] (ロールの説明) で、説明を編集します。
[Create role] (ロールの作成) を選択します。

テスト用の新しい Lambda 関数を作成する

Lambda コンソールを使用するか、独自のデプロイパッケージを構築してアップロードすることにより、新しい Lambda 関数を作成します。新しい関数を作成するときは、次のことを行ってください。

  • デフォルトテナント VPC と同じ AWS リージョンで関数を作成します。
  • 作成した実行ロール (例: lambda_vpc_basic_execution) を関数にアタッチします。

Node.js のネイティブ HTTP インターフェイスを使用する関数コードの例

var http = require('http')
     
exports.handler = (event, context, callback) => {
    const options = {
        hostname: event.Host,
        port: event.Port
    }
    
    const response = {};
    
   http.get(options, (res) => {
        response.httpStatus = res.statusCode
        callback(null, response)
    }).on('error', (err) =>{
        callback(null, err.message);
    })
   
};

Lambda 関数を VPC に接続する

1.    Lambda コンソールの [Configuration] (設定) タブで、[VPC] を選択します。その後、[Edit] (編集) を選択し、次の操作を行います。
[Virtual Private Cloud (VPC)] で、作成したデフォルトテナント VPC を選択します。
[Subnets] で、VPC のサブネットを 2 つ以上選択します。
[セキュリティグループ] では、セキュリティグループを選択します。
注: デフォルトのセキュリティグループは、ほとんどのユースケースで十分に機能します。詳細については、VPC のセキュリティグループをご参照ください。

2.    [Save] (保存) を選択します。

接続をテストする

1.    専有テナント VPC で EC2 インスタンスを起動します
注: 後でその EC2 インスタンスに接続するには、セットアップ時に割り当て可能なパブリック IPv4 アドレスが必要になります。または、セットアップ後に Elastic IP アドレスをインスタンスに関連付けることができます。ハードウェア専有インスタンスとしてサポートされている EC2 インスタンスタイプを選択する必要があります。このインスタンスにより AWS アカウントに料金の支払いが発生する点にご注意ください。

2.    両方の VPC のネットワークアクセスコントロールリスト (ACL) で次のトラフィックが許可されていることを確認します。
テストしているポート (80)。
専有 EC2 インスタンスのセキュリティグループ。

3.    EC2 インスタンスに接続します

4.    EC2 インスタンスで HTTP サーバーを起動するには、次のコマンドを実行します。

# If python version is 2.x:
$ sudo python -m SimpleHTTPServer 80
# If python version is 3.x
$ sudo python -m http.server 80

5.    Lambda コンソールで、関数用のテストイベントを設定します。イベントに次の JSON コードスニペット例を使用します。

注: yourHost を EC2 インスタンスのローカル IP アドレスに置き換えます。

{
  "Host": "yourHost",
  "Port": 80
}

6.    Lambda コンソールで、[Test] を選択します。

7.    [Details] (詳細) を選択して、200 レスポンスコードの実行結果を確認し、接続が成功したことを確認します。

サンプルの 200 レスポンスコード

{
  "statusCode": 200
}

関数出力において平均、最大、最小レイテンシーで non-nil 値が表示される場合、VPC ピアリング接続は正しく設定されています。

注: Lambda がタイムアウトしたら、セキュリティグループが正しく設定されていることを確認してくださいECONNREFUSED エラーが表示された場合、HTTP サーバーが実行されていることを確認します。