SNSでSlack投稿

# はじめに
SNS(手動実行) -> Lambda -> Slackにメッセージを投稿します。
動作確認メモ

# 事前に準備しておくもの
* SlackのWebフック

# 内容
## 1. SNSトピックの作成
**SNSにてトピックの作成**を行います。
※今回の場合は、トピック名・表示名は実際の投稿に反映されません。

![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/216527/f37a2215-c4c9-fbda-fda0-c15144741e3e.png)
![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/216527/e9ac73b8-37f7-3045-d709-6f73a8f7c927.png)


サブスクリプション未作成のトピックができました。


![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/216527/10b2ad58-4ea4-ef37-be7e-9bb85b0140cf.png)

## 2. Lambdaの作成
次に、Slackへ投稿するための**Lambda関数を作成**していきます。
テンプレートは使わず**一から作成**します。

![4.PNG](https://qiita-image-store.s3.amazonaws.com/0/216527/de81868f-63fc-6730-9428-8e39e2dcb574.png)

ロールは**既存のロール**を使用します。
※ロールを作っていない場合はカスタムロールの作成から設定を変更せず作成してください。

![5.PNG](https://qiita-image-store.s3.amazonaws.com/0/216527/d3c0ed1b-5899-1909-024a-514812444825.png)

コードを添付します。今回は**Node.js 6.10**を使用しています。
　*※コードは過去に記載されていたものを参考にしています。*
　　*コード内容は今回の本題ではありません。*

~~~ js
console.log('Loading function');

const https = require('https');
const url = require('url');
const slack_url = 'https://hooks.ここにwebフックを記載';
const slack_req_opts = url.parse(slack_url);
slack_req_opts.method = 'POST';
slack_req_opts.headers = {'Content-Type': 'application/json'};

exports.handler = function(event, context) {
  (event.Records || []).forEach(function (rec) {
    if (rec.Sns) {
      var req = https.request(slack_req_opts, function (res) {
        if (res.statusCode === 200) {
          context.succeed('posted to slack');
        } else {
          context.fail('status code: ' + res.statusCode);
        }
      });
      req.on('error', function(e) {
        console.log('problem with request: ' + e.message);
        context.fail(e.message);
      });
      req.write(JSON.stringify({text: JSON.stringify(rec.Sns.Message, null, '  ')}));
      req.end();
    }
  });
};
~~~


![6.PNG](https://qiita-image-store.s3.amazonaws.com/0/216527/34090022-0f40-bfa2-5e8f-e057fbdf44d0.png)


**トリガーを追加**します。
**SNSトピックを選択し最初に作成したSNSトピック名を設定**します。

![7.PNG](https://qiita-image-store.s3.amazonaws.com/0/216527/efbcc468-1c30-2c9e-a6fe-2911fe9538dd.png)

![8.PNG](https://qiita-image-store.s3.amazonaws.com/0/216527/202764cf-8b84-027d-062d-a6ceaed2adf4.png)
![9.PNG](https://qiita-image-store.s3.amazonaws.com/0/216527/a45a4a8c-83c9-2178-db91-f061a0332d77.png)

**テストを行い保存**します。
**SNSテンプレートを選択し実行**してください。

![10.PNG](https://qiita-image-store.s3.amazonaws.com/0/216527/70bc652e-7a19-0d52-9209-4f4db2e3d001.png)
![11.PNG](https://qiita-image-store.s3.amazonaws.com/0/216527/a15ee239-8a09-ba56-9e79-11950e912049.png)

**Lambda関数が作成されました。**

![12.PNG](https://qiita-image-store.s3.amazonaws.com/0/216527/ef3a6891-5e4e-3495-216f-0936250b7d90.png)

## 3. SNSトピックを発行しSlackへ投稿（検証）

SNSトピックに戻ると未設定だったサブスクリプションに
**先ほど作成したLambda関数が設定されています。**

さっそく**トピックに発行**を実行してみましょう。

![13.PNG](https://qiita-image-store.s3.amazonaws.com/0/216527/0af8d37d-4cf5-f93b-4cdc-11c568672e1e.png)


**本文を記載し、メッセージの発行を押下します。**


![14.PNG](https://qiita-image-store.s3.amazonaws.com/0/216527/93e54809-89fb-0cbf-d9c2-787a5eff5fd0.png)

**Slackへの投稿が確認できました。**
お疲れさまでした。

![15.PNG](https://qiita-image-store.s3.amazonaws.com/0/216527/fe817163-d95e-1899-0458-d667eb9aa6f8.png)



# まとめ、その他感想など
* SNSに設定した任意のメッセージをSlackへ投稿することができました。

* 今回作成した内容を部品とし、応用することが可能なので今後試していきたいと思います。
    * 例1） 特定のサービス -> Lambda -> [SNS -> Lambda -> Slack]
    * 例2） CloudWatch -> [SNS -> Lambda -> Slack]