Lambdaの実行IPアドレスを固定し、kintoneセキュアアクセスに対応する方法

# はじめに
実際の実装方法をとにかく知りたいんだ！！！という方は、以下ブログを参照。
非常によくまとまっています。
https://www.joyzo.co.jp/blog/2325

しかし、ネットワークの話が苦手だったり、Lambda？なにそれおいしいの？という人にとって、上記ブログの内容はそれなりにハードルが高いと思います。
ということで、本記事では、上記ブログ記事の手順に至る考え方について書きます。

AWSのネットワーク構築に必要な超初歩的なことについて触れていくことになるので、AWSのネットワークについてちょっと勉強したい、という方も読んでいただけると楽しめるかもしれません。

# 対象読者
タイトルでピンときた方
kintoneのセキュアアクセスを利用しようとしている方
Lambdaで固定IPアドレスを利用する方法を知りたい方

# 前置き：そもそもなぜLambdaのIPアドレスを固定するのか
読者の知識レベルを統一するため、基本的なところから書いていきます。

## kintoneの話
kintoneでは、セキュアアクセス機能があり、アクセス元のIPアドレスを制限することができます。
つまり、事前に許可されたIPアドレスでないとkintoneにアクセスすることができなくなります。

## Lambdaの話
Lambdaは、サーバーレスなので、その名の通りサーバーがありません。

サーバーレスアーキテクチャーに馴染みのない方には分かりにくいかと思いますが、サーバーレスアーキテクチャーには、常に待機しているサーバーが存在しません。
**そのため、処理を実行するサーバーのIPアドレスを固定することができません。**

## なぜLambdaのIPアドレスを固定するのか
これらの話を統合すると、**セキュアアクセスを有効化したkintoneさんは決められたIPアドレスしか許可しないけど、Lambdaさんは、決められたIPアドレスなんて持ってないぜ、バーカバーカと言っている状況**です。

なので、Lambdaさんの実行IPアドレスを何かしらの方法で無理やり固定する必要があります。

# では、どうすればよいのか
ここから、やっと実装に近いお話です。

先ほど書いた通り、Lambdaさんはサーバーレスなので、実行するIPアドレスを固定することはできません。
ですので、その代わりに、**VPCとNAT Gatewayを活用し、LambdaさんのIPアドレスを固定しているかのように見せかけます。**

## VPCとNAT Gateway

### VPC
VPC(Virtual Private Cloud)は、AWSのネットワークのあれこれをすごく簡単かつ便利に構築＆運用できるサービスです。
サブネットワークやインターネットゲートウェイ、はたまたルーティングテーブルを簡単につくることができます。

### NAT Gateway
NAT Gatewayとは、AWSのマネージドなNATデバイスです。

NATとは、Network Address Translationの略で、IPアドレスを変換する技術です。
**今回は、Lambdaさんの実行したレスポンスのIPアドレスをNAT Gatewayさんに変換してもらい、固定のIPアドレスを利用しようという目論見です。**

この話にピンとこない方は、以下ブログをご参照してください。
http://dev.classmethod.jp/cloud/vpcfor-infra-engineer-1/

# 今回やること
先ほどご説明した通り、**VPCとNAT Gatewayを活用し、LambdaさんのIPアドレスを固定しているかのように見せかける**のが今回やりたいことの超大枠です。

これを作業ベースで分解すると、以下のようになります。

---
### 1. VPC環境の構築
<img width="608" alt="VPC.png" src="https://qiita-image-store.s3.amazonaws.com/0/137214/05424514-04e9-ce88-52d6-805585459400.png">

a. 全体のネットワーク環境をつくるためのVPCを構築
b. VPCからインターネット通信するためのインターネットゲートウェイを設置
c. VPCとインターネットゲートウェイをひも付け
d. NAT Gatewayを設置するためのpublicサブネットをVPC内に構築
e. Lambdaが入るprivateサブネットをVPC内に構築

### 2. NAT Gatewayの設定
<img width="606" alt="NAT gateway.png" src="https://qiita-image-store.s3.amazonaws.com/0/137214/e74554bb-3888-ad59-3c92-90882ea41846.png">

a. NAT Gatewayをpublicサブネットに設置
b. NAT Gatewayで変換後のIPアドレス（Elastic IP）を設定

### 3. ルーティング
<img width="604" alt="rooting.png" src="https://qiita-image-store.s3.amazonaws.com/0/137214/0ead3f76-b151-6f7d-3493-b23945c299c2.png">

a. NAT Gatewayが属するpublicサブネットとインターネットゲートウェイをルーティング
b. Lambdaが属するprivateサブネットをNAT Gatewayにルーティング

### 4. Lambdaを実行するサブネットを指定
<img width="610" alt="lambda.png" src="https://qiita-image-store.s3.amazonaws.com/0/137214/a5e3061b-4d64-cf60-e2df-44c2047c5260.png">

### 5. kintone側で、Lambdaの実行IPアドレスからのアクセスを許可
kintoneのセキュアアクセス設定画面で、NAT gatewayに割り当てたElastic IPからのアクセスを許可しましょう。

---

これが全体の設定手順の流れです。

実際のAWSコンソール上の設定画面は、冒頭で紹介した以下ブログをご覧ください。
https://www.joyzo.co.jp/blog/2325

※ちなみに本記事では、このブログ記事で設定されているIPアドレス設定などを踏襲しています。

# おわりに
設定作業をそのまま真似すれば30分で完了する作業ですが、バックグラウンドにはこれだけの知識が必要なんだよ、ということで書いてみました。

何事もそうですが、「とりあえず設定できたわーいわーい」ではなく、AWS公式ドキュメントをしっかり読み込みんだり、着実に階段をのぼりましょう・・・！ぼくも楽な方向に流されないように今後もがんばります。


### （余談）
kintone側で、Lambdaが利用するIPアドレスをレンジで指定することもできるはずです。私は実施していないですが、こちらの実装方法でも問題ありません。注意点は、Lambda側で利用するIPアドレスの仕様変更が行われると、kintoneの設定を見直さないといけなくなる可能性があること？