📝Lambda で Python を使って、Slack に通知するハンズオンを勝手に作ってみた2022/03/12に公開2022/12/2215件AWSPythonSlackAWS LambdatechDiscussionsssaka2022/06/16はじめまして!SRE業務している者です。 こちらの記事参考にさせていただき、正常にSlack通知まで動作確認できました! 一点ご質問があります。 こちらの記事の通り設定を行ったのですが、 Slackの通知内容に変数を埋め込むことは可能なのでしょうか? 現在TerraformにてLambdaの登録を行っているのですが、 個社ごとに通知内容を変えたいと思っておりまして、 外部ファイルから取得してPythonコード内に変数として取得したいと思っております。 お忙しいところ恐れ入りますが、ご教示いただけますと幸いです。 mn872022/06/16に更新sssaka さん 本記事の内容をお試し頂きありがとうございます。 Slackの通知内容に変数を埋め込むことは可能なのでしょうか? まだ試していませんが、Node.js ではやったことがあるので、Python でも可能だと思われます。 実現されたい内容は、以下のような内容であると認識しております。 認識に齟齬がございましたら、ご指摘頂ければ幸いです。 例: 外部ファイル A: A 社の情報 外部ファイル B: B 社の情報 Lambda から外部ファイルを取得し、外部ファイルに含まれる社名が A 社であれば、A 社の情報を Slack に通知、B 社であれば B 社の情報を Slack に通知する 私の方で一度試してみるので、試した後に結果と実装例をご連絡いたします。 よろしくお願いいたします。 返信を追加sssaka2022/06/16mn87さん ご回答頂きありがとうございます。 大変助かります。 はい、ご認識頂いている通りとなります。 具体的に渡したい情報としましては、以下となります。 ・お客様名 ・お客様のURL 上記の情報が個社ごとに異なる情報となります。 また、今後、お客様の追加に伴いTerraformで実行してSlack登録したいと考えているため、 Lambdaのpythonコードには手を加えずに、外部ファイルから取得し管理したいと思っております。 お手数おかけしますが、宜しくお願いいたします。 mn872022/06/16sssaka さん 認識のご確認ありがとうございます。 頂いた情報をもとに、簡単ではありますがコードを書いてみました。 import urllib3 import json http = urllib3.PoolManager() def lambda_handler(event, context): # 外部ファイル取得処理 # 外部ファイルからお客様名とお客様の URL を取得 (必要に応じて個社名も取得) user_name = "user-name" user_url = "https://example.com" # company_name = "A" # 必要に応じて if 文 # if company_name == "A": # user_name = "user-A" # user_url = "https://example-a.com" # elif company_name == "B": # user_name = "user-B" # user_url = "https://example-b.com" # else: # user_name = "user-C" # user_url = "https://example-c.com" url = "Slack Incoming Webhooks URL" msg = { "channel": "#general", "username": "", "text": f'user_name: {user_name}\nuser_url: {user_url}', # 変数を投稿メッセージに指定 "icon_emoji": "" } encoded_msg = json.dumps(msg).encode('utf-8') resp = http.request('POST', url, body=encoded_msg) print({ "message": "Hello From Lambda", "status_code": resp.status, "response": resp.data }) 上記コードを実行すると、Slack には以下のように投稿されます。 Lambdaのpythonコードには手を加えずに、外部ファイルから取得し管理したいと思っております。 上記のコードでこちらのご要件を満たせれば幸いです。 なお、外部ファイル取得処理や、取得した外部ファイルから情報を抽出する処理は任意のロジックで書き足して頂きますようお願いいたします。 上記について、ご不明な点がございましたらご連絡ください。 よろしくお願いいたします。 sssaka2022/06/16mn87さん 早速のご対応ありがとうございました。 動作確認し、意図通りの動作となること確認いたしました。 大変助かりました。 mn872022/06/17に更新sssaka さん 動作確認頂きありがとうございます。 お役に立てたのであれば光栄です。 sssaka2022/06/30mn87さん 度々のご質問となり申し訳ありません。。 もしご存じでしたら教えて頂きたいのですが、 Lambdaのハンドラーについて教えてください。 ソースコードに def lambda_handler(event, context): を利用しているかと思いますが、こちらのeventの情報には何の情報が送られているのか ご存じだったりしますでしょうか? 恐れ入りますが、宜しくお願いいたします。 返信を追加mn872022/06/30sssaka さん 追加でのご質問ありがとうございます。 eventの情報には何の情報が送られているのか 結論からご説明すると、Lambda を呼び出したときの呼び出し元の情報などが入っています。 https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/gettingstarted-concepts.html#gettingstarted-concepts-event イベントは、処理する Lambda 関数のデータを含む JSON 形式のドキュメントです。イベントは、ランタイムによりオブジェクトに変換された上で、関数のコードに渡されます。関数を呼び出すときは、イベントの構造とコンテンツを決定します。 今回のハンズオンだと、Lambda の呼び出し元が EventBridge なので、以下のような情報が送られています。 { "version": "0", "id": "217c16b2-26e7-7a0a-e907-815da4d8b986", "detail-type": "Scheduled Event", "source": "aws.events", "account": "0123456789", "time": "2022-06-30T10:38:00Z", "region": "ap-northeast-1", "resources": [ "arn:aws:events:ap-northeast-1:0123456789:rule/test" ], "detail": {} } 上記は、ソースコードの中で event を出力し、CloudWatch Logs で確認した結果です。 print(json.dumps(event)) その他のイベント情報については、以下の AWS 公式ドキュメントに記載されています。 https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-services.html また、context については以下の AWS 公式ドキュメントに記載されています。 https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/python-context.html ちなみに Lambda にはテスト実行の機能も備わっているので、テンプレートから様々なイベント例を試すことができます。 上記で回答になりますでしょうか。 ご確認をよろしくお願いいたします。 sssaka2022/07/01mn87 さん 詳細にご回答いただきありがとうございます。 期待以上の回答で大変助かりました。。 今後とも宜しくお願いいたします。 返信を追加okadango2022/12/22大変わかりやすい記事でした。 ありがとうございます。 時間があれば、 AWS利用料のSLACKへの定期通知のハンズオンも紹介して頂きたいです。 mn872022/12/22dango さん 本記事をご覧頂きありがとうございます。 AWS 利用料を SLACK に週次や月次で通知する方法も時間があったら紹介したいと思います。 okadango2022/12/23ぜひお願いします。 コマンドライン構築ばかりのネット情報で困っています。 また、AWS学習を始めたばかりなので、毎日利用料が気になります、、 mn872022/12/31dango さん ご要望頂いていた AWS 利用料を SLACK に定期通知についてのご報告です。 基本的には本ハンズオンの手順のうち、以下の点を変更することで実現可能でした。 Lambda のコードを変更する Lambda の IAM ロールに「CloudWatchReadOnlyAccess」権限を追加する 1. Lambda のコードを変更する 本ハンズオンの手順 4-5 で紹介しているコードを以下のコードに変更してください。 import datetime import json import urllib3 import boto3 http = urllib3.PoolManager() def lambda_handler(event, context): response = boto3.client('cloudwatch', region_name='us-east-1') get_metric_statistics = response.get_metric_statistics( Namespace='AWS/Billing', MetricName='EstimatedCharges', Dimensions=[ { 'Name': 'Currency', 'Value': 'USD' } ], StartTime=datetime.datetime.today() - datetime.timedelta(days=1), EndTime=datetime.datetime.today(), Period=86400, Statistics=['Maximum'] ) cost = get_metric_statistics['Datapoints'][0]['Maximum'] date = get_metric_statistics['Datapoints'][0]['Timestamp'].strftime('%Y年%m月%d日') text = "%sまでのAWSの料金は、$%sです。" % (date, cost) url = "Slack Incoming Webhooks URL" msg = { "channel": "#general", "username": "", "text": text, "icon_emoji": "" } encoded_msg = json.dumps(msg).encode('utf-8') resp = http.request('POST', url, body=encoded_msg) print({ "message": text, "status_code": resp.status, "response": resp.data }) 以下はコードの簡単な説明です。 ・CloudWatch の料金メトリクスから現在の料金を取得 ・取得した前日までの AWS 利用料を Slack に通知 参考にしたのは以下の記事なのでよろしければご参照ください。 https://qiita.com/ymktmk/items/14bbdf2562bde2fa3a1d 2. Lambda の IAM ロールに「CloudWatchReadOnlyAccess」権限を追加する 権限追加の手順も上記参考記事内の「LambdaにIAMロールをアタッチ」で紹介されていましたので、基本的には上記参考記事に手順で OK です。 Lambda の IAM ロールには以下の手順で権限を追加できます。 Lambda コンソールを開く 作成した Lambda 関数を選択する Lambda 関数の「設定」タブを選択する 「アクセス権限」をクリックし、「実行ロール」に記載されている「ロール名」の IAM ロールをクリックする IAM ロールの設定画面に移動するので、「許可を追加」から「CloudWatchReadOnlyAccess」を追加する なお、本ハンズオンでは EventBridge での通知を平日のみにしていますが、もし通知間隔を毎日にしたい場合には、EventBridge の設定も上記参考記事の「Eventbridgeの設定」をご参照ください。 ちなみに私の環境で検証した際の Slack への通知結果は以下の通りです。 もしうまく動作しない場合にはご連絡ください。 上記についてご確認頂ければ幸いです。 okadango2023/01/10無事実行できました。 ありがとうございました! 後ほどバッジ送らせていただきます。 mn872023/01/10ご確認頂きありがとうございます。 無事実行できたとのことで何よりです! 返信を追加
sssaka2022/06/16はじめまして!SRE業務している者です。 こちらの記事参考にさせていただき、正常にSlack通知まで動作確認できました! 一点ご質問があります。 こちらの記事の通り設定を行ったのですが、 Slackの通知内容に変数を埋め込むことは可能なのでしょうか? 現在TerraformにてLambdaの登録を行っているのですが、 個社ごとに通知内容を変えたいと思っておりまして、 外部ファイルから取得してPythonコード内に変数として取得したいと思っております。 お忙しいところ恐れ入りますが、ご教示いただけますと幸いです。 mn872022/06/16に更新sssaka さん 本記事の内容をお試し頂きありがとうございます。 Slackの通知内容に変数を埋め込むことは可能なのでしょうか? まだ試していませんが、Node.js ではやったことがあるので、Python でも可能だと思われます。 実現されたい内容は、以下のような内容であると認識しております。 認識に齟齬がございましたら、ご指摘頂ければ幸いです。 例: 外部ファイル A: A 社の情報 外部ファイル B: B 社の情報 Lambda から外部ファイルを取得し、外部ファイルに含まれる社名が A 社であれば、A 社の情報を Slack に通知、B 社であれば B 社の情報を Slack に通知する 私の方で一度試してみるので、試した後に結果と実装例をご連絡いたします。 よろしくお願いいたします。 返信を追加
mn872022/06/16に更新sssaka さん 本記事の内容をお試し頂きありがとうございます。 Slackの通知内容に変数を埋め込むことは可能なのでしょうか? まだ試していませんが、Node.js ではやったことがあるので、Python でも可能だと思われます。 実現されたい内容は、以下のような内容であると認識しております。 認識に齟齬がございましたら、ご指摘頂ければ幸いです。 例: 外部ファイル A: A 社の情報 外部ファイル B: B 社の情報 Lambda から外部ファイルを取得し、外部ファイルに含まれる社名が A 社であれば、A 社の情報を Slack に通知、B 社であれば B 社の情報を Slack に通知する 私の方で一度試してみるので、試した後に結果と実装例をご連絡いたします。 よろしくお願いいたします。
sssaka2022/06/16mn87さん ご回答頂きありがとうございます。 大変助かります。 はい、ご認識頂いている通りとなります。 具体的に渡したい情報としましては、以下となります。 ・お客様名 ・お客様のURL 上記の情報が個社ごとに異なる情報となります。 また、今後、お客様の追加に伴いTerraformで実行してSlack登録したいと考えているため、 Lambdaのpythonコードには手を加えずに、外部ファイルから取得し管理したいと思っております。 お手数おかけしますが、宜しくお願いいたします。 mn872022/06/16sssaka さん 認識のご確認ありがとうございます。 頂いた情報をもとに、簡単ではありますがコードを書いてみました。 import urllib3 import json http = urllib3.PoolManager() def lambda_handler(event, context): # 外部ファイル取得処理 # 外部ファイルからお客様名とお客様の URL を取得 (必要に応じて個社名も取得) user_name = "user-name" user_url = "https://example.com" # company_name = "A" # 必要に応じて if 文 # if company_name == "A": # user_name = "user-A" # user_url = "https://example-a.com" # elif company_name == "B": # user_name = "user-B" # user_url = "https://example-b.com" # else: # user_name = "user-C" # user_url = "https://example-c.com" url = "Slack Incoming Webhooks URL" msg = { "channel": "#general", "username": "", "text": f'user_name: {user_name}\nuser_url: {user_url}', # 変数を投稿メッセージに指定 "icon_emoji": "" } encoded_msg = json.dumps(msg).encode('utf-8') resp = http.request('POST', url, body=encoded_msg) print({ "message": "Hello From Lambda", "status_code": resp.status, "response": resp.data }) 上記コードを実行すると、Slack には以下のように投稿されます。 Lambdaのpythonコードには手を加えずに、外部ファイルから取得し管理したいと思っております。 上記のコードでこちらのご要件を満たせれば幸いです。 なお、外部ファイル取得処理や、取得した外部ファイルから情報を抽出する処理は任意のロジックで書き足して頂きますようお願いいたします。 上記について、ご不明な点がございましたらご連絡ください。 よろしくお願いいたします。 sssaka2022/06/16mn87さん 早速のご対応ありがとうございました。 動作確認し、意図通りの動作となること確認いたしました。 大変助かりました。 mn872022/06/17に更新sssaka さん 動作確認頂きありがとうございます。 お役に立てたのであれば光栄です。 sssaka2022/06/30mn87さん 度々のご質問となり申し訳ありません。。 もしご存じでしたら教えて頂きたいのですが、 Lambdaのハンドラーについて教えてください。 ソースコードに def lambda_handler(event, context): を利用しているかと思いますが、こちらのeventの情報には何の情報が送られているのか ご存じだったりしますでしょうか? 恐れ入りますが、宜しくお願いいたします。 返信を追加
mn872022/06/16sssaka さん 認識のご確認ありがとうございます。 頂いた情報をもとに、簡単ではありますがコードを書いてみました。 import urllib3 import json http = urllib3.PoolManager() def lambda_handler(event, context): # 外部ファイル取得処理 # 外部ファイルからお客様名とお客様の URL を取得 (必要に応じて個社名も取得) user_name = "user-name" user_url = "https://example.com" # company_name = "A" # 必要に応じて if 文 # if company_name == "A": # user_name = "user-A" # user_url = "https://example-a.com" # elif company_name == "B": # user_name = "user-B" # user_url = "https://example-b.com" # else: # user_name = "user-C" # user_url = "https://example-c.com" url = "Slack Incoming Webhooks URL" msg = { "channel": "#general", "username": "", "text": f'user_name: {user_name}\nuser_url: {user_url}', # 変数を投稿メッセージに指定 "icon_emoji": "" } encoded_msg = json.dumps(msg).encode('utf-8') resp = http.request('POST', url, body=encoded_msg) print({ "message": "Hello From Lambda", "status_code": resp.status, "response": resp.data }) 上記コードを実行すると、Slack には以下のように投稿されます。 Lambdaのpythonコードには手を加えずに、外部ファイルから取得し管理したいと思っております。 上記のコードでこちらのご要件を満たせれば幸いです。 なお、外部ファイル取得処理や、取得した外部ファイルから情報を抽出する処理は任意のロジックで書き足して頂きますようお願いいたします。 上記について、ご不明な点がございましたらご連絡ください。 よろしくお願いいたします。
sssaka2022/06/30mn87さん 度々のご質問となり申し訳ありません。。 もしご存じでしたら教えて頂きたいのですが、 Lambdaのハンドラーについて教えてください。 ソースコードに def lambda_handler(event, context): を利用しているかと思いますが、こちらのeventの情報には何の情報が送られているのか ご存じだったりしますでしょうか? 恐れ入りますが、宜しくお願いいたします。
mn872022/06/30sssaka さん 追加でのご質問ありがとうございます。 eventの情報には何の情報が送られているのか 結論からご説明すると、Lambda を呼び出したときの呼び出し元の情報などが入っています。 https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/gettingstarted-concepts.html#gettingstarted-concepts-event イベントは、処理する Lambda 関数のデータを含む JSON 形式のドキュメントです。イベントは、ランタイムによりオブジェクトに変換された上で、関数のコードに渡されます。関数を呼び出すときは、イベントの構造とコンテンツを決定します。 今回のハンズオンだと、Lambda の呼び出し元が EventBridge なので、以下のような情報が送られています。 { "version": "0", "id": "217c16b2-26e7-7a0a-e907-815da4d8b986", "detail-type": "Scheduled Event", "source": "aws.events", "account": "0123456789", "time": "2022-06-30T10:38:00Z", "region": "ap-northeast-1", "resources": [ "arn:aws:events:ap-northeast-1:0123456789:rule/test" ], "detail": {} } 上記は、ソースコードの中で event を出力し、CloudWatch Logs で確認した結果です。 print(json.dumps(event)) その他のイベント情報については、以下の AWS 公式ドキュメントに記載されています。 https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-services.html また、context については以下の AWS 公式ドキュメントに記載されています。 https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/python-context.html ちなみに Lambda にはテスト実行の機能も備わっているので、テンプレートから様々なイベント例を試すことができます。 上記で回答になりますでしょうか。 ご確認をよろしくお願いいたします。 sssaka2022/07/01mn87 さん 詳細にご回答いただきありがとうございます。 期待以上の回答で大変助かりました。。 今後とも宜しくお願いいたします。 返信を追加
okadango2022/12/22大変わかりやすい記事でした。 ありがとうございます。 時間があれば、 AWS利用料のSLACKへの定期通知のハンズオンも紹介して頂きたいです。 mn872022/12/22dango さん 本記事をご覧頂きありがとうございます。 AWS 利用料を SLACK に週次や月次で通知する方法も時間があったら紹介したいと思います。 okadango2022/12/23ぜひお願いします。 コマンドライン構築ばかりのネット情報で困っています。 また、AWS学習を始めたばかりなので、毎日利用料が気になります、、 mn872022/12/31dango さん ご要望頂いていた AWS 利用料を SLACK に定期通知についてのご報告です。 基本的には本ハンズオンの手順のうち、以下の点を変更することで実現可能でした。 Lambda のコードを変更する Lambda の IAM ロールに「CloudWatchReadOnlyAccess」権限を追加する 1. Lambda のコードを変更する 本ハンズオンの手順 4-5 で紹介しているコードを以下のコードに変更してください。 import datetime import json import urllib3 import boto3 http = urllib3.PoolManager() def lambda_handler(event, context): response = boto3.client('cloudwatch', region_name='us-east-1') get_metric_statistics = response.get_metric_statistics( Namespace='AWS/Billing', MetricName='EstimatedCharges', Dimensions=[ { 'Name': 'Currency', 'Value': 'USD' } ], StartTime=datetime.datetime.today() - datetime.timedelta(days=1), EndTime=datetime.datetime.today(), Period=86400, Statistics=['Maximum'] ) cost = get_metric_statistics['Datapoints'][0]['Maximum'] date = get_metric_statistics['Datapoints'][0]['Timestamp'].strftime('%Y年%m月%d日') text = "%sまでのAWSの料金は、$%sです。" % (date, cost) url = "Slack Incoming Webhooks URL" msg = { "channel": "#general", "username": "", "text": text, "icon_emoji": "" } encoded_msg = json.dumps(msg).encode('utf-8') resp = http.request('POST', url, body=encoded_msg) print({ "message": text, "status_code": resp.status, "response": resp.data }) 以下はコードの簡単な説明です。 ・CloudWatch の料金メトリクスから現在の料金を取得 ・取得した前日までの AWS 利用料を Slack に通知 参考にしたのは以下の記事なのでよろしければご参照ください。 https://qiita.com/ymktmk/items/14bbdf2562bde2fa3a1d 2. Lambda の IAM ロールに「CloudWatchReadOnlyAccess」権限を追加する 権限追加の手順も上記参考記事内の「LambdaにIAMロールをアタッチ」で紹介されていましたので、基本的には上記参考記事に手順で OK です。 Lambda の IAM ロールには以下の手順で権限を追加できます。 Lambda コンソールを開く 作成した Lambda 関数を選択する Lambda 関数の「設定」タブを選択する 「アクセス権限」をクリックし、「実行ロール」に記載されている「ロール名」の IAM ロールをクリックする IAM ロールの設定画面に移動するので、「許可を追加」から「CloudWatchReadOnlyAccess」を追加する なお、本ハンズオンでは EventBridge での通知を平日のみにしていますが、もし通知間隔を毎日にしたい場合には、EventBridge の設定も上記参考記事の「Eventbridgeの設定」をご参照ください。 ちなみに私の環境で検証した際の Slack への通知結果は以下の通りです。 もしうまく動作しない場合にはご連絡ください。 上記についてご確認頂ければ幸いです。 okadango2023/01/10無事実行できました。 ありがとうございました! 後ほどバッジ送らせていただきます。 mn872023/01/10ご確認頂きありがとうございます。 無事実行できたとのことで何よりです! 返信を追加
mn872022/12/31dango さん ご要望頂いていた AWS 利用料を SLACK に定期通知についてのご報告です。 基本的には本ハンズオンの手順のうち、以下の点を変更することで実現可能でした。 Lambda のコードを変更する Lambda の IAM ロールに「CloudWatchReadOnlyAccess」権限を追加する 1. Lambda のコードを変更する 本ハンズオンの手順 4-5 で紹介しているコードを以下のコードに変更してください。 import datetime import json import urllib3 import boto3 http = urllib3.PoolManager() def lambda_handler(event, context): response = boto3.client('cloudwatch', region_name='us-east-1') get_metric_statistics = response.get_metric_statistics( Namespace='AWS/Billing', MetricName='EstimatedCharges', Dimensions=[ { 'Name': 'Currency', 'Value': 'USD' } ], StartTime=datetime.datetime.today() - datetime.timedelta(days=1), EndTime=datetime.datetime.today(), Period=86400, Statistics=['Maximum'] ) cost = get_metric_statistics['Datapoints'][0]['Maximum'] date = get_metric_statistics['Datapoints'][0]['Timestamp'].strftime('%Y年%m月%d日') text = "%sまでのAWSの料金は、$%sです。" % (date, cost) url = "Slack Incoming Webhooks URL" msg = { "channel": "#general", "username": "", "text": text, "icon_emoji": "" } encoded_msg = json.dumps(msg).encode('utf-8') resp = http.request('POST', url, body=encoded_msg) print({ "message": text, "status_code": resp.status, "response": resp.data }) 以下はコードの簡単な説明です。 ・CloudWatch の料金メトリクスから現在の料金を取得 ・取得した前日までの AWS 利用料を Slack に通知 参考にしたのは以下の記事なのでよろしければご参照ください。 https://qiita.com/ymktmk/items/14bbdf2562bde2fa3a1d 2. Lambda の IAM ロールに「CloudWatchReadOnlyAccess」権限を追加する 権限追加の手順も上記参考記事内の「LambdaにIAMロールをアタッチ」で紹介されていましたので、基本的には上記参考記事に手順で OK です。 Lambda の IAM ロールには以下の手順で権限を追加できます。 Lambda コンソールを開く 作成した Lambda 関数を選択する Lambda 関数の「設定」タブを選択する 「アクセス権限」をクリックし、「実行ロール」に記載されている「ロール名」の IAM ロールをクリックする IAM ロールの設定画面に移動するので、「許可を追加」から「CloudWatchReadOnlyAccess」を追加する なお、本ハンズオンでは EventBridge での通知を平日のみにしていますが、もし通知間隔を毎日にしたい場合には、EventBridge の設定も上記参考記事の「Eventbridgeの設定」をご参照ください。 ちなみに私の環境で検証した際の Slack への通知結果は以下の通りです。 もしうまく動作しない場合にはご連絡ください。 上記についてご確認頂ければ幸いです。
Discussion
はじめまして!SRE業務している者です。
こちらの記事参考にさせていただき、正常にSlack通知まで動作確認できました!
一点ご質問があります。
こちらの記事の通り設定を行ったのですが、
Slackの通知内容に変数を埋め込むことは可能なのでしょうか?
現在TerraformにてLambdaの登録を行っているのですが、
個社ごとに通知内容を変えたいと思っておりまして、
外部ファイルから取得してPythonコード内に変数として取得したいと思っております。
お忙しいところ恐れ入りますが、ご教示いただけますと幸いです。
sssaka さん
本記事の内容をお試し頂きありがとうございます。
まだ試していませんが、Node.js ではやったことがあるので、Python でも可能だと思われます。
実現されたい内容は、以下のような内容であると認識しております。
認識に齟齬がございましたら、ご指摘頂ければ幸いです。
私の方で一度試してみるので、試した後に結果と実装例をご連絡いたします。
よろしくお願いいたします。
mn87さん
ご回答頂きありがとうございます。
大変助かります。
はい、ご認識頂いている通りとなります。
具体的に渡したい情報としましては、以下となります。
・お客様名
・お客様のURL
上記の情報が個社ごとに異なる情報となります。
また、今後、お客様の追加に伴いTerraformで実行してSlack登録したいと考えているため、
Lambdaのpythonコードには手を加えずに、外部ファイルから取得し管理したいと思っております。
お手数おかけしますが、宜しくお願いいたします。
sssaka さん
認識のご確認ありがとうございます。
頂いた情報をもとに、簡単ではありますがコードを書いてみました。
上記コードを実行すると、Slack には以下のように投稿されます。

