Slack連携による生産性向上の施策（その３）〜AWS Lambda編〜

# はじめに
こちらの記事は三部構成になっております。
- [Slack連携による生産性向上の施策（その１）〜Workflow Builder編〜](https://qiita.com/oc-arimura/items/ff4c194c617a9d309d9c)
- [Slack連携による生産性向上の施策（その２）〜Slack App編〜](https://qiita.com/oc-arimura/items/fdb6b1faca5ea1150b3a)
- [Slack連携による生産性向上の施策（その３）〜AWS Lambda編〜](https://qiita.com/oc-arimura/items/e9fb983b411b68fd941a)

また、全ての記事の内容を含んだ動画も用意しております。
動画で確認したい方は[コチラ](https://www.youtube.com/watch?v=JE7ZVJ9yE9Q)まで。
※動画開始50分頃からの内容になります。

# AWS Lambda編の概要
ここの説明になります
![スクリーンショット 2024-04-16 16.29.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763114/9bab9af7-8a76-468a-7fbc-a976886258c9.png)


# Backlog APIを利用する前に
Backlogの設定にもよりますが、弊社の場合はIPアドレスによる制限をかけています。
社内のIPアドレス、特定のIPアドレスからのみアクセスを許可しています。
![スクリーンショット 2024-04-16 17.51.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763114/7eb3fc21-62b4-05ef-f18c-eaaca5dd8194.png)

AWS Lambdaからアクセスする際にも特定IPアドレスからAPIへアクセスするように制御が必要になります。

## AWS Lambdaの特定IPアドレス化
通常のAWS Lambdaは、サーバレスなので起動のタイミングで毎回IPアドレスが変化します。
IPアドレスを固定させるには、VPC内にAWS Lambdaを用意してインターネット経由でネットワーク接続するIPを特定のアドレスで指定する必要があります。
システム構成図としては、このような形になります。
![スクリーンショット 2024-04-16 19.09.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763114/c20196f2-5b7d-bdb7-67d7-e40ea4f0123f.png)

## VPCの設定について
こちらは省略します。ネットワーク関連の仕組みは管轄外のため…

## AWS Lambdaの設定
AWS Lambdaの設定にVPCからの実行権限を付与する必要があります。
1. Lambda設定画面からアクセス権限を選択し、ロール画面へ移動
![スクリーンショット 2024-04-17 12.34.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763114/f7bf11c0-89a1-f29e-3019-671eb5895a36.png)

1. IAMロール設定画面の【許可】タブ内の【許可を追加】ボタンをクリックし、【ポリシーをアタッチ】をクリック
![スクリーンショット 2024-04-17 13.01.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763114/cf4c8203-3db5-4f92-01e0-b49d244cea86.png)

1. ポリシーアタッチ画面が表示されるので、検索テキストボックスに `lambdavpc` と入力し、絞り込みタイプ【AWS管理】を選択すると、`AWSLambdaVPCAccessExecutionRole` がリストに表示されるので、チェックボックスを選択し、【許可を追加】ボタンをクリック
![スクリーンショット 2024-04-17 15.08.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763114/31cdde51-7456-1df0-6368-026ceb01480d.png)

1. IAMロール設定画面に戻りポリシーの設定が完了
![スクリーンショット 2024-04-17 15.21.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763114/32d1c68e-6fc9-abcf-c9b0-9eb3fd67e021.png)

1. Lambda設定画面からVPCを選択し、【編集】ボタンをクリックして各VPC設定を行ったら、準備完了です
![スクリーンショット 2024-04-17 18.24.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763114/8b7884c5-3571-6315-bd32-37cea2720fa1.png)

# Backlogへのデータ登録
BacklogのAPI仕様に関しては、こちらのリンク先を参照
https://developer.nulab.com/ja/docs/backlog/api/2/add-issue/#
Lambdaのサンプルコードはコチラになります
```python:lambda_function.py
import os
import json
import requests

#--------------------------------------------------
# Backlog登録処理
# summary:チケットタイトル
# description:チケット詳細内容
# custom1:カスタムフィールド（質問フラグ）
# custom2:カスタムフィールド（発信部門）
#--------------------------------------------------
def backlog_add_issue(summary, category_id, description, custom1, custom2):
    project_id = '**[対象のプロジェクトID]**'
    issue_type_id = '**[課題タイプ]**'
    priority_id = '3'
    url = 'https://***[バックログ登録キー]***.backlog.jp/api/v2/issues'
    payload={
        'projectId': project_id,
        'issueTypeId': issue_type_id,
        'priorityId': priority_id,
        'categoryId[]': category_id,
        'summary': summary,
        'description': description,
        'customField_69109': custom1,
        'customField_69357': custom2
    }
    # BacklogAPI呼び出しキーを設定
    params = {
        'apiKey': os.environ['API_KEY'],
    }
    req = requests.post(url, params=params, data=payload)
    req.raise_for_status()
    return req
```

# Slack通知を利用する前に
## （非推奨）Incoming WebHooks の取得
2019年からSlackのカスタムインテグレーションによるWebhookは非推奨となっています。
従いまして、下記のような画面で新たに `Incoming WebHooks` を作成するのは止めましょう。
![スクリーンショット 2024-04-17 18.42.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763114/769837b1-cb70-3446-b2a7-7be8d3001f82.png)

## Slack App から Incoming Webhooks の取得
1. （その２）で作ったSlack Appの基本情報画面の左メニューから `Incoming Webhooks` リンクをクリック
![スクリーンショット 2024-04-17 19.04.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763114/3f0a02b7-9e8b-e2c6-e204-0bafd8aaaffe.png)

1. Incoming Webhooksの設定画面の `Activate Incoming Webhooks` スイッチをONに設定し、【Add New Webhook to Workspace】ボタンをクリック
![スクリーンショット 2024-04-18 14.16.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763114/7b78031f-6f38-2a37-5bc2-3d76a698cdab.png)

1. Incoming Webhooksの送信チャンネルを選択し、【Allow】ボタンをクリック
![スクリーンショット 2024-04-18 14.25.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763114/05916556-45e9-d19c-8644-0ced441e7c57.png)

1. こちらでWebhook URLが作成されるので、準備完了です。【copy】ボタンをクリックして、Webhook URLをコピーしてソースコードで利用できます
![スクリーンショット 2024-04-18 17.16.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763114/c6e09d80-c6da-2eb6-2e62-606fadaba581.png)

# Slackチャンネルへの通知
Incoming Webhookを利用したメッセージの送信方法に関しては、こちらのリンク先を参照
https://slack.dev/java-slack-sdk/guides/ja/incoming-webhooks
Lambdaのサンプルコードはコチラになります
```python:lambda_function.py
import os
import json
import requests

#--------------------------------------------------
# Slack通知関数
# notice:送信先
# message:送信メッセージ
#--------------------------------------------------
def slack_notice(notice, message):
    notice_urls = {
        '企画':os.environ['SLACK_PLANNING'],
        '営業':os.environ['SLACK_SALES'],
        '開発':os.environ['SLACK_DEVELOP']
    }
    if notice in notice_urls:
        url = notice_urls[notice]
    else:
        return
    req = requests.post(url, data=json.dumps({'text': message}), headers={'Content-Type': 'application/json'})
    req.raise_for_status()
    return req
```

# まとめ
![スクリーンショット 2024-04-26 10.38.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763114/9d05ad7b-ec97-a7c7-89fa-6f3d472b87e2.png)

３回に分けて説明となりましたが、今回用意した仕組みで

- Workflow Builderを使ってデータ入力
- Slack Appを使ってAPIへデータ送信
- Lambdaを使ってBacklogへデータ登録
- Lambdaを使ってSlackへメッセージ通知

上記４つの動きを実装することが出来るようになりました。

Slackを起因に、何か作業をすることは業務効率をより良くするものだと思いますので
これらを参考に他のAPIへ連携するなり、メールを送るなり、DBへ格納するなりやれることは無限にあります。

技術を使った生産成向上にゴールはないので、皆さんも工夫してみてください！