2023-03-21 13:34:52 +01:00
package mtdaws
2023-03-14 15:12:28 +01:00
import (
2023-03-15 15:30:29 +01:00
"context"
"fmt"
"os"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/config"
"github.com/aws/aws-sdk-go-v2/service/ec2"
"github.com/aws/aws-sdk-go-v2/service/ec2/types"
2023-03-21 13:34:52 +01:00
"github.com/google/uuid"
"github.com/thefeli73/polemos/state"
2023-03-14 15:12:28 +01:00
)
2023-03-21 13:34:52 +01:00
// NewConfig creates a AWS config for a specific region
func NewConfig ( region string , credentials string ) aws . Config {
2023-03-15 15:30:29 +01:00
// Create a new AWS config
2023-03-20 15:43:14 +01:00
cfg , err := config . LoadDefaultConfig ( context . TODO ( ) , config . WithSharedConfigFiles ( [ ] string { credentials } ) , config . WithRegion ( region ) )
2023-03-15 15:30:29 +01:00
if err != nil {
fmt . Println ( "Error creating config:" , err )
fmt . Println ( "Configure Credentials in line with the documentation found here: https://aws.github.io/aws-sdk-go-v2/docs/configuring-sdk/#specifying-credentials" )
os . Exit ( 1 )
}
return cfg
}
2023-03-21 13:34:52 +01:00
// IndexInstances scans all configured regions for instances and add them to services
func IndexInstances ( config state . Config ) {
for _ , region := range config . AWS . Regions {
//fmt.Println("Listing instances in region:", region)
awsConfig := NewConfig ( region , config . AWS . CredentialsPath )
instances , err := Instances ( awsConfig )
if err != nil {
fmt . Println ( "Error listing instances:" , err )
continue
}
for _ , instance := range instances {
InstanceInfo ( awsConfig , * instance . InstanceId )
u := uuid . New ( )
_ = u
}
}
}
// InstanceInfo collects info about a specific instance in a region
func InstanceInfo ( config aws . Config , instanceID string ) {
2023-03-15 15:30:29 +01:00
// Create a new EC2 service client
svc := ec2 . NewFromConfig ( config )
input := & ec2 . DescribeInstancesInput {
InstanceIds : [ ] string { instanceID } ,
}
result , err := svc . DescribeInstances ( context . TODO ( ) , input )
if err != nil {
fmt . Println ( "Error describing instance:" , err )
return
}
// Print instance information
instance := result . Reservations [ 0 ] . Instances [ 0 ]
fmt . Println ( "Instance ID:" , aws . ToString ( instance . InstanceId ) )
fmt . Println ( "Instance Type:" , string ( instance . InstanceType ) )
fmt . Println ( "AMI ID:" , aws . ToString ( instance . ImageId ) )
fmt . Println ( "State:" , string ( instance . State . Name ) )
fmt . Println ( "Availability Zone:" , aws . ToString ( instance . Placement . AvailabilityZone ) )
if instance . PublicIpAddress != nil {
fmt . Println ( "Public IP Address:" , aws . ToString ( instance . PublicIpAddress ) )
}
fmt . Println ( "Private IP Address:" , aws . ToString ( instance . PrivateIpAddress ) )
}
2023-03-21 13:34:52 +01:00
// Instances returns all instances for a config i.e. a region
2023-03-15 15:30:29 +01:00
func Instances ( config aws . Config ) ( [ ] * types . Instance , error ) {
svc := ec2 . NewFromConfig ( config )
input := & ec2 . DescribeInstancesInput { }
var instances [ ] * types . Instance
paginator := ec2 . NewDescribeInstancesPaginator ( svc , input )
for paginator . HasMorePages ( ) {
page , err := paginator . NextPage ( context . TODO ( ) )
if err != nil {
return nil , err
}
for _ , reservation := range page . Reservations {
for _ , instance := range reservation . Instances {
instances = append ( instances , & instance )
}
}
}
return instances , nil
2023-03-14 15:12:28 +01:00
}