[基本操作]Amazon SNSをAWS CLIで操作する その2(Auto Scalingと組み合わせる)

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。池田です。メールは受信トレイだけではなく迷惑メールフォルダも確認するのが日課です。

はじめに

本記事は[基本操作]Amazon SNSをAWS CLIで操作するの続きになります。
2011年08月30日に公開された記事Amazon SNSをコマンドラインから使うと、Amazon SNSとAuto Scalingを組み合わせるを現在(2017年11月)も同じ方法で実行できるのかを確認しつつ、詳細手順を記録したものです。
まだAmazon SNSAWS Command Line Interfaceをご利用されたことがない方を対象としております。予めご了承ください。

ELB配下に2つのEC2インスタンスを配置した検証環境を用意し、Auto ScalingからSNSメッセージを通知させてみます。

検証環境の準備

まず、前述した検証環境を構築する必要があります。
せっかくですので、この作業もAWS CLIで行なっていきます。

AWS CloudFormationを使う

わずか1つのELBと2つのEC2インスタンスではありますが、できるだけラクに構築したいですよね。
そのためAWS CloudFormationを利用することにします。
CloudFormationにはサンプルテンプレートが多数公開されています。今回の検証にちょうど良いテンプレートがありましたのでありがたく使わせていただくことにします。

既存リソースの確認

CloudFormationで検証環境を作成するにあたり、必要なリソース(VPCなど)に関する情報を確認します。

command: aws ec2 describe-vpcs
{
    "Vpcs": [
        {
            "VpcId": "vpc-hogehoge",
            "InstanceTenancy": "default",
            "CidrBlockAssociationSet": [
                {
                    "AssociationId": "vpc-cidr-assoc-hogehoge",
                    "CidrBlock": "172.31.0.0/16",
                    "CidrBlockState": {
                        "State": "associated"
                    }
                }
            ],
            "State": "available",
            "DhcpOptionsId": "dopt-hogehoge",
            "CidrBlock": "172.31.0.0/16",
            "IsDefault": true
        }
    ]
}
command: aws ec2 describe-subnets
{
    "Subnets": [
        {
            "AvailabilityZone": "ap-northeast-1c",
            "AvailableIpAddressCount": 4091,
            "DefaultForAz": true,
            "Ipv6CidrBlockAssociationSet": [],
            "VpcId": "vpc-hogehoge",
            "State": "available",
            "MapPublicIpOnLaunch": true,
            "SubnetId": "subnet-hoge",
            "CidrBlock": "172.31.0.0/20",
            "AssignIpv6AddressOnCreation": false
        },
        {
            "AvailabilityZone": "ap-northeast-1a",
            "AvailableIpAddressCount": 4091,
            "DefaultForAz": true,
            "Ipv6CidrBlockAssociationSet": [],
            "VpcId": "vpc-fugafuga",
            "State": "available",
            "MapPublicIpOnLaunch": true,
            "SubnetId": "subnet-fuga",
            "CidrBlock": "172.31.16.0/20",
            "AssignIpv6AddressOnCreation": false
        }
    ]
}

VPC IDとSUBNET IDの確認ができましたので、検証環境の構築に進みます。

AWS CLIによるCloudFormationの利用

早速CloudFormationでテンプレートを利用して構築します。

command: aws cloudformation create-stack --region ap-northeast-1 \
--stack-name snsteststack \
--template-url https://s3-us-west-2.amazonaws.com/cloudformation-templates-us-west-2/ELBWithLockedDownAutoScaledInstances.template \
--parameters ParameterKey=KeyName,ParameterValue=SNStestkey \
ParameterKey=VpcId,ParameterValue=VPCID \
ParameterKey=Subnets,ParameterValue=\"SUBNETID-A,SUBNETID-B\"

少し待ってから処理状況を確認します。下記のようになっていれば処理は完了しています。

command: aws cloudformation describe-stacks --stack-name snsteststack
{
    "Stacks": [
        {
            "StackId": "arn:aws:cloudformation:ap-northeast-1:hogehoge:stack/snsteststack/fugafuga-d585-11e7-8097-hogefuga123",
            "Description": "AWS CloudFormation Sample Template ELBWithLockedDownAutoScaledInstances: Create a load balanced, Auto Scaled sample website where the instances are locked down to only accept traffic from the load balancer. This example creates an Auto Scaling group behind a load balancer with a simple health check. The web site is available on port 80, however, the instances can be configured to listen on any port (8888 by default). **WARNING** This template creates one or more Amazon EC2 instances and an Application Load Balancer. You will be billed for the AWS resources used if you create a stack from this template.",
            "Parameters": [

                (省略)

            "EnableTerminationProtection": false,
            "CreationTime": "2017-11-29T19:20:52.022Z",
            "StackName": "snsteststack",
            "NotificationARNs": [],
            "StackStatus": "CREATE_COMPLETE", <<<作成が完了しているとこのように表示される
            "DisableRollback": false,
            "RollbackConfiguration": {}
        }
    ]
}

AutoScalingGroupからSNS通知を行う準備

Cloudformationによって作成されたAutoScalingGroup名を確認します。

command: aws autoscaling describe-auto-scaling-groups
{
    "AutoScalingGroups": [
        {
            (省略)
            "EnabledMetrics": [],
            "LoadBalancerNames": [],
            "AutoScalingGroupName": "snsteststack-WebServerGroup-hogehoge",
            "DefaultCooldown": 300,
            "MinSize": 2,
            "Instances": [
            (省略)
            "HealthCheckType": "EC2",
            "NewInstancesProtectedFromScaleIn": false
        }
    ]
}

SNS通知に使うコマンドを確認します。

以前のコマンド: as-put-notification-configuration mygroup3 --notification-types autoscaling:TEST_NOTIFICATION \
--topic-arn arn:aws:sns:ap-northeast-1:771293814336:mytopic1 --region ap-northeast-1
現在のコマンド: aws autoscaling put-notification-configuration --auto-scaling-group-name my-auto-scaling-group \
--topic-arn arn:aws:sns:us-west-2:123456789012:my-sns-topic --notification-type autoscaling:TEST_NOTIFICATION

テスト通知の送信

前回作成したAmazon SNSトピックへテスト通知を送信してみます。

command: aws autoscaling put-notification-configuration --auto-scaling-group-name snsteststack-WebServerGroup-hogehoge \
> --topic-arn arn:aws:sns:ap-northeast-1:hogehoge000:topic_02 --notification-type autoscaling:TEST_NOTIFICATION

きちんとメールが配信されました。

まとめ

SNSだけでなく、AutoScalingに関するコマンドも新しく置き換わっていることと、引数については例示の順序こそ違いますが大きな変更はなさそうだということがわかりました。
これからAWS CLIを覚えようと考えている方は、参照する情報が公開された年月日も確認した方が良さそうですね。