上記のコードでこちらのご要件を満たせれば幸いです。
なお、外部ファイル取得処理や、取得した外部ファイルから情報を抽出する処理は任意のロジックで書き足して頂きますようお願いいたします。
上記について、ご不明な点がございましたらご連絡ください。
よろしくお願いいたします。
mn87さん
早速のご対応ありがとうございました。
動作確認し、意図通りの動作となること確認いたしました。
大変助かりました。
sssaka さん
動作確認頂きありがとうございます。
お役に立てたのであれば光栄です。
mn87さん
度々のご質問となり申し訳ありません。。
もしご存じでしたら教えて頂きたいのですが、
Lambdaのハンドラーについて教えてください。
ソースコードに
def lambda_handler(event, context):
を利用しているかと思いますが、こちらのeventの情報には何の情報が送られているのか
ご存じだったりしますでしょうか?
恐れ入りますが、宜しくお願いいたします。
sssaka さん
追加でのご質問ありがとうございます。
結論からご説明すると、Lambda を呼び出したときの呼び出し元の情報などが入っています。
今回のハンズオンだと、Lambda の呼び出し元が EventBridge なので、以下のような情報が送られています。
上記は、ソースコードの中で event を出力し、CloudWatch Logs で確認した結果です。
その他のイベント情報については、以下の AWS 公式ドキュメントに記載されています。
また、context については以下の AWS 公式ドキュメントに記載されています。
ちなみに Lambda にはテスト実行の機能も備わっているので、テンプレートから様々なイベント例を試すことができます。

