Node.js 12 Lambdaで HTTPClient (request)を使う方法

Node.js 12 LambdaでHTTPClientを使う

Node.jsでWebAPIなどの外部サービスへ接続する際「request」と云う使いやすいHTTP clientがあります。requestパッケージはnpmコマンドでインストールできます。ローカルで実行する場合は下記コードのように記述できます。

const request = require("request")
request.get('https://mjeld.com/', (err, resp, b1) => {
    if (!err) {
        console.log(resp)
    }
})    

コード内のconsole.log(resp)部分でWebから取得した文字列を問題なく出力できます。然し、AWSLambdaを使う場合上記のようなノンブロッキングの処理ではexports.handlerに返信できません。Lambdaの場合は、awaitPromiseを使って関数内のreturnでデータを返せるように記述します。

const request = require("request")

exports.handler = async (event) => {
    // TODO implement
    const response = {
        statusCode: 200,
        body: JSON.stringify(await new Promise((resolve, reject) => {
            request.get('https://mjeld.com/', (err, resp, b1) => {
                if (err) {
                    reject(err)
                } else {
                    resolve(resp)
                }
            })    
        })),
    };
    return response;
};

上記コードはLambdaのデフォルトで入っているexports.handler = async (event) => {}内でrequestで取得したGETデータをreturnで返す処理です。Lambdaのデフォルトではresponse.body = ‘Hello from Lambda!’と書いているのですが、その部分を置き換えています。

この方法を応用すれば、AWS Lambdaにノンブロッキングのパッケージを利用することもできます。

AWSからSMS(ショートメール)を送信する

AWSからSMS送信

SMS(ショートメール)は電話番号を宛先として短い文章を送信できる仕組みです。最近では、本人確認のためSMS(ショートメール)を使った二段階認証を用いたシステムも増えてきています。AWSでは「Amazon Simple Notification Service」というサービスが提供されていて誰でも簡単にSMS送信を試すことができます。下記はNode.jsを使ったSMS送信例です。

const AWS = require('aws-sdk');

exports.handler = async (event) => {
    let sns1 = new AWS.SNS({region : "ap-northeast-1"})
    return await sns1.publish(event).promise()
}

let aTest = exports.handler({
    Message : "Mjeld Technologies \n認証コード: xxx1",
    PhoneNumber : "+81電話番号",
    MessageAttributes : {
        'AWS.SNS.SMS.SenderID': {
        'DataType': 'String',
        'StringValue': 'MJELD'
        }
    }
})
Promise.all([aTest]).then((athreadList) => {
    athreadList.forEach(aVal => {
        console.log(aVal)
    })
})

exports.handler = async (event) => {}に実装しているのはlambdaでもテストできるように書いています。eventオブジェクトの中のMessageが本文で、PhoneNumberに+81のつく電話番号を設定します。

JavaScript 配列のソート

SafariのJavaScriptコンソールで配列ソート実行

JavaScriptはデータを連続で並べた配列という変数を持たせることができます。配列は文字列や数値とJSONを配列で扱えます。通常の変数では var a = 100と一つの値をセットしますが、配列数値の場合var a = [100, 200, 300]数値をいくつも入れることができます。たくさんのデータが入るJavaScriptの配列には、ソート(sort)という並べ替えできる機能が付いています。数値の場合[9,8,2,6,5,3]という不揃いの配列の場合ソートは下記のように記述します。

var a = [9,8,2,6,5,3]
console.log(a.sort())

SafariのJavaScriptコンソール(⌘⌥c)で実行すると下記の結果が出ました。

JavaScriptシンプルな配列ソート例
JavaScriptシンプルな配列ソート例

JavaScript配列ソートは、降順に並び替えることもできます。下記は降順した場合のお例です。

var x = [9,8,2,6,5,3]
console.log(x.sort((a,b) => {
    return (a >= b)? -1: 1 
}))

文字列も同じようにソートできます。降順でのコード例です。

var x = ["あいうえお","かきくけこ","サシスセソ"]
console.log(x.sort((a,b) => {
    return (a >= b)? -1: 1 
}))
文字列配列での降順ソート例
文字列配列での降順ソート例

文字列型“あいうえお”の変数を配列に変換した後ソートする場合

var x = "あいうえお"
x.split("").sort((a,b) => {
    return (a >= b)? -1: 1 
}).forEach(_elem => {
    console.log(_elem)
})
文字列をsplitで配列に変換し降順ソートした結果
文字列をsplitで配列に変換し降順ソートした結果

[].sort((a,b) => {})のa,bは、文字列数値以外のオブジェクトにも使えます。

文字列”あいうえお”を一旦id, valueで構造化し、その後に降順にした例です。

let x = "あいうえお"
let y = []
x.split("").sort().forEach((_elem, _index, _my) => {
    y.push({id: _index, key1: _elem})
})
console.log(y.sort((a,b) => {
    return (a.id >= b.id)? -1 : 1
}))
JavaScriptコンソールで実行
JavaScriptコンソールで実行