今回はメールをSlackに転送して読む方法を紹介します。
コラボレーションツールとして利用されるシーンも多くなったSlack。
一方で仕事上のお客様とか場合によっては内部でもメールでのやりとりも続いているのがほとんどです。
そんな中でメールもSlackも見てると結構めんどくさいな?と思ったりしません。
僕は思っちゃいます。
どうせならチェックする箇所は一か所にしたいなと。
とういうことで今回は実際に僕もやっているメールをSlackに連携して、Slackで確認する方法を紹介します。
やりたいことがわかっている人は、目次をクリックすると該当の説明部分にジャンプできます。
もくじ(クリックするとジャンプします)
メールをSlackに転送して読む方法
Slackでのやりとがメインになってくると、できるだけSlack上で解決できたらいいのになーなんんて思うことありませんか?
そんな思いがでてきたので、まずはメールをSlackで確認できるようにしてみました。
僕自身が見つけたやり方は2通り。
簡単なものとちょっと手間なものとあります。
やり方は2通り
自分に届いたメールをSlackで確認する方法は次の2通りです。
- Slackの標準アプリ(Email)を使う
- AWSサービス(SES/Route53/S3/Lambda)を組み合わせて使う
前者はSlackの標準機能なので、無料で利用できます。
後者のAWSサービスを使う場合には多少の費用が必要ですが、それでも月額で$1-$2(約110円~220円)くらいで済みます。
それに加えてAWSサービスの多少の知識とプログラミングのスキルが必要です。
それぞれのやり方を説明していきます。
Slack標準機能でのやり方
Slackでの標準機能のやり方はとても簡単。
▲SlackのAppディレクトリ(https://自分のワークスペース/apps)を開きます。
▲検索バーが(虫眼鏡がある入力できる箇所)あるので、そこに「Email」と入力します。
▲メールを投稿したいチャンネルを選択します。
この設定をするとメールアドレスが割り振られます。
割り振られれたメールアドレスにメールを転送もしくは送信するとSlackの該当チャンネルに表示される仕組みです。
「Email」を「Slackに追加」するだけです。
そうするとメールアドレスが準備され、そこに紐づけるチャンネルを設定します。
自分のメールボックスに届いたのでSlackで見たいものをルール処理などでSlackから割り当てられたメールに転送するようにすれば完成です。
1チャンネルにつき、1メールアドレスが必要になります。
なので、チャンネル複数に投稿したい場合には、それぞれのチャンネルごとにメールアドレスを準備する必要があります。
なお、Slackのメールアプリを使う場合の制約などは以下になります。
(SlackのEmailアプリのページにも記載あり)
- 1チャンネルにつき1つのアプリ設定(インテグレーション)が必要
- メールのヘッダーと文章は合わせて 1 MB 以下
- 添付ファイルありの場合は30MB以下
- メールにつけられる添付ファイルは最大 20 件まで
またメールの内容をSlack投稿の添付ファイルとして扱ってSlack上で表示されます。
AWSサービスを使ったやり方
続いてはAWSにあるサービスを連携させてSlackに表示させるやり方です。
ここは少し前提があります。
以下前提をクリアしている人はすんなりできると思います。
クリアしてない人は、色々ほかで調べたりしないとうまくできない可能性があります。
- 自分で自由に使えるAWSアカウントをすでに持っている
- ある程度のAWSサービスのことを調べて自分で理解できる
- Pythonのコードをなんとなく理解できる
今回の仕組みを説明すると、
メールを受信できるドメインをRoute53に登録。
登録したドメインをもとにSESでメール受信ルールを設定。
S3にSESで受けるメールを保管するバケットとプレフィックスを作成して、イベントトリガーでLambdaを実行。
Lambdaにてメール内容を解析してSlackに投稿。
といった流れになります。
順を追って手順と利用したAWSサービスについて簡単な説明を書いていきます。
手順1.ドメインを取得してRoute53に登録する
まずはメールを送信するためのドメインをRoute53に登録します。
AWSが提供するDNSサービスです。
ドメインを登録して様々なサービスでDNS問い合わせに使えるように設定・管理を行えるサービスです
今回の使い方であればホストゾーンの管理料金が毎月$0.5かかる程度です。
参考
Amazon Route 53 料金表AWS
もし、ご自身で何かしらのドメインをもっていれば、それを使うのもありです。
ただし、地域汎用ドメイン(co.jp)は登録できなかったりと制約もあります。
私は、今回いろいろ考えるよりもということでこれ専用のドメインを取得しました。
取得すると対応するドメインあたりの費用が掛かります。
特に外部に通達して使うものでないので、適当に安いドメインを使いましょう。
今回私は「co.uk」ドメインを取得しました。
これが年額で$9です。
使っている間は利用料として更新タイミングで支払いが発生します。
今回の手順はドメイン取得したうえでRoute53に登録する流れになっています。
Route53はグローバルなので、リージョンは意識しません。
▲左側ペインの「登録済み」ドメインを選択して画面を開きます。
▲「ドメインの登録」ボタンを押して自分の使いたいドメインを探します。
ドメイン名を入力して利用したいドメインを選択、「チェック」ボタンを押下します。
そうすると該当ドメインが利用可能かどうかのチェックが行われます。
ドメイン名に問題がなければ、「続行ボタン」でドメインを購入を進めます。
▲DSNにドメインを登録する際には情報が必要なので、項目に従って入力します。
▲確認画面まできて、「注文を完了」を押せばドメイン取得は完了です。
この時しているするのはSESのエンドポイントになります。
どのリージョンを使うかによって値が異なります。
値はAWSのドキュメントを参照してください。
参考
リージョンと Amazon SESAWS
僕は今回は「米国東部(バージニア北部)」の「us-east-1」を使うことにしました。
以降の各サービスでは、このリージョンを使うことになるので忘れないようしてください。
手順2.S3にメール格納用のバケットを作成する
SES(Simple Email Service)で受信するメールのためにS3にバケットを作成します。
Simple Storage Serviceと呼ばれるンターネット用のストレージサービス。
99.999999999% (9 x 11) の耐久性を実現するように設計されており、世界中の企業向けに何百万ものアプリケーションのデータを保存しています。
料金は保管するデータ量とデータの読み書きによって決まります。
参考
Amazon S3 の料金AWS
SESではメール受信ボックスがないので、個別に作成する必要があります。
S3にメールを保管できるバケットを作ります。
▲サービスから「S3」を選択して、管理コンソールを開きます。
「バケットを作成する」をクリックしてバケット作成ウィザードを開きます。
▲各項目に以下のように値を設定してバケットを作成します。
バケット名(必須) | 分かりやすいお好きな名前でどうぞ |
---|---|
リージョン(必須) | 米国東部(バージニア北部) |
勘の良い方はお気づき方と思いますが、添付しているイメージはリージョンが間違っています。
作成の時にリージョンが同一でないとダメだということを意識してなくてキャプチャを撮っていたためです。
実際には「米国東部(バージニア北部)」にバケットを作成しています。
これでS3の設定は完了です。
続いてSESの設定です。
手順3.SESを使ってメール受信時の設定とルールを作成する
続いてSES(Simple Email Service)の設定です。
クラウドベースのEメール送信サービス
送信サービスがメインだが当然受信もできる。
今回のように受信だけの場合には、1,000通で$0.01。
受信メールチャンク(メールに含まれる添付ファイルなども含めた総サイズが256KBを超えると1チャンク)1,000チャンクにつき、$0.09とほとんど料金かからないくらいで使えます。
参考
Amazon SES 料金AWS
リージョンごとの設定となるので、今回は「米国東部(バージニア北部)」で設定をしていきます。
▲SES画面の左ペインの「Email Receiving」の下にある「Rule Sets」をクリックしてルール作成画面を呼び出します。
「Create a Receipt Rule」を押下してルール作成に入ります。
▲ここでSESを使って受信するメールアドレスを設定します。
ドメイン全部での受信を指定するので、ドメインのみを今回は入力し、「Add recipents」ボタンを押下します。
▲先ほど入力したドメインが上に表示され、Verification statusが「Verify domein」になっているかと思います。
ドメイン検証を完了するために「Verify domein」をクリックします。
▲検証画面が表示されます。(キャプチャが行けてないですけど・・・)
今回はRoute53を使っているので、「Use Route53」をクリックします。
▲「Domain Verification Record」と「Hosted Zones」で今回使うドメインを選択して「Create Record Sets」でRoute53のDNSエントリーに設定を追加します。
▲一旦「pending」になった後、「Verified」になればOKです。
Verifiedにならない場合には何かしら間違っているはずので、設定などを確認してみてください。
▲「Next Step」を押下すると、Actions画面に切り替わります。
ここでは先ほど指定したドメイン宛てのメールを受信した際に、どういったアクションをするか設定します。
今回の設定内容は以下です。
S3 buket(必須) | 先ほど作成したS3バケット |
---|---|
Object Key prefix(任意) | 先ほど作成したバケットに作成したprefix |
Encrypt Message(任意) | チェックしない |
SNS topic(任意) | 指定しない |
Add action(任意) |
▲「Next Step」を押下すると、Rule detail画面に切り替わります。
今回の設定は以下のようにしています。
Rule name(必須) | 今回の受信ルール名(お好きな内容でどうぞ) |
---|---|
Enabled(任意) | チェック |
Require TLS(任意) | チェック |
Enable spam and virus scanning(任意) | チェック |
Rule set(必須) | default-rule-set |
Roule position(必須) | Begininng |
今回のルールはすべてのメールに対する設定になります。
特定のメールアドレスのみ処理を変えたい場合、例えば「foge1@fogefoge.com」だけは別の処理をしたい場合には、foge1@fogefoge.comでルールセットを作ります。
そして作った「foge1@fogefoge.com」のRoule Positionを今回のルールの前に設定するようにしてください。
SESでは上か順にルールが評価されますので。
▲「create roure」を押下すすればルールの完成です
手順4.Cloud9を使ってLambda関数を作成してデプロイする
SESとS3の準備が整ったらいよいよ処理を行うためのLambdaを準備します。
今回はソース管理は個人で済ませるので、GitHubは使っていません。
とはいえPCの中でいろいろやるのも面倒なので、Cloud9を使っています。
ブラウザのみでコードを記述、実行、デバッグできるクラウドベースの統合開発環境 (IDE)です。
コードエディタ、デバッガー、ターミナルが準備されていて、大抵の言語のコーディングが可能なサービス。
料金についてはコーディングを行うためにIDEを立ち上げていた時間分かかります。(利用した分だけ課金)
参考
AWS Cloud9 料金AWS
一度IDEを立ち上げれば、あとはそれに紐づくLambdaなどを簡単に作ることができます。
▲AWSマネジメントコンソールから「Clodu9」サービスを選択して、Cloud9の管理コンソールを開きます。
「Create Environment」を押下してIDE環境作成ウィザードを開きます。
▲Step1 Name environmentが表示されるので値を入力し、次のステップへ進みます。
Name(必須) | IDE名(お好きな内容でどうぞ) |
---|---|
Description (任意) | 何かメモを入れておけば入れるくらい(今回は入れてません) |
▲Configure settingsの値を確認して、必要に応じて変更して、次のステップへ進みます。
Environment type(必須) | 今回は新規に立ち上げるので「Create a new instance for environment (EC2)」を選択します。 既存EC2があり、そちらを利用したい場合には、Connect and run in remote server (SSH)を選択して、必要情報(接続先や鍵情報)を設定します。 |
---|---|
Instance type(必須) | 今回は大規模に開発するわけではないので、最小スペック「t2.micro」を選択します。 |
Platform | 今回は「Amazon Linux」を選択しました。(Ubuntu Serverでも問題ないかと思います) |
Cost-saving setting(必須) |
▲Review画面でこれまでの設定を最終確認し、問題なければ「Create environment」でIDE環境を立ち上げます。
後は作成完了まで待ちます。
これでコーディング環境ができました。
この後コードを書いていくタイミングでLambdaも同時作成することになります。
その際にLambdaにつける権限(Role)が必要になるので、先にRoleを作成します。
▲IAM管理コンソール画面に移動して、左側ペインの「ポリシー」を選択します。
ポリシーの作成を選択して、「JSON」タブをクリックして以下のコードを記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "s3:GetObject", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": [ "arn:aws:logs:*:*:*", "arn:aws:s3:::<作成したS3バケット名>/*" ] }, { "Sid": "VisualEditor1", "Effect": "Allow", "Action": [ "ses:SendEmail", "ses:SendRawEmail", "ssm:GetParameters", "ssm:GetParameter" ], "Resource": "*" }, { "Sid": "VisualEditor2", "Effect": "Allow", "Action": "logs:CreateLogGroup", "Resource": "arn:aws:logs:*:*:*" } ] } |
- ClouewatchLogsへの書き込み許可
- 対象のS3バケットからのオブジェクト取得許可
- SES経由でのメール送信許可
- SSMからのパラメータ取得
ポリシーの確認で、ポリシー名を任意の名前を入れて作成します。
▲AWSサービスの「lambda」を選択し、「次のステップ;アクセス権限」を押下してアクセス権限の設定に移ります。
▲ポリシーのフィルタをクリックして「ユーザーによる管理」にチェックをいれ、先ほど作成したポリシーを選択します。
「次のステップ:タグ」押下後の、タグは必要であれば設定します。
「次のステップ:確認」押下後の画面で、ロール名を入力して、ロールを作成します。
これでロールの準備も終わりました。
続いてCloud9の環境にlambda開発環境を作ります。
その際に入力する値は次の通りです。
Function name(必須) | lambda関数の名前(お好きな内容でどうぞ) |
---|---|
Application name(必須) | 初期でFunction nameに入力したものがセットされます。 変更も可能 |
「Next」を押下して、実行環境の選択に移ります。
今回は「empty-python」でOKです。
「Next」を押下して表示されるトリガー設定画面では「none」のままでOKです。
「Next」を押して表示される設定画面では以下のようにします。
Memory(必須) | 初期表示されている128MB |
---|---|
Roele(必須) | Choose an existing roleを選択 選択後に表示させる「Existing Role」には先ほど作成したロールを選択します。 |
「Next」を押して、設定確認画面で設定が想定(入力)したものであることを確認して「Finish」を押せば終了です。
後はCloudformationが自動実行されlambda関数が作成されます。
それと同時にIDE上にlambdaで実行させるPythonの開発環境が準備されます。
今回は、slackwebというライブラリを利用するので、導入します。
画面下側に「bash-」で始まるコンソールが表示されていると思います。
ここで、以下のようにコマンドを入力していきます。
1 2 |
cd [作成した lambda格納ディレクトリ] pip install slackweb -t . |
続いてlambda関数ですが、次のようなコードを記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 |
# coding: utf-8 #メールをSES→S3→Lambdaにて連携する #library imports import botocore import boto3 import json import configparser from email.parser import FeedParser from email.header import decode_header import slackweb import email import sys import base64 #2020.05.22 import re m_attach = "" KEY_ROOT = "/" KEY_HOOK_URL="/hook_url" KEY_MENTION_ID="/mention_id" KYE_COM_MENTION_ID = "/Slack/common/mention_id" #Xtoを通らないケースがあるため? #グローバル変数にして様子見 xto = "" dto = None #Slack webhook URLを返す def get_ssm_parameter_key(parameter_key): boto3_ssm = boto3.client('ssm') #データのTypeによって取得方法を変える #keyが存在しない場合には"None(null)"を返す try : TypeCheck = boto3_ssm.get_parameter(Name=parameter_key)['Parameter']['Type'] if TypeCheck == 'SecureString' : return boto3_ssm.get_parameter(Name=parameter_key,WithDecryption=True)['Parameter']['Value'] else : return boto3_ssm.get_parameter(Name=parameter_key,WithDecryption=False)['Parameter']['Value'] #end if except botocore.exceptions.ClientError as e1: if e1.response['Error']['Code'] == 'ParameterNotFound' : return None else : print(parameter_key + "Error") print(e1.response) #end if #lambda呼び出し(main) def lambda_handler(event, context): print("Lambda Start") global m_attach #2020.03.10 add global xto #2020.03.10 add end #2020.05.22 add global dto #2020.05.22 add end try: record = event["Records"][0] bucket_region = record["awsRegion"] bucket_name = record["s3"]["bucket"]["name"] mail_object_key = record["s3"]["object"]["key"] s3 = boto3.client('s3', region_name=bucket_region) mail_object = s3.get_object(Bucket = bucket_name, Key = mail_object_key) mail_body = '' try: mail_body = mail_object["Body"].read().decode('utf-8') except: try: mail_body = mail_object["Body"].read().decode('iso-2022-jp') except: mail_body = mail_object["Body"].read() #2020.02.04 Mod #マルチパート追加 msg_object = email.message_from_string(mail_body) #print("multipart check") if msg_object.is_multipart(): body = msg_object.get_payload()[0] if body.is_multipart(): body = body.get_payload()[0] else: body = msg_object try: body = body.get_payload(decode=True).decode(body.get_content_charset()) except: #iso-2022-jpなのに丸文字があるとき #2020.05.12 mod #Python3xなんで「a bytes-like object is required, not 'str'」がでた #なので、replaceをbyteで扱うために"b"を付ける body = body.get_payload(decode=True).replace(b'\033$B', b'\033$(Q').decode('iso-2022-jp-2004') (d_sub, sub_charset) = decode_header(msg_object['Subject'])[0] if sub_charset == None: subject = d_sub else: subject = d_sub.decode(sub_charset) #転送にするため、常に自分のアドレスになるので不要 #(d_from, from_charset) = decode_header(msg_object['From'])[0] #if from_charset == None: # mfrom = d_from #else: # mfrom = d_from.decode(from_charset) #2020.02.04 追加 #Mail toを取得 #Slack送信先識別として利用 (d_to, to_charset) = decode_header(msg_object['To'])[0] if to_charset == None: dto = d_to else : dto = d_to.decode(to_charset) #2020.02.19 追加 #Gmailの場合Toが変更されなく転送されてくる #その場合には"X-Forwarded-To"が設定されている #try節で区切り、"X-Forwarded-To"がない場合にはNoneを返す。 try : (x_to, x_to_charset) = decode_header(msg_object['X-Forwarded-To'])[0] if x_to_charset == None : xto = x_to else : xto = x_to.decode(x_to_charset) except : xto = None print('Subject:' + subject) print("TO:" + d_to) if xto != None : print("X-Forwarded-To:" + xto) else : print("X-Forwarded-To:なし") #添付ファイル有無チェック cnt = 0 for data in msg_object.walk(): if data.get_content_maintype() == 'multipart' : continue #ファイル名取得 d_attach = data.get_filename() #添付ファイル名によって文字コードが変わるので対応 if d_attach != None: print(d_attach) if d_attach.count("=?UTF-8?B?") > 0: d_attach = d_attach.replace("=?UTF-8?B?","") d_attach = d_attach.rstrip("?=") d_attach = base64.b64decode(d_attach + '=' * (-len(d_attach)% 4) ).decode('utf-8') elif d_attach.count("=?iso-2022-jp?B?") > 0: d_attach = d_attach.replace("=?iso-2022-jp?B?","") d_attach = d_attach.rstrip("?=") d_attach = base64.b64decode(d_attach + '=' * (-len(d_attach)% 4) ).decode('iso-2022-jp') #print("encode test:" + d_attach) if cnt == 0 : m_attach = d_attach + ',' cnt += 1 else : m_attach += d_attach + ',' else : m_attach = "なし" except Exception as e : tb = sys.exc_info()[2] subject = u"Error!" body = u"メールを受信しましたが、エラーが発生しました。\n" + "message:{0}".format(e.with_traceback(tb)) mfrom = u"送信元不明" #送信先のパラメータストア取得KEYを組み立て #Gmail転送対応 #X-Forwarded-Toがセットされている場合にはX-Forwarded-Toを採用 if xto == None : key_prefix = KEY_ROOT + dto.split('@',1)[0].replace('"','') #2020.05.12 Debug 追加 #マルチパートがうまくいっていないとto/subjectが取れてない #ようなので、デフォルトセットとbodyのdump elif dto == None : key_prefix = KEY_ROOT + "jm-private-mail-other" print("body get function Error") print(body) else : key_prefix = KEY_ROOT + xto.split('@',1)[0].replace('"','') #slack webhook urlを取得 #slack = slackweb.Slack(url = get_ssm_parameter_key(dto.split('@',1)[0].replace('"',''))) slack = slackweb.Slack(url = get_ssm_parameter_key(key_prefix + KEY_HOOK_URL)) #mention idを取得 #mention = get_ssm_parameter_key("Slack-User-id") mention = get_ssm_parameter_key(key_prefix + KEY_MENTION_ID) #チャネル指定のmention idがない場合には共通の値をセット if mention == None : mention = get_ssm_parameter_key(KYE_COM_MENTION_ID) #end if #2020.05.22 title_data = u"件名:" + subject + "\n" + u"添付ファイル:" + m_attach #slack = slackweb.Slack(url=inifile.get('slack', 'hook_url')) #2020.02.03 新形式で記載 #本当はblocksで投げたいけど、slacweb apiが未実装? #attach Ver. attachments = [] attachment = { "fallback": u"その他メール", "pretext": mention + "\n", "color": "#0086ed", "title": title_data , #"title": u"件名:" + subject + "\n" + u"添付ファイル:" + m_attach , "text": body } attachments.append(attachment) slack.notify(attachments=attachments) ''' slack.notify(attachments=attachments, channel=inifile.get('slack', 'channel'), username=inifile.get('slack', 'username')) ''' #icon_emoji=inifile.get('slack', 'icon_emoji')) #print("Receved Event:" + json.dumps(event,indent=2)) #return 'CONTINUE' return 'OK' |
メールアドレスのTo.に指定されている宛先(@より前)を取得してパラメータストアからSlackの投稿先を取得
Slackにメンション付きで投稿
実行環境の大枠ができてきました、あと少しです。
そして、ここで一旦AWS環境を離れて、SlackAPIの設定をしていきます。
手順5.SlackAPIを設定する
受け手となるSlackでの設定をしていきます。
Slack側はアプリケーションを作って、認証キーの取得とWebhookURLを取得します。
HTTPのPOSTリクエストを使ってアプリケーションサービスに処理をさせる仕組み。
今回でいえばLambadaからSlackの特定URLに対してリクエストを送って、メッセージを投稿することです。
App Name(必須) | Slack Appの名前(お好きな内容でどうぞ) ここで記載した名前がSlack投稿時に表示されます |
---|---|
Development Slack Workspace(必須) | 今回のAppを稼働させるSlackのworkspaceを選択します。 |
「Create App」を押すことでAppの枠が出来上がります。
「Active Incoming Webhooks」横のスライドを「OFF」から「ON」にします。
あとは、「Add New Webhook to WorkSpaces」をクリックしてメールを連携したいSlackチャンネルのWebhookを設定していきます。
これでSlack側の設定は完了です。
再びAWS環境に戻り、パラメータストアに必要な設定を入れていきます。
手順6.パラメーターストアに必要な情報を保管する
今回のPythonでの設計として、複数のチャンネルに投稿することを前提にしています。
そして、チャネルごとにある程度のカスタマイズを想定しています。
なので、パラメータストアもチャンネルごとの設定を保持するようにしています。
AWSが提供してくれる設定データ管理と機密管理のための安全な階層型ストレージです。
パスワードや文字列といった定義ファイルに保持していたようなものをパラメータ値として保持できます。
参考
AWS Systems Manager パラメータストアAWS ユーザーズガイド
料金はスタンダードを選択している限りはほぼ無料です。
参考
AWS Systems Manager パラメータストア料金AWS
▲サービスメニューからSystemsMangerを選択して管理コンソールを開きます。
左側ペインにあるパラメータストアを選択して画面を開きます。
▲「パラメータの作成」をクリックしてパラメータ登録画面を開きます。
名前(必須) | /チャンネル名/hook_url |
---|---|
説明(任意) | パラメータの説明を必要であれば記載します |
利用枠(必須) | 標準 |
タイプ(必須) | 文字列 or 安全な文字列 |
値(必須) | Slack Appで取得した投稿したいチャンネルのWebhook URL |
タイプで文字列を選んだ場合は、DataTypeは「テキスト」でOKです。
安全な文字列を選んだ場合は、KMSの主要なソースは「現在のアカウント」、KMSキーIDは「alias/aws/ssm」でOKです。
「パラメータの作成」を押下すればパラメータ登録は完了です。
チャンネルが複数ある場合には、必要チャンネル分この作業を繰り返してください。
そのためデフォルトのメンションIDを登録します。
以下の内容でWebhook同様パラメータストアに登録します。
名前(必須) | /Slack/common/mention_id |
---|---|
説明(任意) | パラメータの説明を必要であれば記載します |
利用枠(必須) | 標準 |
タイプ(必須) | 文字列 or 安全な文字列 |
値(必須) | 自分のSlackID |
SlackIDの確認方法は、Slackの「プロフィールを表示する」を選択します。
表示されたプロフィールの「その他」をクリックして一番下に表示される「メンバーIDをコピー」で確認できます。
SlackIDとして登録するパラメータストアの値には「@ID>」で登録してください。
SlackIDが、「abc1234」だった場合は、「@abc1234>」として登録しないとエラーになります
もし、チャンネルごとにメンション先を変えたい場合には、パラメータストアの名前を「/チャンネル名/mention_id」としてチャンネルごとの設定として追加してください。
これでパラメータ設定完了です。
あとはS3に最終設定を入れれば完了です。
手順7.S3でイベント設定とライフサイクルを設定する
いよいよ最後の設定です。
発火(=処理を実行させるきっかけ)の設定と、オブジェクト削除の設定をします。
S3は何もしないとデータは保管されたままです。
S3のデータはSlackに連携すれば不要なので、一定期間きたら削除するように設定します。
そうすることで費用を抑えることもできます。
▲S3の管理コンソールを開いて、今回利用するバケットを選択します。
▲プロパティタブにあるイベントをクリックします。
名前(必須) | 分かりやすい名前でお好きなものを登録してください。 |
---|---|
イベント(必須) | PUTを選択 |
プレフィックス(必須) | メールを転送する先のプレフィックス |
送信先(必須) | Lambda関数を選択。 Lambdaが選べるようになるので、作成したLambdaを選択 |
保存で、設定を保存します。
これで発火設定はできました。
「ライフサイクルルールの追加」をクリックします。
①名前とスコープは以下のように入力します。
ルール名を入力する(必須) | 分かりやすい名前でお好きなものを登録してください。 |
---|---|
ルールスコープを選択(必須) | スコープを特定のプレフィックスまたはタグに限定 |
プレフィックスまたはタグフィルタを追加(必須) | メールを転送する先のプレフィックス |
次へを選択して、②移行へ。
ここでは何も選択せずに次へ。
③有効期限では以下のように設定します。
現行バージョン | チェック |
---|---|
以前のバージョン | チェック |
オブジェクトの現行バージョンを失効する | チェック 次の後に「1」を設定 |
前のバージョンを完全に削除する | チェック 次の後に「1」を設定 |
次へ進んで確認した上で保存します。
これで1日以上ったものは自動的に削除されていきます。
これでようやく全ての設定完了です。
▲あとは設定したチャンネルをメールの宛先にしてメールを送信すると、Slackに連携されます。
うまくいかない時はCloudwatchLogsを見てエラーを確認してみてください。
メールをSlackに転送することでチェックする箇所が統一されるのがうれしい
今回紹介したどちらのやり方でやるにせよ、Slackを見ていれば必要な情報が入るようになります。
これで、メール通知が来たので、メール内容確認してたら、Slackで呼びかけられて、またSlack見るみたいなことが減ります。
全部Slack側に見えているので。
どういう流れでSlackを見るかだけに絞れるので結構楽ですよ。
気になっている方はぜひやってみてください。