弊社では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側の設定です。(笑)
イメージはこんな感じです。
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からインターネットに抜けられるようにインターネットゲートウェイを作成します。
ここも簡単で、左メニュー「インターネットゲートウェイ」から作成します。ネームタグは「lambda_igw」で作ります。
そして、先ほど作った「lambda_vpc」にアタッチします。
次はサブネットの作成です。インターネットに接続するpublicセグメントとインターネットに直接繋げないprivateセグメント(Lambdaが入るセグメント)を作成します。
左メニューのセグメントから「サブネットの作成」を選び、以下のように2つのセグメントを作成します。
まだまだ続きます。次は左メニューから「ルートテーブル」を選び、publicサブネットからインターネットに接続できるようにインターネットゲートウェイをデフォルトゲートウェイに設定します。
ルートテーブルから作成されているルートテーブルを選び、「ルート」の「編集」をクリックし、下図のように送信先に「0.0.0.0/0」を指定し、ターゲットに先ほど作成したインターネットゲートウェイ(lambda_igw)を指定し、保存します。
ここまででインターネットに抜けれるパブリックセグメントと抜けられないプライベートセグメントが作れました。
お次は固定IPアドレスでkintoneに接続するためのNAT Gatewayを作成します。
メニューから「NATゲートウェイ」を選択し、「NAT、ゲートウェイの作成」をクリックします。
サブネット欄にカーソルを当てるとサブネットの一覧が表示されますので、先ほど作成したpublicセグメント(lambda_pub)を選択します。Elastic IPは今回は新規に作成しますので「新しいEIPの作成」を押してください。
これでNAT Gatewayの作成ができました。
最後にprivateセグメントからNAT Gateway経由でインターネットに抜けれるよう作成したNAT Gatewayをprivateセグメントのデフォルトゲートウェイに設定して上げる必要があります。
ルートテーブルから「ルートテーブルの作成」をクリックし、ネームタグを入力し、VPCに「Lambda_vpc」を選択します。
作成されたルートテーブルを選択し、「ルート」タブで「編集」をクリックし、「別ルートの追加」で以下のように送信先に「0.0.0.0/0」、ターゲットに作成したNAT Gatewayを指定し、保存します。
最後に「サブネットの関連付け」タブに移り、編集からprivateサブネットを関連付けます。
これでやっとVPCの設定が終わりました!
ここまでくればもう出来たも同然です(多分)
cybozu.com上でIP制限を設定
Lambdaの設定の前にcybozu.comの管理画面でLambdaからアクセスを許可するためにIPアドレスの制限設定を変更しましょう。(別に順番はどちらでもOKです。)
cybozu.com共通管理もしくはストア管理画面にアクセスしてください。(ここではストア管理画面で説明します。)
「ドメイン管理」からアクセスを許可したいドメインを選択し、「セキュリティと認証」からIPアドレス制限の「変更」をクリックします。
すでにIPアドレス制限をしていれば、「追加」からNAT Gatewayに紐付けたEIPを入力し、保存してください。
例えばIPアドレスが54.250.174.204であれば、IPアドレスに「54.250.174.204」、CIDRに「32」と入力してください。
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側の設定はこれだけです。要は作成したVPNを関連付けるだけですね。
これで設定は完了です!
作成したLambda functionを実行して、Lambdaからkintoneへのアクセスが成功しているかを確認してみてください。
cybozu.com共通管理の監査ログを見ると接続元IPアドレスが確認できますので、正しくNAT GatewayのIPアドレスからAPIが叩かれているかも確認してみてください。
手順は多いように見えますがLambdaからは作ったVPCを使い回せますので一度VPCの設定させしてしまえば、後は楽だと思います。
Lambdaは実行時間制限があるため、大掛かりなバッチ処理には向いていませんが、サーバーレスで外部連携できるサービスとしては魅力的なサービスだと思いますので是非一度お試しください。