ファイルのバックアップにS3を利用しています。
S3をどれぐらい容量を使っているか、毎回手動チェックするのはめんどくさいので、1日おきにSlackへ投稿するシステムを作ってみる。

プロジェクト作成

$ slss project create
 _______                             __
|   _   .-----.----.--.--.-----.----|  .-----.-----.-----.
|   |___|  -__|   _|  |  |  -__|   _|  |  -__|__ --|__ --|
|____   |_____|__|  \___/|_____|__| |__|_____|_____|_____|
|   |   |             The Serverless Application Framework
|       |                           serverless.com, v0.5.0
`-------'

Serverless: Initializing Serverless Project...
Serverless: Enter a name for this project:  (serverless-4j5kik) slssAWSChat
Serverless: Enter a new stage name for this project:  dev
Serverless: For the "dev" stage, do you want to use an existing Amazon Web Services profile or create a new one?
  > Existing Profile
    Create A New Profile
Serverless: Select a profile for your project:
  > default
Serverless: Creating stage "dev"...
Serverless: Select a new region for your stage:
  > us-east-1
    us-west-2
    eu-west-1
    eu-central-1
    ap-northeast-1
Serverless: Creating region "us-east-1" in stage "dev"...
Serverless: Deploying resources to stage "dev" in region "us-east-1" via Cloudformation (~3 minutes)...
Serverless: Successfully deployed "dev" resources to "us-east-1"
Serverless: Successfully created region "us-east-1" within stage "dev"
Serverless: Successfully created stage "dev"
Serverless: Successfully initialized project "slssAWSChat"

IAMポリシーを変更して、再度デプロイする。 変更内容は下記を追加する。

{
  "Effect": "Allow",
  "Action": [
    "s3:ListBucket",
    "s3:ListAllMyBuckets",
    "s3:GetObject"
  ],
  "Resource": "arn:aws:s3:::*"
}

Slack の Incoming WebHooks を追加する

Slack App Directory にアクセスし、Incoming WebHooks を追加する。

追加後の画像

Webhook URL は、後で使用するので、URL を控える。

Function を追加する

$ slss function create s3Report
Serverless: Please, select a runtime for this new Function
  > nodejs
    python2.7
Serverless: For this new Function, would you like to create an Endpoint, Event, or just the Function?
    Create Endpoint
  > Create Event
    Just the Function...
Serverless: Successfully created function: "s3Report"

CloudWatch Events でスケジュール実行するので、Create Event を選択する。

Function を編集

ファイルのhandler.jsを編集する。
編集内容については、slssAWSChat/handler.js at master · mizucopo/slssAWSChat を参考。

$ cd ./
$ npm install aws-sdk --save
slssAWSChat@0.0.1 /path/to/project_root
└─┬ aws-sdk@2.2.46
  ├── sax@1.1.5
  ├── xml2js@0.4.15
  └─┬ xmlbuilder@2.6.2
    └── lodash@3.5.0
$ cd ./s3Report
$ echo "{}" > ./package.json
$ npm install bluebird --save
slssAWSChat@0.0.1 /path/to/project_root
└── bluebird@3.3.4

Slack に投稿するスケジュールの登録

ファイルの./s3Report/s-function.jsoneventsを編集する。
今回は日付が変わったタイミングに投稿するようにする。 設定する際は、タイムゾーンはUTCなので注意。

"events": [
  {
    "name": "daily",
    "type": "schedule",
    "config": {
      "enabled": true,
      "schedule": "cron(0 15 * * ? *)"
    }
  }
],

デプロイする。

$ slss event deploy

Serverless: Deploying events in "dev" to the following regions: us-east-1
Serverless: Successfully deployed events in "dev" to the following regions:
Serverless: us-east-1 ------------------------
Serverless:   dailyS3Report (schedule event)

Slack に投稿されるのを確認できました。

Slack投稿イメージ

成果物の配布

今回作成したソースは、GitHub にあります。 もし使用する場合、handler.jsSLACK_CHANNELSLACK_ENDPOINTを変更してから、利用してください。

また、手探り状態で作成してきたので、アドバイス等ございましたら、GitHub の Issue などでご連絡のほどおまちしております。