オートスケーリンググループで今アクセスできるインスタンスのプライベートIPが欲しかったのですがAWS-CLIを組み合わせなくてはいけないようだったのでワンライナーで書いてみました
やる事は二つ
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を取得します
$ 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を抜き取ります
- running中のインスタンス
$ 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がとっても便利