

# Conexión al clúster de base de datos mediante la autenticación de IAM y el AWS SDK para Go
<a name="UsingWithRDS.IAMDBAuth.Connecting.Go"></a>

Puede conectarse a un clúster de bases de datos de Aurora MySQL o Aurora PostgreSQL con el AWS SDK para Go como se describe a continuación.

**Requisitos previos**  
A continuación, se muestran requisitos previos para conectarse al clúster de de base de datos mediante la autenticación de IAM:
+ [Activación y desactivación de la autenticación de bases de datos de IAM](UsingWithRDS.IAMDBAuth.Enabling.md)
+ [Creación y uso de una política de IAM para el acceso a bases de datos de IAM](UsingWithRDS.IAMDBAuth.IAMPolicy.md)
+ [Creación de cuentas de base de datos utilizando autenticación de IAM](UsingWithRDS.IAMDBAuth.DBAccounts.md)

**Ejemplos**  
Para ejecutar estos ejemplos de código, necesita [AWS SDK para Go](https://aws.amazon.com/sdk-for-go/), que se encuentra en el sitio de AWS.

Modifique los valores de las siguientes variables según sea necesario:
+ `dbName`: la base de datos a la que desea obtener acceso.
+ `dbUser`: la cuenta de base de datos a la que desea acceder.
+ `dbHost`: el punto de enlace del clúster de bases de datos que desea acceder
**nota**  
No puede utilizar un registro DNS personalizado de Route 53 en lugar del punto de conexión del clúster de base de datos para generar el token de autenticación.
+ `dbPort`: el número de puerto que se utiliza para conectarse al clúster de bases de datos.
+ `region`: la región de AWS en la que se ejecuta el clúster de bases de datos

Además, debe asegurarse de que las bibliotecas importadas en el código de muestra existen en el sistema.

**importante**  
En los ejemplos de esta sección se utiliza el código siguiente para proporcionar credenciales que tienen acceso a una base de datos desde un entorno local:  
`creds := credentials.NewEnvCredentials()`  
Si accede a una base de datos desde un servicio de AWS, como Amazon EC2 o Amazon ECS, puede reemplazar el código por el siguiente código:  
`sess := session.Must(session.NewSession())`  
`creds := sess.Config.Credentials`  
Si realiza este cambio, asegúrese de agregar la siguiente importación:  
`"github.com/aws/aws-sdk-go/aws/session"`

**Topics**
+ [Conexión mediante la autenticación de IAM y el V2 AWS SDK para Go](#UsingWithRDS.IAMDBAuth.Connecting.GoV2)
+ [Conexión mediante la autenticación de IAM y el V1 AWS SDK para Go](#UsingWithRDS.IAMDBAuth.Connecting.GoV1)

## Conexión mediante la autenticación de IAM y el V2 AWS SDK para Go
<a name="UsingWithRDS.IAMDBAuth.Connecting.GoV2"></a>

Se puede conectar a un de instancia de base de datos mediante la autenticación de IAM y el V2AWS SDK para Go.

En los siguientes ejemplos de código, se muestra cómo se genera un token de autenticación y cómo se utiliza para conectarse a un clúster de bases de datos. 

Este código se conecta a un clúster de bases de datos de Aurora MySQL.

```
package main
                
import (
     "context"
     "database/sql"
     "fmt"

     "github.com/aws/aws-sdk-go-v2/config"
     "github.com/aws/aws-sdk-go-v2/feature/rds/auth"
     _ "github.com/go-sql-driver/mysql"
)

func main() {

     var dbName string = "DatabaseName"
     var dbUser string = "DatabaseUser"
     var dbHost string = "mysqlcluster.cluster-123456789012.us-east-1.rds.amazonaws.com"
     var dbPort int = 3306
     var dbEndpoint string = fmt.Sprintf("%s:%d", dbHost, dbPort)
     var region string = "us-east-1"

    cfg, err := config.LoadDefaultConfig(context.TODO())
    if err != nil {
    	panic("configuration error: " + err.Error())
    }

    authenticationToken, err := auth.BuildAuthToken(
    	context.TODO(), dbEndpoint, region, dbUser, cfg.Credentials)
    if err != nil {
	    panic("failed to create authentication token: " + err.Error())
    }

    dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?tls=true&allowCleartextPasswords=true",
        dbUser, authenticationToken, dbEndpoint, dbName,
    )

    db, err := sql.Open("mysql", dsn)
    if err != nil {
        panic(err)
    }

    err = db.Ping()
    if err != nil {
        panic(err)
    }
}
```

Este código se conecta a un clúster de bases de datos de Aurora PostgreSQL.

```
package main

import (
     "context"
     "database/sql"
     "fmt"

     "github.com/aws/aws-sdk-go-v2/config"
     "github.com/aws/aws-sdk-go-v2/feature/rds/auth"
     _ "github.com/lib/pq"
)

func main() {

     var dbName string = "DatabaseName"
     var dbUser string = "DatabaseUser"
     var dbHost string = "postgresmycluster.cluster-123456789012.us-east-1.rds.amazonaws.com"
     var dbPort int = 5432
     var dbEndpoint string = fmt.Sprintf("%s:%d", dbHost, dbPort)
     var region string = "us-east-1"

    cfg, err := config.LoadDefaultConfig(context.TODO())
    if err != nil {
    	panic("configuration error: " + err.Error())
    }

    authenticationToken, err := auth.BuildAuthToken(
    	context.TODO(), dbEndpoint, region, dbUser, cfg.Credentials)
    if err != nil {
	    panic("failed to create authentication token: " + err.Error())
    }

    dsn := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s",
        dbHost, dbPort, dbUser, authenticationToken, dbName,
    )

    db, err := sql.Open("postgres", dsn)
    if err != nil {
        panic(err)
    }

    err = db.Ping()
    if err != nil {
        panic(err)
    }
}
```

Si desea conectarse a un clúster de base de datos a través de un proxy, consulte [Conexión a una base de datos mediante autenticación de IAM](rds-proxy-connecting.md#rds-proxy-connecting-iam).

## Conexión mediante la autenticación de IAM y el V1 AWS SDK para Go
<a name="UsingWithRDS.IAMDBAuth.Connecting.GoV1"></a>

Conexión a un clúster de bases de datos mediante la autenticación de IAM y el V1 AWS SDK para Go

En los siguientes ejemplos de código, se muestra cómo se genera un token de autenticación y cómo se utiliza para conectarse a un clúster de bases de datos. 

Este código se conecta a un clúster de bases de datos de Aurora MySQL.

```
package main
         
import (
    "database/sql"
    "fmt"
    "log"

    "github.com/aws/aws-sdk-go/aws/credentials"
    "github.com/aws/aws-sdk-go/service/rds/rdsutils"
    _ "github.com/go-sql-driver/mysql"
)

func main() {
    dbName := "app"
    dbUser := "jane_doe"
    dbHost := "mysqlcluster.cluster-123456789012.us-east-1.rds.amazonaws.com"
    dbPort := 3306
    dbEndpoint := fmt.Sprintf("%s:%d", dbHost, dbPort)
    region := "us-east-1"

    creds := credentials.NewEnvCredentials()
    authToken, err := rdsutils.BuildAuthToken(dbEndpoint, region, dbUser, creds)
    if err != nil {
        panic(err)
    }

    dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?tls=true&allowCleartextPasswords=true",
        dbUser, authToken, dbEndpoint, dbName,
    )

    db, err := sql.Open("mysql", dsn)
    if err != nil {
        panic(err)
    }

    err = db.Ping()
    if err != nil {
        panic(err)
    }
}
```

Este código se conecta a un clúster de bases de datos de Aurora PostgreSQL.

```
package main

import (
	"database/sql"
	"fmt"

	"github.com/aws/aws-sdk-go/aws/credentials"
	"github.com/aws/aws-sdk-go/service/rds/rdsutils"
	_ "github.com/lib/pq"
)

func main() {
    dbName := "app"
    dbUser := "jane_doe"
    dbHost := "postgresmycluster.cluster-123456789012.us-east-1.rds.amazonaws.com"
    dbPort := 5432
    dbEndpoint := fmt.Sprintf("%s:%d", dbHost, dbPort)
    region := "us-east-1"

    creds := credentials.NewEnvCredentials()
    authToken, err := rdsutils.BuildAuthToken(dbEndpoint, region, dbUser, creds)
    if err != nil {
        panic(err)
    }

    dsn := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s",
        dbHost, dbPort, dbUser, authToken, dbName,
    )

    db, err := sql.Open("postgres", dsn)
    if err != nil {
        panic(err)
    }

    err = db.Ping()
    if err != nil {
        panic(err)
    }
}
```

Si desea conectarse a un clúster de base de datos a través de un proxy, consulte [Conexión a una base de datos mediante autenticación de IAM](rds-proxy-connecting.md#rds-proxy-connecting-iam).