github.com/aavshr/aws-sdk-go@v1.41.3/service/rds/rdsutils/example_test.go (about)

     1  //go:build example
     2  // +build example
     3  
     4  package rdsutils_test
     5  
     6  import (
     7  	"database/sql"
     8  	"flag"
     9  	"fmt"
    10  	"net/url"
    11  	"os"
    12  
    13  	"github.com/aavshr/aws-sdk-go/aws/credentials/stscreds"
    14  	"github.com/aavshr/aws-sdk-go/aws/session"
    15  	"github.com/aavshr/aws-sdk-go/service/rds/rdsutils"
    16  )
    17  
    18  // ExampleConnectionStringBuilder contains usage of assuming a role and using
    19  // that to build the auth token.
    20  //
    21  // For MySQL you many need to configure your MySQL driver with the TLS
    22  // certificate to ensure verified TLS handshake,
    23  // https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem
    24  //
    25  // Usage:
    26  //	./main -user "iamuser" -dbname "foo" -region "us-west-2" -rolearn "arn" -endpoint "dbendpoint" -port 3306
    27  func ExampleConnectionStringBuilder() {
    28  	userPtr := flag.String("user", "", "user of the credentials")
    29  	regionPtr := flag.String("region", "us-east-1", "region to be used when grabbing sts creds")
    30  	roleArnPtr := flag.String("rolearn", "", "role arn to be used when grabbing sts creds")
    31  	endpointPtr := flag.String("endpoint", "", "DB endpoint to be connected to")
    32  	portPtr := flag.Int("port", 3306, "DB port to be connected to")
    33  	tablePtr := flag.String("table", "test_table", "DB table to query against")
    34  	dbNamePtr := flag.String("dbname", "", "DB name to query against")
    35  	flag.Parse()
    36  
    37  	// Check required flags. Will exit with status code 1 if
    38  	// required field isn't set.
    39  	if err := requiredFlags(
    40  		userPtr,
    41  		regionPtr,
    42  		roleArnPtr,
    43  		endpointPtr,
    44  		portPtr,
    45  		dbNamePtr,
    46  	); err != nil {
    47  		fmt.Printf("Error: %v\n\n", err)
    48  		flag.PrintDefaults()
    49  		os.Exit(1)
    50  	}
    51  
    52  	sess := session.Must(session.NewSession())
    53  	creds := stscreds.NewCredentials(sess, *roleArnPtr)
    54  
    55  	v := url.Values{}
    56  	// required fields for DB connection
    57  	v.Add("tls", "rds")
    58  	v.Add("allowCleartextPasswords", "true")
    59  	endpoint := fmt.Sprintf("%s:%d", *endpointPtr, *portPtr)
    60  
    61  	b := rdsutils.NewConnectionStringBuilder(endpoint, *regionPtr, *userPtr, *dbNamePtr, creds)
    62  	connectStr, err := b.WithTCPFormat().WithParams(v).Build()
    63  
    64  	const dbType = "mysql"
    65  	db, err := sql.Open(dbType, connectStr)
    66  	// if an error is encountered here, then most likely security groups are incorrect
    67  	// in the database.
    68  	if err != nil {
    69  		panic(fmt.Errorf("failed to open connection to the database"))
    70  	}
    71  
    72  	rows, err := db.Query(fmt.Sprintf("SELECT * FROM %s  LIMIT 1", *tablePtr))
    73  	if err != nil {
    74  		panic(fmt.Errorf("failed to select from table, %q, with %v", *tablePtr, err))
    75  	}
    76  
    77  	for rows.Next() {
    78  		columns, err := rows.Columns()
    79  		if err != nil {
    80  			panic(fmt.Errorf("failed to read columns from row: %v", err))
    81  		}
    82  
    83  		fmt.Printf("rows colums:\n%d\n", len(columns))
    84  	}
    85  }
    86  
    87  func requiredFlags(flags ...interface{}) error {
    88  	for _, f := range flags {
    89  		switch f.(type) {
    90  		case nil:
    91  			return fmt.Errorf("one or more required flags were not set")
    92  		}
    93  	}
    94  	return nil
    95  }