説明

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)で実現する