hogehogeプログラマ

PHPer。趣味ではServerless Frameworkをメインで触ってます

Serverless Frameworkを利用してTwitterに呟く

作ってみた

github.com

インストール

git clone https://github.com/hogehoge0604/serverless-twitter-bot.git
  • npm installを実行して必要なパッケージを取得します
cd serverless-twitter-bot
npm install
  • 設定ファイルを編集します
module.exports = () => {
  return {
    region: 'ap-northeast-1',
    bucket: '<S3_BUCKET_NAME>',

    // Lambda time zone
    timezone: 'Asia/Tokyo',

    // Access-Control-Allow-Origin
    origin: '*',

    twitter: {
      CONSUMER_KEY: '<CONSUMER_KEY>',
      CONSUMER_SECRET: '<CONSUMER_SECRET>',
      ACCESS_TOKEN_KEY: '<ACCESS_TOKEN_KEY>',
      ACCESS_TOKEN_SECRET: '<ACCESS_TOKEN_SECRET>'
    }
  }
}

<S3_BUCKET_NAME> = S3のバケット
<CONSUMER_KEY> = developer.twitter.comから取得したAPI keyを設定
<CONSUMER_SECRET> = developer.twitter.comから取得したAPI secret keyを設定
<ACCESS_TOKEN_KEY> = developer.twitter.comから取得したAccess tokenを設定
<ACCESS_TOKEN_SECRET> = developer.twitter.comから取得したAccess token secretを設定

  • デプロイする
serverless deploy

使い方

テキストファイルを記載したファイルをS3に格納することで
10分に一度テキストファイルをランダムに取得して、取得したファイルに記載してある文字列をツイートします
ファイルが少ないと同じ投稿が続いて、同一ツイートの連投エラーになるので注意が必要です

ThinkPadにDocker for Windowsをインストールする

Docker for Windowsをインストールしたら幾つか躓きポイントがあったので備忘録。

前提

Hyper-Vを有効化できるようBIOSの設定を変更する

Hyper-Vを有効化しようとしたら
Hyper-Vをインストールできません:ファームウェアで、仮想化サポートが無効になっています。」
と出て一部有効化できなかったので以下サポート情報をもとに設定を変更します。

f:id:hogehoge0604:20180822221326p:plain

https://support.lenovo.com/jp/ja/solutions/ht500006

ただこのサポート情報はCPUがIntelのケースで自分のPCはAMDなので
表示内容は若干違い「Security」タブの「AMD V(TM) Technology」を
「Enabled」に変更しました。

f:id:hogehoge0604:20180822221332j:plain

Hyper-Vを有効化する

「プログラムと機能」から「Windowsの機能の有効火または無効化」にアクセスし
Hyper-Vにチェックを入れて保存。再起動で有効化します。

問題発生

有効化後、何度再起動しても以下の表示が出るようになりました。
「ハードウェア設定が変更されました。変更を有効にするには、コンピューターを再起動してください」

f:id:hogehoge0604:20180822222239p:plain

「高速スタートアップ」が有効になっているとHyper-Vの変更が適切に効かないのでは
と思い無効化して再起動してみましたが結果は変わらず。
次いでサービスから「AMD External Events Utility」がスタートアップ時に起動しないよう
設定を変更したところ表示されないようになりました。
# 「高速スタートアップ」の無効化は意味があったのか否か判別がつかなかったので一応記載

Dockerをインストール

https://store.docker.com/editions/community/docker-ce-desktop-windows

後は普通にインストーラを取得してインストールします。
これでDocker for windowsが試せるようになりました。

Serverless で手軽にAWS SNSを利用する

作ってみた

github.com

インストール

  • Githubからserverless-snsを取得します
git clone https://github.com/hogehoge0604/serverless-sns.git
  • npm installを実行して必要なパッケージを取得します
cd serverless-sns
npm install
  • 設定ファイルを編集します
