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 }