AWS Lambda 関数を、専用 AWS Virtual Private Cloud (VPC) に存在するリソースに接続したいと思っています。

現在のところ、AWS Lambda は専用テナント VPC での実行をサポートしていないので、専用 VPC を、Lambda 関数が存在する通常の VPC にピア接続する必要があります。

この記事は、読者が NodeJS および Lambda 関数の作成について理解していることを前提としています。

VPC の設定

  1. Amazon VPC コンソールで、デフォルトのテナントVPC を 10.0.0.0/16 CIDR ブロックで、そして専用テナント VPC を 11.0.0.0/16 CIDR ブロックで作成します。異なる CIDR ブロックを使用している場合には、デフォルトと専用 VPC が異なっていて、重複のないブロックを所有していることを確認します。(注記: デフォルトのテナント VPC のセットアップを終えていた場合には、このステップはスキップしてください)。
  2. ナビゲーションペインで [Peering Connections (ピア接続)] を選択します。
  3. [Create VPC Peering Connection (VPC のピア接続の作成)] をクリックします。
  4. [Name tag (名前タグ)] フィールドに専用テナント VPC の名前を、[Local VPC to peer (ピア接続するローカル VPC)] フィールドにデフォルトのテナント VPC の VPC ID を入力します。[My account (マイアカウント)] ラジオボタンを選択し、[VPC] フィールドに専用テナント VPC の VPC ID を入力し、[Create VPC Peering Connection (VPC のピア接続の作成)] を選択します。
  5. ルートテーブルを設定して、2 つの VPC 間のコミュニケーションを有効にします。

専用テナント VPC:

送信先 ターゲット ステータス 伝播済み
12.0.0.0/16 ローカル アクティブ 無し
11.0.0.0/16 アクティブ 無し

ピアのテナント VPC:

送信先 ターゲット ステータス 伝播済み
11.0.0.0/16 ローカル アクティブ 無し
12.0.0.0/16 アクティブ 無し

アクティブ

アクティブ

アクティブ

テスト関数を作成する

1.    デフォルトのテナント VPC と同じリージョンに、新しい Lambda 関数を作成します。次のサンプルコードでは、NodeJS のネイティブ 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);
    })
   
};

2.    lambda_basic_vpc_execution ロールを選択したことを確認します。このロールが存在しない場合には、[Create New Role (新しいロールの作成)] を選択して、次のポリシーを入力します。

{
      "Version": "2012-10-17",
      "Statement": [
          {
              "Effect": "Allow",
              "Action": [
                  "logs:CreateLogGroup",
                  "logs:CreateLogStream",
                  "logs:PutLogEvents"
              ],
              "Resource": "arn:aws:logs:*:*:*"
          },
          {
              "Effect": "Allow",
              "Action": [
                  "ec2:CreateNetworkInterface",
                  "ec2:DescribeNetworkInterfaces",
                  "ec2:DetachNetworkInterface",
                  "ec2:DeleteNetworkInterface"
              ],
              "Resource": "*"
          }
      ]
  }

3.    VPC 設定では、デフォルトのテナント VPC を選択します。

4.    [Create (作成)] を選択します。

接続性をテストする

1.    専用 VPC で EC2 インスタンス を起動します(まだ実行していなかった場合)。

2.    両方の VPC サブネットネットワークのアクセスコントロールリスト (ACL) が、テストしているポートでのトラフィックを許可していること、また EC2 インスタンスのセキュリティグループについてもそうであることを確認します。

3.    テストのために、Lambda 関数がリクエストを行える EC2 インスタンスで、サービスが動作することを確認します。Lambda 環境では ping コマンドはサポートされていないので、サーバーが HTTP リクエストに応答できるように設定します。ポート 80 に対するリスナーを動作させるには sudo コマンドが必要なので、ポート 8080 でサーバーの試験を実行し、それからポート転送を有効にします。

$ sudo iptables -A PREROUTING -t nat -p tcp --dport 80 -j REDIRECT --to-ports 8080
$ python -V
# If python version is 2.x:
$ python -m SimpleHTTPServer 8080
# If python version is 3.x
$ python -m http.server 8080

4.     の箇所を、EC2 インスタンスの IP アドレスまたはホスト名、および希望するポート番号で置き換えて、テストイベントを設定します。

{
  "Host": "<your-host>",
  "Port": <port>
}

5.    接続が成功したことを確認するため、出力に次のものと似た部分があるかチェックします。

{
  "httpStatus": 200
}

関数の出力の平均、最大、および最小レイテンシーが nil 以外の値になっていれば、VPC のピア接続は正しくセットアップされています。

接続ができない場合には、応答出力は次のものと似たものになります。

"connect ECONNREFUSED <your-host>:<port>"

このページは役に立ちましたか? はい | いいえ

AWS サポートナレッジセンターに戻る

サポートが必要ですか?AWS サポートセンターをご覧ください。

公開日: 2016 年 8 月 22 日

更新: 2018 年 4 月 10 日