module.exports = () => {
  return {
    region: 'ap-northeast-1',

    sns: {
      displayname: '<DISPLAY_NAME>',
      subscription: [{
          Endpoint: '<MAIL_ADDRESS>',
          Protocol: 'email',
      }]
    }
  }
}

<DISPLAY_NAME> = SNSトピックを識別するための文字列を設定
<MAIL_ADDRESS> = メール送信先のメールアドレスを設定

  • デプロイする
serverless deploy

正常にデプロイ処理が完了したら設定したメールアドレスあてに
購読確認のメールが送られてくるのでリンクを押下すると設定完了になります

  • 試してみる

購読設定まで完了後に以下を叩くとdataに入力した件名と本文を記載した
メールが送られてきます

serverless invoke --function notification --data '{"subject": "subject test", "message": "message test"}'

用途

これ単体だとお手軽にAWS SNSを試せる点以外に特徴はないですが
うまく使えれば様々な場面で通知を組み込みやすくなるのではないかと思います

Windows Subsystem for LinuxでElasticsearchを利用する

Java8をインストールする

Javaがまだインストールされていない場合はJavaをインストールします
折角なのでJava8をインストールしたいと思います

apt-add-repository ppa:openjdk-r/ppa
apt update
apt-get install openjdk-8-jdk

以下ページを参考にさせていただきました
https://bowtips.blogspot.jp/2017/01/java-8openjdk.html

rootで実行できないのでアカウントを作成する

Elasticsearchを実行するにあたってroot権限で実行すると以下のエラーが発生します

root以外のアカウントが存在しない場合は適当なアカウントを作成します

useradd elasticsearch

ちなみに途中までrootユーザでかつ/root/フォルダの中で作業をしていて
実行時だけユーザを変更して実行したところ以下のエラーが出てしばらくハマりました

Elasticsearchを取得する

www.elastic.co 公式を参考に以下コマンドでElasticsearchを取得します

curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.2.4.tar.gz
tar -xvf elasticsearch-6.2.4.tar.gz

起動する

cd elasticsearch-6.2.4/bin
./elasticsearch

以下URLにアクセスできればインストール完了です
http://127.0.0.1:9200/

VBScriptでOutlookから本文を抽出してExcelに追記する

作ってみた

VBScriptを使ってちょっとしたツールを作成してみました github.com

概要

Outlookから件名が設定項目記載の条件に一致するメールを対象に
本文を抽出してExcelに追記するツールになります

使い方

  1. Githubからoutlook-to-excel.vbsをダウンロードする
  2. Excelファイルを新規作成する
  3. outlook-to-excel.vbsを開き抽出条件、出力先のExcelに応じて設定項目を修正する
  4. outlook-to-excel.vbsをダブルクリックする

ダブルクリックで実行後、正常終了するとExcelに追記しましたと表示されます

設定項目

設定は以下項目を設定可能です

正規表現については、条件に一致する括弧内の文字列が追記対象になります

動かしてみる

以下のようなメールが受信トレイにあったとします。

f:id:hogehoge0604:20180414014040p:plain このメール本文の■以降を抽出します。
件名と本文の抽出条件は以下のようにします

' 抽出対象の件名。設定した文字列が含まれるメールを対象とする
config.Add "pickup_title", "お問い合わせ"
' 本文抽出条件
config.Add "body_grep_rule", "■(.+)$"

outlook-to-excel.vbsを実行すると以下のような警告が出る場合がありますので許可を押してください
警告内容に不安がある場合はoutlook-to-excel.vbsのソースコードを確認したうえで
問題ないと判断できたら許可を押下いただければと思います

f:id:hogehoge0604:20180414014042p:plain

許可いただければoutlook-to-excel.vbsが実行され
Excelを開くと以下のように追加されていることが確認できます

f:id:hogehoge0604:20180414014045p:plain

VBScriptで〇〇を利用する

