Created
July 21, 2017 00:47
-
-
Save inokappa/58ea3b6bd911eeee356b9db19ccd2889 to your computer and use it in GitHub Desktop.
EC2 を起動したり停止したり、一覧を取得するやつ
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"os" | |
"fmt" | |
"flag" | |
"strings" | |
"github.com/aws/aws-sdk-go/aws" | |
"github.com/aws/aws-sdk-go/aws/session" | |
"github.com/aws/aws-sdk-go/aws/credentials" | |
"github.com/aws/aws-sdk-go/service/ec2" | |
"github.com/olekukonko/tablewriter" | |
) | |
var ( | |
argProfile = flag.String("profile", "", "Profile 名を指定.") | |
argRegion = flag.String("region", "ap-northeast-1", "Region 名を指定.") | |
argInstances = flag.String("instances", "", "Instance ID 又は Instance Tag 名を指定.") | |
argStart = flag.Bool("start", false, "Instance を起動.") | |
argStop = flag.Bool("stop", false, "Instance を停止.") | |
) | |
func outputTbl(data [][]string) { | |
table := tablewriter.NewWriter(os.Stdout) | |
table.SetHeader([]string{"tag:Name", "InstanceId", "InstanceType", "AZ", "PrivateIp", "PublicIp", "Status"}) | |
for _, value := range data { | |
table.Append(value) | |
} | |
table.Render() | |
} | |
func awsEc2Client(profile string, region string) *ec2.EC2 { | |
var config aws.Config | |
if profile != "" { | |
creds := credentials.NewSharedCredentials("", profile) | |
config = aws.Config{Region: aws.String(region), Credentials: creds} | |
} else { | |
config = aws.Config{Region: aws.String(region)} | |
} | |
sess := session.New(&config) | |
ec2Client := ec2.New(sess) | |
return ec2Client | |
} | |
func listInstances(ec2Client *ec2.EC2, instances []*string) { | |
params := &ec2.DescribeInstancesInput { | |
InstanceIds: instances, | |
} | |
res, err := ec2Client.DescribeInstances(params) | |
if err != nil { | |
fmt.Println(err.Error()) | |
os.Exit(1) | |
} | |
allInstances := [][]string{} | |
for _, r := range res.Reservations { | |
for _, i := range r.Instances { | |
var tag_name string | |
for _, t := range i.Tags { | |
if *t.Key == "Name" { | |
tag_name = *t.Value | |
} | |
} | |
if i.PublicIpAddress == nil { | |
i.PublicIpAddress = aws.String("Not assignment") | |
} | |
instance := []string{ | |
tag_name, | |
*i.InstanceId, | |
*i.InstanceType, | |
*i.Placement.AvailabilityZone, | |
*i.PrivateIpAddress, | |
*i.PublicIpAddress, | |
*i.State.Name, | |
} | |
allInstances = append(allInstances, instance) | |
} | |
} | |
outputTbl(allInstances) | |
} | |
func startInstances(ec2Client *ec2.EC2, instances []*string) { | |
params := &ec2.StartInstancesInput{ | |
InstanceIds: instances, | |
} | |
result, err := ec2Client.StartInstances(params) | |
if err != nil { | |
fmt.Println(err.Error()) | |
os.Exit(1) | |
} | |
for _, r := range result.StartingInstances { | |
fmt.Printf("%s を起動しました.\n", *r.InstanceId) | |
} | |
} | |
func stopInstances(ec2Client *ec2.EC2, instances []*string) { | |
params := &ec2.StopInstancesInput{ | |
InstanceIds: instances, | |
} | |
// fmt.Println(params) | |
result, err := ec2Client.StopInstances(params) | |
if err != nil { | |
fmt.Println(err.Error()) | |
os.Exit(1) | |
} | |
for _, r := range result.StoppingInstances { | |
fmt.Printf("%s を停止しました.\n", *r.InstanceId) | |
} | |
} | |
func ctrlInstances(ec2Client *ec2.EC2, instances []*string, operation string) { | |
listInstances(ec2Client, instances) | |
fmt.Print("上記のインスタンスを操作しますか?(y/n): ") | |
var stdin string | |
fmt.Scan(&stdin) | |
switch stdin { | |
case "y", "Y": | |
switch operation { | |
case "start": | |
fmt.Println("EC2 を起動します.") | |
startInstances(ec2Client, instances) | |
case "stop": | |
fmt.Println("EC2 を停止します.") | |
stopInstances(ec2Client, instances) | |
} | |
case "n", "N": | |
fmt.Println("処理を停止します.") | |
os.Exit(0) | |
default: | |
fmt.Println("処理を停止します.") | |
os.Exit(0) | |
} | |
} | |
func getInstanceIds(ec2Client *ec2.EC2, instances string) []*string { | |
splitedInstances := strings.Split(instances, ",") | |
res, err := ec2Client.DescribeInstances(nil) | |
if err != nil { | |
fmt.Println(err.Error()) | |
os.Exit(1) | |
} | |
var instanceIds []*string | |
for _, s := range splitedInstances { | |
for _, r := range res.Reservations { | |
for _, i := range r.Instances { | |
for _, t := range i.Tags { | |
if *t.Key == "Name" { | |
if *t.Value == s { | |
instanceIds = append(instanceIds, aws.String(*i.InstanceId)) | |
} | |
} | |
} | |
if *i.InstanceId == s { | |
instanceIds = append(instanceIds, aws.String(*i.InstanceId)) | |
} | |
} | |
} | |
} | |
return instanceIds | |
} | |
func main() { | |
flag.Parse() | |
//if *argProfile == "" { | |
// fmt.Println("`-profile` オプションを指定して下さい.") | |
// os.Exit(1) | |
//} | |
ec2Client := awsEc2Client(*argProfile, *argRegion) | |
var instances []*string | |
if *argInstances != "" { | |
instances = getInstanceIds(ec2Client, *argInstances) | |
if *argStart { | |
ctrlInstances(ec2Client, instances, "start") | |
} else if *argStop { | |
ctrlInstances(ec2Client, instances, "stop") | |
} else { | |
fmt.Println("`-start` 又は `-stop` オプションを指定して下さい.") | |
os.Exit(1) | |
} | |
} else { | |
listInstances(ec2Client, nil) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment