弊社ではkintone(キントーン)のカスタマイズ開発でスケジューリングが必要なバッチ処理が発生した場合にAWS Lambdaを利用することがあります。

Lambdaはnode.jsに対応しているため、kintoneで日頃JavaScriptで開発している我々としても扱いやすく、また何よりもサーバーレスでコードを実行できるのでkintoneとの相性も非常に良いサービスです。

ただし、Lambda上でLambda functionを実行し、kintoneからデータを取得し、加工処理をしてからkintoneにデータを戻すといった連携を行う場合、kintone(正確にはcybozu.com基盤)上でIPアドレス制限をかけているとLambda側からkintoneへのAPIアクセスができなくなるというちょっと困った状況に陥ります。

Lambdaが利用しているグローバルIPアドレスを.com側の許可IPリストに入れればOKのように思いますが、Lambdaが利用するIPアドレスのレンジがとても広く、またレンジも日々変更が入ってくるため、とても管理ができる状況ではありません。

対応策として、APIを実行するユーザーにクライアント証明書を発行して、セキュアアクセス経由で接続するという方法もありますが、そうするとセAPIトークンが使えないといったデメリットも発生します。
※それでもセキュアアクセスのほうが良いという声がありましたら、そちらの方法も別途ブログにアップしますのでご連絡ください。(笑)

VPCとNAT Gatewayを利用してLambdaからkintoneに接続!

Lambdaに固定IPアドレス(以下、EIP)を割り振れれば良いのですが、もちろんそのような設定はできません。

それが、先日Lambdaで設定可能になったVPCとNAT Gatewayを利用することでLambdaから固定IPアドレスを使ってkitnoneに連携することが出来るようになりましたので、今回はその設定方法をご紹介したいと思います。
 ※kintone – Lambda連携あるあるですが、今回は98% AWS側の設定です。(笑)

イメージはこんな感じです。

Lambda-kintone

 

VPCにNAT Gatewayを作り、そのNAT GatewayにEIPを割り当てます。

Lambdaはprivateセグメントを経由し、そこからpublicセグメントにあるNAT Gateway経由でkintoneにアクセスするようにさせます。
.com側でNAT GatewayのEIPをアクセス許可リストに入れれば、無事、Lambdaからkintoneへの接続ができるようになります。

今回は以下の様なネットワークの前提で設定方法を書いていきたいと思います。

 

VPC 10.0.0.0/16

 

セグメント サブネット
public subnet 10.0.10.0/24
private subnet 10.0.1.0/24

 

VPCの設定

まずはVPCの設定です。ここの設定が全体の8割を締めます。

最初にLambda専用のVPCを作ります。左メニューからVPCを選択して、「VPCの作成」から作ります。
今回は「lambda_vpc」というネームタグでCIDRは「10.0.0.0/16」で作成します。

VPC-1

VPC-2

次にVPCからインターネットに抜けられるようにインターネットゲートウェイを作成します。
ここも簡単で、左メニュー「インターネットゲートウェイ」から作成します。ネームタグは「lambda_igw」で作ります。

VPC-4

VPC-5

そして、先ほど作った「lambda_vpc」にアタッチします。

VPC-6

次はサブネットの作成です。インターネットに接続するpublicセグメントとインターネットに直接繋げないprivateセグメント(Lambdaが入るセグメント)を作成します。

左メニューのセグメントから「サブネットの作成」を選び、以下のように2つのセグメントを作成します。

【publicセグメント】
VPC-8-2

【privateセグメント】
VPC-8

まだまだ続きます。次は左メニューから「ルートテーブル」を選び、publicサブネットからインターネットに接続できるようにインターネットゲートウェイをデフォルトゲートウェイに設定します。

ルートテーブルから作成されているルートテーブルを選び、「ルート」の「編集」をクリックし、下図のように送信先に「0.0.0.0/0」を指定し、ターゲットに先ほど作成したインターネットゲートウェイ(lambda_igw)を指定し、保存します。

VPC-10

ここまででインターネットに抜けれるパブリックセグメントと抜けられないプライベートセグメントが作れました。

お次は固定IPアドレスでkintoneに接続するためのNAT Gatewayを作成します。

