説明
CDP:Floating IPパターンをDatadog, AWS SNS, AWS LAMBDA(python,boto3)を連携させて実現する方法について書きます。
処理の流れは
1.Datadogのmonitorでインスタンス障害やサービス監視アラートを検知する
↓
2.monitorからAWS SNSへ通知する
↓
3.AWS SNSからAWS LAMBDAを実行する
↓
4.AWS LAMBDAからAWSへAPI実行してEIPを付け替える
になります。
参考:CDP:Floating IPパターン
http://aws.clouddesignpattern.org/index.php/CDP:Floating_IP%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3
構成図
EC2の”server01″と”server02″間でEIPの付け替えを行います。
SNS設定
ProtocolがlambdaのSNS topicを作成します。
LAMBDA設定
ソースコード(python)
datadogからのメッセージから障害が発生したサーバー名を特定し、待機系のサーバーへEIP付け替え処理を行います。
import boto3 allocid="eipalloc-xxxxxxx" def lambda_handler(event, context): ec2 = boto3.resource('ec2') client = boto3.client('ec2') #Make sure to pass the name of the failed instance to the first line of the message from monitor of datadog msg = event['Records'][0]['Sns']['Message'] msgline=msg.split() #Set the instance name of the standby server if msgline[0] == "server01": standbyname = "server02" else: standbyname = "server01" #Obtain the instance ID and ENI ID of the standby server f = [{'Name':'tag-value', 'Values':[standbyname]}] response = client.describe_instances(Filters=f) instanceid_standby=response['Reservations'][0]['Instances'][0]['InstanceId'] eniid = response['Reservations'][0]['Instances'][0]['NetworkInterfaces'][0]['NetworkInterfaceId'] #Remove EIP from failed server address = ec2.VpcAddress(allocid) address.association.delete() #Attach EIP to Standby server address.associate( DryRun=False, InstanceId=instanceid_standby, NetworkInterfaceId=eniid, AllowReassociation=True )
IAM role設定
lambda用デフォルトIAM roleに加えて、EIP付け替えに必要な権限のものも追加します。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt11111111111", "Effect": "Allow", "Action": [ "ec2:AssociateAddress", "ec2:DisassociateAddress", "ec2:DescribeAddresses", "ec2:DescribeInstances" ], "Resource": [ "*" ] } ] }
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:CreateNetworkInterface", "ec2:DeleteNetworkInterface", "ec2:DescribeNetworkInterfaces" ], "Resource": "*" } ] }
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "logs:CreateLogGroup", "Resource": "arn:aws:logs:ap-northeast-1:xxxxxxxx:*" }, { "Effect": "Allow", "Action": [ "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": [ "arn:aws:logs:ap-northeast-1:xxxxxxxx:log-group:/aws/lambda/eipchanger:*" ] } ] }
datadog設定
monitor設定(通知本文)※multi alert
一行目で障害が発生したサーバー名を書きます(以下はmulti alert時のもので変数を使用)
{{host.name}} @sns-lambda-eipchanger
integration設定
integrationに”Amazon Web Services”がinstalledされていること
“Amazon Web Services”に対象のAWSアカウントが登録済みであること
integrationに”Amazon SNS”がinstalledされていること
“Amazon SNS”で対象のAWSアカウントのところで、通知先のSNS topicが表示されていること
等を確認します。
以上です。
元記事はこちら
「CDP:Floating IPパターンをDatadog, AWS SNS, AWS LAMBDA(python,boto3)で実現する」