Qiita API V2を使ってAWS Lambdaから投稿
春になってAWS Lambdaを使ってみたい気持ちが芽生えたので、Qiita API経由で投稿してみました。ランタイムはNode.js 6.10
です。普段JSをがっつり書いてないのでcallbackや変数宣言がこれでいいのか不安。ACCESS TOKENは環境変数でKMSを使って暗号化しました。
'use strict';
const https = require('https');
const AWS = require('aws-sdk');
const decrypt = (encrypted) => {
const kms = new AWS.KMS();
return kms.decrypt({
CiphertextBlob: new Buffer(encrypted, 'base64')
}).promise().then((data) => {
return data.Plaintext.toString('ascii');
});
};
const httpRequest = (params, postData) => {
return new Promise((resolve, reject) => {
const req = https.request(params, (res) => {
let body = [];
res.setEncoding('utf8');
res.on('data', (chunk) => {
body.push(chunk);
});
res.on('end', () => {
const ret = {
body: body.join(''),
statusCode: res.statusCode,
header: res.headers
};
resolve(ret);
});
});
req.on('error', (e) => {
console.error(e);
reject(e);
});
req.end(postData);
});
}
exports.handler = (event, context, callback) => {
const getQiitaToken = decrypt(process.env.QIITA);
// 複数の環境変数を復号化する用にPromise.all
Promise.all([getQiitaToken]).then((value) => {
const QIITA_TOKEN = value[0];
const postData = JSON.stringify({
'body': "# :sake::sake::sake::sake:\n:cherry_blossom::cherry_blossom::cherry_blossom::cherry_blossom::cherry_blossom::cherry_blossom:",
'coediting': false,
'gist': false,
'private': true,
'tags': [
{
'name': 'javascript'
}
],
'title': 'ohanami',
'tweet': false
});
const options = {
host: 'qiita.com',
port: 443,
path: '/api/v2/items',
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${QIITA_TOKEN}`
},
};
return httpRequest(options, postData);
}).then((data) => {
callback(null, data);
});
};