メニューから「NATゲートウェイ」を選択し、「NAT、ゲートウェイの作成」をクリックします。

VPC-11

サブネット欄にカーソルを当てるとサブネットの一覧が表示されますので、先ほど作成したpublicセグメント(lambda_pub)を選択します。Elastic IPは今回は新規に作成しますので「新しいEIPの作成」を押してください。

VPC-12

VPC-13

これでNAT Gatewayの作成ができました。

最後にprivateセグメントからNAT Gateway経由でインターネットに抜けれるよう作成したNAT Gatewayをprivateセグメントのデフォルトゲートウェイに設定して上げる必要があります。

ルートテーブルから「ルートテーブルの作成」をクリックし、ネームタグを入力し、VPCに「Lambda_vpc」を選択します。

VPC-14

作成されたルートテーブルを選択し、「ルート」タブで「編集」をクリックし、「別ルートの追加」で以下のように送信先に「0.0.0.0/0」、ターゲットに作成したNAT Gatewayを指定し、保存します。

VPC-15

最後に「サブネットの関連付け」タブに移り、編集からprivateサブネットを関連付けます。

VPC-16

これでやっとVPCの設定が終わりました!

ここまでくればもう出来たも同然です(多分)

cybozu.com上でIP制限を設定

Lambdaの設定の前にcybozu.comの管理画面でLambdaからアクセスを許可するためにIPアドレスの制限設定を変更しましょう。(別に順番はどちらでもOKです。)

cybozu.com共通管理もしくはストア管理画面にアクセスしてください。(ここではストア管理画面で説明します。)

「ドメイン管理」からアクセスを許可したいドメインを選択し、「セキュリティと認証」からIPアドレス制限の「変更」をクリックします。

cybozu-01

すでにIPアドレス制限をしていれば、「追加」からNAT Gatewayに紐付けたEIPを入力し、保存してください。

例えばIPアドレスが54.250.174.204であれば、IPアドレスに「54.250.174.204」、CIDRに「32」と入力してください。

cybozu-02

Lambdaの設定

最後にLambdaの設定です。

今回は、Lambdaから固定IPアドレスでkintoneに接続する部分にフォーカスしますので、Lambda functionの細かな作成方法は省略させていただき、今回はkintoneとの連携テストにはdeveloper networkの「AWS Lambda 連携 -PDF変換ツールを作ってみた-」を参考にしてください。

また、事前にLambda関数に割り当てるIAMロールにVPCアクセスのためのポリシー「AWSLambdaVPCAccessExecutionRole」をアタッチしておきます。

もしくは、以下の内容を手動で追加します。
ec2:CreateNetworkInterface
ec2:DescribeNetworkInterfaces
ec2:DeleteNetworkInterface

ここでは基本的なLambda functionの設定方法は省き、VPC設定部分だけを説明します。

作成画面でNameやRuntime、Handlerなど必要な設定を行った後に「VPC」という項目がありますので、ここで作成した「lambda_vpc」を選択します。

続いてSubnetsにはprivateサブネット経由で固定IPを持ったNAT Gateway経由でkintoneにアクセスさせるのでprivateサブネットを選択します。
 ※なお、今はNode.jsのバージョンは4.3がデフォルトとなっていますが、developer networkで書かれている記事は4.3では動作しませんのでテストをする場合は、Runtimeは0.10でお試しください。

Lambda-3

Lambda側の設定はこれだけです。要は作成したVPNを関連付けるだけですね。

これで設定は完了です!

作成したLambda functionを実行して、Lambdaからkintoneへのアクセスが成功しているかを確認してみてください。

cybozu.com共通管理の監査ログを見ると接続元IPアドレスが確認できますので、正しくNAT GatewayのIPアドレスからAPIが叩かれているかも確認してみてください。

 

手順は多いように見えますがLambdaからは作ったVPCを使い回せますので一度VPCの設定させしてしまえば、後は楽だと思います。

Lambdaは実行時間制限があるため、大掛かりなバッチ処理には向いていませんが、サーバーレスで外部連携できるサービスとしては魅力的なサービスだと思いますので是非一度お試しください。

 


株式会社ジョイゾー