

# Amazon MSK クラスターおよび Amazon VPC ネットワークの Lambda 向け設定
<a name="with-msk-cluster-network"></a>

AWS Lambda 関数を Amazon MSK クラスターに接続するには、クラスターおよびクラスターが存在する [Amazon 仮想プライベートクラウド (VPC)](https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html) を正しく設定する必要があります。このページでは、クラスターおよび VPC を設定する方法について説明します。クラスターおよび VPC が既に正しく設定されている場合、「[Lambda での Amazon MSK イベントソースの設定](with-msk-configure.md)」を参照してイベントソースマッピングを設定します。

**Topics**
+ [Lambda と MSK の統合におけるネットワーク設定要件の概要](#msk-network-requirements)
+ [MSK イベントソース向け NAT ゲートウェイの設定](#msk-nat-gateway)
+ [MSK イベントソースの AWS PrivateLink エンドポイントの設定](#msk-vpc-privatelink)

## Lambda と MSK の統合におけるネットワーク設定要件の概要
<a name="msk-network-requirements"></a>

Lambda と MSK の統合に必要なネットワーク設定は、アプリケーションのネットワークアーキテクチャによって異なります。この統合には、Amazon MSK クラスター、Lambda 関数、Lambda イベントソースマッピングの 3 つの主要リソースが関与しています。これらのリソースはそれぞれ異なる VPC に存在します。
+ Amazon MSK クラスターは通常、管理する VPC のプライベートサブネットに存在します。
+ Lambda 関数は、Lambda が所有する AWS マネージド VPC に存在します。
+ Lambda イベントソースマッピングは、関数を含む VPC とは別に、Lambda が所有する別の AWS マネージド VPC に存在します。

[イベントソースマッピング](invocation-eventsourcemapping.md)は、MSK クラスターと Lambda 関数間の中間リソースです。イベントソースマッピングは 2 つのプライマリジョブ機能を果たします。まず、MSK クラスターに新しいメッセージをポーリングします。次に、これらのメッセージを使用して Lambda 関数を呼び出します。これらの 3 つのリソースはそれぞれ異なる VPC に存在するため、ポーリングおよび呼び出しのオペレーションの両方にクロス VPC ネットワークコールが必要となります。

次の図で示すように、イベントソースマッピングのネットワーク設定要件は、[プロビジョニングモード](invocation-eventsourcemapping.md#invocation-eventsourcemapping-provisioned-mode)とオンデマンドモードのいずれを使用するかによって異なります。

![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/MSK-esm-network-overview.png)


Lambda イベントソースマッピングが MSK クラスターに新しいメッセージをポーリングする方法は、どちらのモードでも同じです。イベントソースマッピングと MSK クラスター間の接続を確立するため、Lambda はプライベートサブネットに[ハイパープレーン ENI](configuration-vpc.md#configuration-vpc-enis) (または、利用可能な場合は既存の ENI を再利用) を作成し、セキュリティで保護された接続を確立します。この図にあるように、ハイパープレーン ENI は Lambda 関数ではなく、MSK クラスターのサブネットおよびセキュリティグループ設定を使用します。

クラスターからのメッセージのポーリング後に Lambda が関数を呼び出す方法はモードごとに異なります。
+ プロビジョニングモードでは、Lambda はイベントソースマッピング VPC と関数 VPC 間の接続を自動的に処理します。したがって、関数を正常に呼び出すための追加のネットワークコンポーネントは不要です。
+ オンデマンドモードでは、Lambda イベントソースマッピングは、カスタマーマネージド型 VPC を経由するパスを介して関数を呼び出します。そのため、VPC のパブリックサブネットに [NAT ゲートウェイ](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html)を設定するか、あるいは Lambda、[AWS Security Token Service (STS)](https://docs.aws.amazon.com/STS/latest/APIReference/welcome.html)、および (必要に応じて) [AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) へのアクセスを提供する VPC のプライベートサブネットに [AWS PrivateLink](https://docs.aws.amazon.com/vpc/latest/privatelink/what-is-privatelink.html) エンドポイントを設定する必要があります。これらのオプションのどちらかを正しく設定することで、関数の呼び出しに必要な VPC と Lambda マネージドランタイム VPC 間の接続が可能になります。

NAT ゲートウェイは、プライベートサブネットのリソースがパブリックインターネットにアクセスできるようにします。この設定を使用した場合、トラフィックは Lambda 関数の呼び出し前にインターネットを経由します。一方、AWS PrivateLink エンドポイントはパブリックインターネットを経由しないので、プライベートサブネットから AWS サービスやその他のプライベート VPC リソースに安全に接続できます。これらのリソースの設定方法の詳細については、「[MSK イベントソース向け NAT ゲートウェイの設定](#msk-nat-gateway)」または「[MSK イベントソースの AWS PrivateLink エンドポイントの設定](#msk-vpc-privatelink)」を参照してください。

ここまでの説明は、MSK クラスターが VPC 内のプライベートサブネットに存在することを前提としており、これがより一般的なケースです。ただし、MSK クラスターが VPC 内のパブリックサブネットにあっても安全な接続を有効にするには、AWS PrivateLink エンドポイントを設定する必要があります。次の表は、MSK クラスターおよび Lambda イベントソースマッピングの設定方法に応じたネットワーク設定の要件をまとめたものです。


| MSK クラスターの場所 (カスタマーマネージド型 VPC 内) | Lambda イベントソースマッピングのスケーリングモード | 必要なネットワーク設定 | 
| --- | --- | --- | 
|  プライベートサブネット  |  オンデマンドモード  |  Lambda、AWS STS、および (必要に応じて) Secrets Manager へのアクセスを有効にする NAT ゲートウェイ (VPC のパブリックサブネット内) または AWS PrivateLink エンドポイント (VPC のプライベートサブネット内)。  | 
|  [Public subnet] (パブリックサブネット)  |  オンデマンドモード  |  Lambda、AWS STS、および (必要に応じて) Secrets Manager へのアクセスを有効にする AWS PrivateLink エンドポイント (VPC のパブリックサブネット内)。  | 
|  プライベートサブネット  |  プロビジョンドモード  |  なし  | 
|  [Public subnet] (パブリックサブネット)  |  プロビジョンドモード  |  なし  | 

さらに、MSK クラスターに関連付けられたセキュリティグループは、正しいポート経由でのトラフィックを許可する必要があります。次のセキュリティグループのルールが設定されていることを確認してください。
+ **インバウンドルール** – デフォルトのブローカーポートですべてのトラフィックを許可します。MSK が使用するポートは、クラスターの認証タイプによって異なります。IAM 認証の場合は `9098`、SASL/SCRAM の場合は `9096`、TLS の場合は `9094` を使用します。または、自己参照セキュリティグループルールを使用して、同じセキュリティグループ内のインスタンスからのアクセスを許可することもできます。
+ **アウトバウンドルール** – 関数が他の AWS サービスと通信する必要がある場合、外部の送信先の場合はポート `443` ですべてのトラフィックを許可します。逆に他の AWS サービスと通信する必要がない場合は、自己参照セキュリティグループのルールを使用してブローカーへのアクセスを制限することもできます。
+ **Amazon VPC エンドポイントのインバウンドルール** – Amazon VPC エンドポイントを使用している場合、そのエンドポイントに関連付けられたセキュリティグループは、クラスターのセキュリティグループからポート `443` でインバウンドトラフィックを許可する必要があります。

## MSK イベントソース向け NAT ゲートウェイの設定
<a name="msk-nat-gateway"></a>

イベントソースマッピングがクラスターからメッセージをポーリングできるように NAT ゲートウェイを設定し、VPC を経由するパスを介して関数を呼び出すことができます。この操作は、イベントソースマッピングがオンデマンドモードを使用しており、かつクラスターが VPC のプライベートサブネット内に存在する場合にのみ必要となります。クラスターが VPC のパブリックサブネットに存在するか、またはイベントソースマッピングがプロビジョニングモードを使用している場合、NAT ゲートウェイを設定する必要はありません。

[NAT ゲートウェイ](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html)は、プライベートサブネットのリソースがパブリックインターネットにアクセスできるようにします。Lambda へのプライベート接続が必要な場合は、「[MSK イベントソースの AWS PrivateLink エンドポイントの設定](#msk-vpc-privatelink)」を参照してください。

NAT ゲートウェイを設定したら、適切なルートテーブルを設定する必要があります。これにより、プライベートサブネットからのトラフィックを NAT ゲートウェイ経由でパブリックインターネットにルーティングできるようになります。

![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/MSK-NAT-Gateway.png)


次の手順では、コンソールを使用して NAT ゲートウェイを設定する方法について説明します。必要に応じて、各アベイラビリティーゾーン (AZ) にこの手順を繰り返します。

**NAT ゲートウェイと適切なルーティングを設定する方法 (コンソール)**

1. 次の点に注意して、「[NAT ゲートウェイを作成する](https://docs.aws.amazon.com/vpc/latest/userguide/nat-gateway-working-with.html)」の手順を実行してください。
   + NAT ゲートウェイは常にパブリックサブネットに存在する必要があります。[パブリック接続](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html)で NAT ゲートウェイを作成します。
   + MSK クラスターが複数の AZ 間でレプリケートされている場合、それぞれの AZ に 1 つの NAT ゲートウェイを作成します。つまり、各 AZ に、クラスターを含むプライベートサブネット 1 つと NAT ゲートウェイを含むパブリックサブネット 1 つが VPC に必要です。例えば 3 つの AZ でセットアップする場合、3 つのプライベートサブネット、3 つのパブリックサブネット、3 つの NAT ゲートウェイが必要になります。

1. NAT ゲートウェイを作成したら、[Amazon VPC コンソール](https://console.aws.amazon.com/vpc/)を開き、左側のメニューで **[ルートテーブル]** を選択します。

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

1. このルートテーブルは、MSK クラスターを含む VPC に関連付けます。必要に応じて、ルートテーブルの名前を入力します。

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

1. 先ほど作成したルートテーブルを選択します。

1. **[サブネットの関連付け]** タブで、**[サブネットの関連付けの編集]** を選択します。
   + ルートテーブルを、MSK クラスターを含むプライベートサブネットに関連付けます。

1. [**Export routes**] (ルートのエクスポート) を選択します。

1. **[ルートの追加]** を選択します。

   1. [**Destination**] で、[`0.0.0.0/0`] を選択します。

   1. **[ターゲット]** に **[NAT ゲートウェイ]** を選択します。

   1. 検索ボックスで、手順 1 で作成した NAT ゲートウェイを選択します。これは、MSK クラスターを含むプライベートサブネット (手順 6 でこのルートテーブルに関連付けられたプライベートサブネット) と同じ AZ 内の NAT ゲートウェイである必要があります。

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

## MSK イベントソースの AWS PrivateLink エンドポイントの設定
<a name="msk-vpc-privatelink"></a>

クラスターからメッセージをポーリングし、VPC を経由するパスを介して関数を呼び出す AWS PrivateLink エンドポイントを設定します。これらのエンドポイントにより、MSK クラスターが次の内容にアクセスできるようにします。
+ Lambda サービス
+ [AWS Security Token Service (STS)](https://docs.aws.amazon.com/STS/latest/APIReference/welcome.html)
+ 必要に応じて、[AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) サービス。これは、クラスター認証に必要なシークレットが Secrets Manager に保存されている場合に必要になります。

PrivateLink エンドポイントの設定は、イベントソースマッピングがオンデマンドモードを使用している場合にのみ必要です。イベントソースマッピングがプロビジョニングモードを使用している場合、Lambda がユーザーに代わって必要な接続を確立します。

PrivateLink エンドポイントを使用すると、AWS PrivateLink を経由して AWS サービスへの安全なプライベートアクセスが可能になります。MSK クラスターにパブリックインターネットへのアクセスを許可するように NAT ゲートウェイを設定するには、「[MSK イベントソース向け NAT ゲートウェイの設定](#msk-nat-gateway)」を参照してください。

VPC エンドポイントを設定すると、MSK クラスターに対して Lambda、STS、および (必要に応じて) Secrets Manager への直接かつプライベートのアクセス権が付与されます。

![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/MSK-PrivateLink-Endpoints.png)


次の手順では、コンソールを使用して PrivateLink エンドポイントを設定する方法について説明します。必要に応じて、各エンドポイント (Lambda、STS、Secrets Manager) にこの手順を繰り返します。

**VPC PrivateLink エンドポイントを設定する方法 (コンソール)**

1. [Amazon VPC コンソール](https://console.aws.amazon.com/vpc/)を開き、左側のメニューで **[エンドポイント]** を選択します。

1. **エンドポイントの作成** を選択します。

1. 必要に応じて、エンドポイントの名前を入力します。

1. **[タイプ]** には **[AWS サービス]** を選択します。

1. **[サービス]** で、サービスの名前を入力します。例えば、Lambda に接続するエンドポイントを作成するには、検索ボックスに「`lambda`」と入力します。

1. 結果には、現在のリージョンのサービスエンドポイントが表示されます。例えば、米国東部 (バージニア北部) リージョンでは、「`com.amazonaws.us-east-2.lambda`」が表示されます。このサービスを選択します。

1. **[ネットワーク設定]** で、MSK クラスターを含む VPC を選択します。

1. **[サブネット]** で、MSK クラスターが存在する AZ を選択します。
   + 各 AZ の **[サブネット ID]** で、MSK クラスターを含むプライベートサブネットを選択します。

1. **[セキュリティグループ]** で、MSK クラスターに関連付けられたセキュリティグループを選択します。

1. **エンドポイントの作成** を選択します。

デフォルトでは、Amazon VPC エンドポイントには、リソースへの広範なアクセスを許可するオープンな IAM ポリシーが適用されています。そのエンドポイントを使用して必要なアクションを実行するためのベストプラクティスは、これらのポリシーを制限することです。例えば、Secrets Manager エンドポイントの場合、関数の実行ロールのみがシークレットにアクセスできるようにポリシーを変更できます。

**Example VPC エンドポイントポリシー - Secrets Manager エンドポイント**  

```
{
    "Statement": [
        {
            "Action": "secretsmanager:GetSecretValue",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws::iam::123456789012:role/my-role"
                ]
            },
            "Resource": "arn:aws::secretsmanager:us-west-2:123456789012:secret:my-secret"
        }
    ]
}
```

AWS STS および Lambda エンドポイントの場合、呼び出し元プリンシパルを Lambda サービスプリンシパルのみに制限できます。ただし、これらのポリシーには必ず `"Resource": "*"` を使用してください。

**Example VPC エンドポイントポリシー - AWS STS エンドポイント**  

```
{
    "Statement": [
        {
            "Action": "sts:AssumeRole",
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "lambda.amazonaws.com"
                ]
            },
            "Resource": "*"
        }
    ]
}
```

**Example VPC エンドポイントポリシー – Lambda エンドポイント**  

```
{
    "Statement": [
        {
            "Action": "lambda:InvokeFunction",
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "lambda.amazonaws.com"
                ]
            },
            "Resource": "*"
        }
    ]
}
```