やること
cli-kintoneをAWS Lambdaで実行。
kintoneのレコード全件をCSV形式で出力してS3へアップロードするまで。
cli-kintoneとは
サイボウズが提供しているkintone公式のCLI(Command Line Interface)
kintone APIでは実現できないようなデータ全件取得などが提供されているのが特徴。
2019/09/18時点でv0.94だが問題なく動作するレベルだが本番環境への導入は慎重に!
環境
- ローカル(MAC)
- kintone
- cli-kintone v0.94
- AWS Service (Lambda, S3, IAM Role)
- Python 3.7
手順
cli-kintoneをダウンロード
公式cli-kintoneから最新版Linux実行ファイルlinux-x64.zip
をダウンロードする。
解凍するとbuild/linux-x64フォルダの中に実行ファイルが含まれているため、
フォルダなし版でzipを作り直す。
cd ~/Downloads
unzip linux-x64.zip
zip -jr cli-kintone.zip build/linux-x64/cli-kintone
cli-kintoneをAWS lambdaにアップロード
Lambdaのコードエントリタイプで.zipファイルをアップロード
を指定するとzipファイルをアップロードできるようになる。前項で作ったcli-kintone.zipファイルをアップロードする。

S3バケットの作成
S3に適当な名前でバケットを作成。
デフォルトのままの設定でOK!!
IAMロールにS3に配置する権限を付与
AWS Lambdaに紐づいているIAMロールに対して以下の権限を付与する。
Key | Description |
---|---|
サービス | S3 |
権限 | PutObject |
Bucket name | 作成したバケット名 |
Object name | * |

環境変数を設定
Key | Description |
---|---|
DOMAIN | kintoneのサブドメイン名 |
APP_ID | API ID |
API_KEY | API毎に発行したAPIキー |
BUCKET | s3バケット名(ARNではない) |
FILE_NAME | s3に配置するファイル名 |
Let's コーディング!!
ファイル名をlambda_function.py
で新規作成する。
import json
import subprocess
import os
import boto3
# 環境変数の読み込み
DOMAIN = os.environ["DOMAIN"]
APP_ID = os.environ["APP_ID"]
API_KEY = os.environ["API_KEY"]
BUCKET = os.environ["BUCKET"]
FILE_NAME = os.environ["FILE_NAME"]
# S3オブジェクト操作
s3 = boto3.resource("s3")
bucket = s3.Bucket(BUCKET)
def lambda_handler(event, context):
# 出力ファイル定義
file_name = FILE_NAME
output_file = f"/tmp/%s" % file_name
# cli-kintoneを実行してkintoneのアプリ情報を一時ファイルに出力する
with open(output_file, "w") as f:
cmd = f"./cli-kintone -a %s -d %s -t %s" % (APP_ID, DOMAIN, API_KEY)
res = subprocess.check_call(cmd.split(), stdout=f)
# 作成した一時ファイルをS3へファイルへアップロード
bucket.upload_file(output_file, file_name)
# レスポンス
return {
'statusCode': 200,
'body': json.dumps('OK')
}
テスト
ソースコードと適当なテストコードを保存して実行するとS3バケットにCSVファイルが出力される。

まとめ
以外と簡単にkintoneからCSVを出力してS3にアップロードできますね。
これでCloudWatchEventと組み合わせれば、CSV出力が定期的に実行できるようになります。
今回は何も触れていませんがDynamoDBと組み合わせれば、CSVで出力した内容をDynamoDBに連携することも実現できそうです。
cli-kintoneで実行するコマンドを変化させればkintoneからレコードを取得、登録も容易になります。
違うコマンド(オプション)は公式を確認してね!
良いkintone, AWSライフを!!!