notebook

都内でWEB系エンジニアやってます。

jqとAWS CLIでautoscaling groupのprivate ip addressを取得するワンライナー

オートスケーリンググループで今アクセスできるインスタンスのプライベートIPが欲しかったのですがAWS-CLIを組み合わせなくてはいけないようだったのでワンライナーで書いてみました

やる事は二つ

  • オートスケーリンググループのインスタンスIDを取得
    • リクエストを受け付けられるという条件で絞る
  • 取得したインスタンスIDを使ってEC2の情報を取得する

CREDENTIALSの用意

  • credentials-as.txt
AWSAccessKeyId=***
AWSSecretKey=***
  • 登録
export AWS_CREDENTIAL_FILE=filepath

オートスケーリンググループのEC2インスタンス情報を取得

まず特定スケーリンググループのEC2インスタンスの情報を取得します

$ aws autoscaling describe-auto-scaling-groups
{
    "AutoScalingGroups": [
        {
            "AutoScalingGroupARN": "arn:aws:autoscaling:ap-southeast-1:111111111111:autoScalingGroup:d127f2ec-e573-4fb9-974d-15ecdc9661ee:autoScalingGroupName/backends",
            "HealthCheckGracePeriod": 300,
            "SuspendedProcesses": [],
            "DesiredCapacity": 3,
            "Tags": [
                {
                    "ResourceType": "auto-scaling-group",
                    "ResourceId": "backends",
...
...
...

色々情報が取ってこれているようです、ここからjqで絞込みを行います

今回はbackendsというスケーリンググループのリクエストを受けれる状態になっているインスタンスを取得したいため下記条件でフィルタリングします

  • AutoScalingGroupName : backends
  • Lifecyclestate : InService
  • HealthStatus : Healthy

各階層で条件を絞っていき最後にインスタンスIDだけを出力するようにしました

-rオプションでクォートをはずせます

$ aws autoscaling describe-auto-scaling-groups | jq -r '.AutoScalingGroups[]|select(.AutoScalingGroupName == "backends")|.Instances[]|select(.LifecycleState == "InService")|select(.HealthStatus == "Healthy")|.InstanceId'
i-2af44ca3
i-7c94ecd9
i-1dff85b8

インスタンスの情報を取得

次に上記から取得したインスタンスIDを使ってプライベートIPを取得します

インスタンスIDは複数指定可

$ aws ec2 describe-instances --instance-ids i-aabbcc 1-ddeeff
{
    "Reservations": [
        {
            "OwnerId": "111111111111",
            "ReservationId": "r-c121901d",
            "Groups": [],
            "RequesterId": "222222222222",
            "Instances": [
                {
                    "Monitoring": {
                        "State": "disabled"
                    },
                    "PublicDnsName": "",
                    "RootDeviceType": "ebs",
                    "State": {
                        "Code": 16,
                        "Name": "running"
                    },
                    "EbsOptimized": false,
                    "LaunchTime": "2015-12-17T11:44:10.000Z",
                    "PrivateIpAddress": "10.0.1.155",
                    "ProductCodes": [],
                    "VpcId": "vpc-1ab21f14",
...
...
...

これまた色々な情報が取れます

インスタンスのプライベートIPを取得

特定インスタンスの情報から下記条件でプライベートIPを抜き取ります

$ aws ec2 describe-instances --instance-ids i-aabbcc i-ddeeff i-gghhii | jq -r '.Reservations[].Instances[]|select(.State.Name == "running")|.PrivateIpAddress'
10.0.2.220
10.0.1.59
10.0.1.155

うまく出力できました

ワンライナー

上記からinstance_idをパイプで渡してあげればワンライナーで出す事が可能です

$ aws autoscaling describe-auto-scaling-groups | jq -r '.AutoScalingGroups[]|select(.AutoScalingGroupName == "backends")|.Instances[]|select(.LifecycleState == "InService")|select(.HealthStatus == "Healthy")|.InstanceId' | xargs -i aws ec2 describe-instances --instance-ids {} | jq -r '.Reservations[].Instances[]|select(.State.Name == "running")|.PrivateIpAddress'
10.0.2.220
10.0.1.59
10.0.1.155

GroupNameを引数で渡してコマンド化すれば便利かもしれませんね

まとめ

いまさらながらjqがとっても便利

AWS CLIpython版では--queryオプションで同様の事ができるようなのでそっち使ってもいいかもですね