以下開発時に調べた内容になります

連想配列を利用する

Set dict = CreateObject("Scripting.Dictionary")

仕様は以下を参照
https://msdn.microsoft.com/ja-jp/library/cc428065.aspx

正規表現を利用する

Set reg = New RegExp
reg.Pattern = <抽出条件>
reg.Execute(<検索対象文字列>)

仕様は以下を参照
https://msdn.microsoft.com/ja-jp/library/cc392403.aspx

正規表現の仕様は以下を参照
https://msdn.microsoft.com/ja-jp/library/cc392437.aspx

Excelを利用する

Set excel = CreateObject("Excel.Application")
excel.Application.Workbooks.Open(<Excelファイルまでのパス>)

仕様は以下を参照
https://msdn.microsoft.com/ja-jp/library/office/ff198091.aspx

Outlookを利用する

Set Application = CreateObject("Outlook.Application")

仕様は以下を参照
https://msdn.microsoft.com/ja-jp/library/office/ff863377.aspx

メールから取得できるプロパティ値は以下を参照
https://msdn.microsoft.com/ja-jp/VBA/Outlook-VBA/articles/mailitem-object-outlook#%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3

serverless-client-s3を利用してS3にファイルを転送する

プラグイン導入

github.com

READMEにはnpm installが記載されていますがその通りに実行した場合
古いパッケージが取得されてデプロイすると以下のエラーが発生します

Serverless plugin "serverless-client-s3" initialization errored: S.getServerlessPath is not a function

この問題は2018/4/1時点の事象になります。そのうち修正はされると思いますが
今回はGithubからインストールすることにします

npm install --save git://github.com/serverless/serverless-client-s3.git

試してみる

プラグインがインストールできたら実際に試してみます

serverless.yml

service: serverless-client-s3-test

plugins:
  - serverless-client-s3

custom:
  client:
       bucketName: Bucket Name

provider:
  name: aws
  region: ap-northeast-1
  stage: dev

resources:
  Resources:
    S3:
      Type: AWS::S3::Bucket
      Properties:
        BucketName: ${self:custom.client.bucketName}

また、serverless.ymlと同階層にclient/dist/フォルダを作成し
その中に転送対象の資材を格納します。

格納したらデプロイ&S3への格納処理を実施する

serverless deploy
serverless client deploy

これでS3に資材が格納されました
フォルダ名を変更したい場合は、distributionFolderを設定することで変更可能です。

serverless.yml

custom:
  client:
       bucketName: Bucket Name
       # client/test/
       # distributionFolder: test

       # test/
       # distributionFolder: ../test

ファイルを削除したい場合はフォルダ内のファイルを削除して
再度serverless client deployを実行すると削除されます

Serverless FrameworkでQRコードを生成するAPIを作成する

QRコードを生成してS3に格納するAPIを作ってみました。
以下Githubになります。

github.com

README記載の手順でQRコードの作成&削除のAPIが作成できます。
以降は開発中に調べた内容になります。

ハマった点

src/create.jsにて生成したコードをS3に送信する前に
ストリームデータにサイズを設定しないと以下のようなエラーが発生します

Error: Cannot determine length of [object Object]

そこでtransform内の処理で合計サイズを取得しinputStreamに設定することで対応しました

nodejsについて詳しくないのでもう少しいい方法があったら教えていただきたいです

API Gatewayについて

API Gatewayのバイナリサポートは現状プラグインを導入する必要があるようです。
今回は画像取得用のAPIを作らず、S3の画像に直接アクセスできるように
public-read権限を付与する形で対応しました。
もしバイナリサポートを有効にしたい場合は以下のプラグインを使うといいようです。
www.npmjs.com

また、入力値のチェックはAPI GatewayではなくLambda側で処理するようにしました。
API Gateway側で制御したい場合は現状以下のようなプラグインを導入する必要があるようです。 www.npmjs.com