上記で回答になりますでしょうか。
ご確認をよろしくお願いいたします。
mn87 さん
詳細にご回答いただきありがとうございます。
期待以上の回答で大変助かりました。。
今後とも宜しくお願いいたします。
大変わかりやすい記事でした。
ありがとうございます。
時間があれば、
AWS利用料のSLACKへの定期通知のハンズオンも紹介して頂きたいです。
dango さん
本記事をご覧頂きありがとうございます。
AWS 利用料を SLACK に週次や月次で通知する方法も時間があったら紹介したいと思います。
ぜひお願いします。
コマンドライン構築ばかりのネット情報で困っています。
また、AWS学習を始めたばかりなので、毎日利用料が気になります、、
dango さん
ご要望頂いていた AWS 利用料を SLACK に定期通知についてのご報告です。
基本的には本ハンズオンの手順のうち、以下の点を変更することで実現可能でした。
1. Lambda のコードを変更する
本ハンズオンの手順 4-5 で紹介しているコードを以下のコードに変更してください。
以下はコードの簡単な説明です。
・CloudWatch の料金メトリクスから現在の料金を取得
・取得した前日までの AWS 利用料を Slack に通知
参考にしたのは以下の記事なのでよろしければご参照ください。
2. Lambda の IAM ロールに「CloudWatchReadOnlyAccess」権限を追加する
権限追加の手順も上記参考記事内の「LambdaにIAMロールをアタッチ」で紹介されていましたので、基本的には上記参考記事に手順で OK です。
Lambda の IAM ロールには以下の手順で権限を追加できます。
なお、本ハンズオンでは EventBridge での通知を平日のみにしていますが、もし通知間隔を毎日にしたい場合には、EventBridge の設定も上記参考記事の「Eventbridgeの設定」をご参照ください。
ちなみに私の環境で検証した際の Slack への通知結果は以下の通りです。

もしうまく動作しない場合にはご連絡ください。
上記についてご確認頂ければ幸いです。
無事実行できました。
ありがとうございました!
後ほどバッジ送らせていただきます。
ご確認頂きありがとうございます。
無事実行できたとのことで何よりです!