aws lambda使用_使用AWS Lambda的CloudWatch事件通知
aws lambda使用
CloudWatchEvents的主要用例是跟蹤整個AWS基礎架構中的更改。 當前,它支持跨Auto Scaling組,EC2,EBS和其他各種事件發出的事件。 為了對這些事件進行有意義的處理,我們需要一種消耗它們的方法。 AWS使用術語“ targets來指代任何想要消耗事件并支持AWS Lambda和其他幾個東西的事物。
在本文中,我們將看到如何設置AWS Lambda函數以使用CloudWatch中的事件。 到本文結尾,我們將擁有一個AWS Lambda函數,該函數會將通知發布到Slack通道。 但是,由于該機制是通用的,因此您應該能夠根據用例對其進行自定義。 讓我們開始吧!
設置和一般信息
可以在這里找到本文的代碼存儲庫。 它具有兩個子目錄:
- functions ,其中包含Lambda函數的源代碼。
- terraform ,具有基礎結構配置。
要繼續,我們將需要:
- 一個AWS用戶賬戶
- 地貌
- Python 3
- Bash / Powershell /實用程序
AWS用戶賬戶和CLI配置
我們將需要一個具有以下IAM策略的AWS賬戶:
- AWSLambdaFullAccess
- IAMFullAccess
AWS CLI和terraform將使用標準AWS配置,并在AWS配置文件中設置適當的憑證。
請注意,嘗試演示可能需要付費。
地貌
我們將使用Terraform設置整個基礎架構,包括上載Lambda函數。
Python 3
我們的Lambda函數將用Python 3編寫,并且我們將在用于部署和更新AWS基礎設施的腳本中使用Python。
Bash / Powershell /實用程序
如果您使用的是Linux / OS X,則需要bash來運行腳本。 對于Windows,您將需要powershell 。 在Linux / OS X上,我們將使用zip命令創建Lambda部署工件。
體系結構概述
我們將在本文中構建的解決方案的整體體系結構如下所示:
AWS CloudWatch event -> Lambda function invoked -> Notifications我們將重點關注兩個事件:
- EC2狀態更改事件:當AWS EC2實例更改狀態–啟動新的EC2實例或終止現有的EC2實例時,將發生此事件。
- CloudWatch運行狀況 事件:當您的AWS賬戶中發生與運行狀況相關的基礎架構更改時,就會發生CloudWatch 運行狀況事件 。
要使CloudWatch事件自動觸發Lambda函數,我們需要設置cloudwatch rule 。 無論我們正在處理事件還是處理事件,接收事件的Lambda函數都將具有相同的基本結構。
我們將使用Python 3.6編寫Lambda函數,一個完全正常運行的函數如下所示:
def handler(event, context):print(event)函數名稱是handler ,它帶有兩個參數: event和context 。 event對象具有觸發Lambda函數的事件的有效負載,并且context對象具有與特定事件相關的各種元數據 。
為了了解如何完成上述所有工作,我們將首先實現一個解決方案,該解決方案將在EC2實例更改狀態時調用Lambda函數。
演示:EC2實例運行通知
此通知的Lambda函數如下所示,并保存在文件main.py :
def handler(event, context):print(event)每當調用它時,它將事件主體打印到標準輸出,該輸出將自動記錄到AWS CloudWatch日志中。 我們將討論如何盡快上傳Lambda函數。 首先,讓我們簡要介紹一下要調用的Lambda函數的基礎結構設置。
可以在文件ec2_state_change.tf找到Terraform配置。 它定義了以下主要地形資源:
aws_cloudwatch_event_rule
這定義了我們希望調用lambda函數的規則。 EC2實例狀態更改的event_pattern定義為:
"source": [ "aws.ec2" ], "detail-type": [ "EC2 Instance State-change Notification" ]aws_cloudwatch_event_target
接下來,我們定義使用此資源在事件發生時調用的內容。 關鍵參數是:
target_id = "InvokeLambda" arn = "${aws_lambda_function.ec2_state_change.arn}" }arn參數為Lambda函數指定Amazon資源名稱。
aws_lambda_function
該資源注冊了lambda函數,并具有以下關鍵參數:
function_name = "ec2_state_change" role = "${aws_iam_role.ec2_state_change_lambda_iam.arn}" handler = "main.handler" runtime = "python3.6"s3_bucket = "aws-health-notif-demo-lambda-artifacts" s3_key = "ec2-state-change/src.zip" s3_object_version = "${var.ec2_state_change_handler_version}"上面的function_name是AWS的標識符,與代碼中的函數名稱沒有任何關系。 由另一資源指定的Lambda函數的IAM角色具有默認的sts:AssumeRole策略和允許將函數日志推送到CloudWatch的策略。
該handler的格式為<python-module>.<function>并指定要調用的Python函數名稱。 runtime指定AWS Lambda運行時。
s3_bucket指定將存儲Lambda代碼的存儲區, s3_key為Lambda代碼的鍵名, s3_object_version允許我們部署上述對象的特定版本。
ec2_state_change_cloudwatch
定義的最后一個關鍵資源允許CloudWatch調用我們的Lambda函數,并具有以下參數:
action = "lambda:InvokeFunction" function_name = "${aws_lambda_function.ec2_state_change.function_name}" principal = "events.amazonaws.com" source_arn = "${aws_cloudwatch_event_rule.ec2_state_change.arn}"上載Lambda函數
正如我們在Lambda函數的配置中看到的那樣,Lambda函數的代碼將存在于S3中。 因此,每次更改代碼后,我們將使用AWS CLI在S3中更新代碼,如下所示。 在Linux上,這看起來類似于:
# Create a .zip of src $ pushd src $ zip -r ../src.zip * $ popd$ aws s3 cp src.zip s3://aws-health-notif-demo-lambda-artifacts/ec2-state-change/src.zip我們可以使上述執行成為連續集成管道的一部分。
部署最新版本的代碼
將代碼上傳到S3之后,我們可以運行terraform來更新Lambda函數以使用新版本的代碼,如下所示:
$ version=$(aws s3api head-object --bucket aws-health-notif-demo-lambda-artifacts --key ec2-state-change/src.zip) $ version=$(echo $version | python -c 'import json,sys; obj=json.load(sys.stdin); print(obj["VersionId"])')# Deploy to demo environment $ pushd ../../terraform/environments/demo $ ./tf.bash cloudwatch_event_handlers apply -var ec2_state_change_handler_version=$version \-target=aws_lambda_function.ec2_state_change \-target=aws_lambda_permission.ec2_state_change_cloudwatch \-target=aws_cloudwatch_event_target.ec2_state_change \-target=aws_iam_role_policy.ec2_state_change_lambda_cloudwatch_logging $ popd可以將上述兩個步驟封裝在一個腳本中,該腳本成為創建EC2狀態更改CloudWatch事件處理程序以及更新處理它的Lambda函數的單個入口點。
運行演示
要在AWS賬戶中設置上述Lambda函數和所有必要的基礎架構,我們只需要運行functions\ec2_state_change\deploy.bash或functions\ec2_state_change\deploy.ps1腳本即可。 完成后,如果您創建新的EC2實例或停止/終止現有實例,您將看到CloudWatch日志,如下所示:
[2018-07-04T09:46:18+10:00] (2018/07/03/[$LATEST]aa226226b6b24a0cae83a948dcc29b95) START RequestId: 4798542c-7f1b-11e8-8493-836165a23514 Version: $LATEST[2018-07-04T09:46:18+10:00] (2018/07/03/[$LATEST]aa226226b6b24a0cae83a948dcc29b95) {'version': '0', 'id': '73c10269-00a0-644d-b92b-820846bb19db', 'detail-type': 'EC2 Instance State-change Notification', 'source': 'aws.ec2', 'account': '033145145979', 'time': '2018-07-03T23:46:16Z', 'region': 'ap-southeast-2', 'resources': ['arn:aws:ec2:ap-southeast-2:033145145979:instance/i-0e1153ece20b77590'], 'detail': {'instance-id': 'i-0e1153ece20b77590', 'state': 'pending'}}[2018-07-04T09:46:18+10:00] (2018/07/03/[$LATEST]aa226226b6b24a0cae83a948dcc29b95) END RequestId: 4798542c-7f1b-11e8-8493-836165a23514演示:AWS Health Events-> Slack
接下來,我們將編寫一個Lambda函數,它將AWS Health Health事件發布到您選擇的Slack通道。 首先,我們將為Slack頻道配置一個傳入的Webhook。 請查看此鏈接以開始如何為您的頻道添加一個。 如果按照設置進行操作,您將擁有一個類似于https://hooks.slack.com/services/string/<string>/<string>的webhook URL。 在此階段之后,我將假定我們具有此Webhook URL。
編寫Lambda函數
Lambda函數將如下所示:
import os import sys import jsonCWD = os.path.dirname(os.path.realpath(__file__)) sys.path.insert(0, os.path.join(CWD, "libs"))import requestsdef handler(event, context):WEBHOOK_URL = os.getenv("WEBHOOK_URL")if not WEBHOOK_URL:print("WEBHOOK_URL not defined or empty")return# see: https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/EventTypes.html#health-event-types for event structure r = requests.post(WEBHOOK_URL,json = {'text': '*New AWS Health event* ```{0}```'.format(str(event))})print(r)基礎架構配置
Lambda函數的基礎結構配置與我們先前的功能完全相同,除了aws_cloudwatch_event_rule定義event_pattern方式如下:
"source": [ "aws.health" ], "detail-type": [ "AWS Health Event" ]部署Lambda函數
與上面的EC2狀態更改演示類似,要部署上述功能,我們將在functions/health_event目錄中運行部署腳本:
$ HEALTH_EVENT_WEBHOOK_URL="<your webhook url>" ./deploy.bash除了部署Lambda函數之外,這還將創建必要的CloudWatch事件規則并設置目標。
一切完成后,您可以直接使用AWS CLI調用Lambda函數:
$ aws lambda invoke --invocation-type RequestResponse --function-name health_event --log-type Tail --payload '{"message":"hello"}' outfile.txt您應該在配置的頻道中看到一條Slack消息:
松弛消息
摘要
在本文中,我們學習了如何將Lambda函數設置為CloudWatch事件的目標。 Slack通知演示有效,但可以通過以下兩種方式進行改進:
- 可以使用AWS Secrets Manager靜態加密webhook URL。
- 通過處理傳入消息,可以使通知更豐富。
本文使用的存儲庫位于此處 。
以下資源應有助于進一步了解:
- CloudWatch活動
- 在Python中編寫Lambda函數的指南
- AWS的Terraform指南
翻譯自: https://www.javacodegeeks.com/2018/07/cloudwatch-event-notifications-aws.html
aws lambda使用
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的aws lambda使用_使用AWS Lambda的CloudWatch事件通知的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么让banner自动切换(banner
- 下一篇: 械字号棉签(棉签械备案)