如何向 AWS 验证 gocql
How to authenticate gocql to AWS
我有一个 Go 服务需要连接 AWS 上的 Keyspaces。我的 pod 有一个角色和 AWS_SECRET_ACCESS_KEY
、AWS_ACCESS_KEY_ID
和 AWS_SESSION_TOKEN
环境变量。
我想使用 aws SDK v2。我应该使用什么凭证提供者? ec2rolecreds
或其他(也许 stscreds
)?
我尝试实现 here 中的示例。但是我得到一个错误
no EC2 IMDS role found, operation error ec2imds: GetMetadata, request canceled, context deadline exceeded
在哪里可以找到工作示例和更多解释?
更新
现在我的代码如下所示:
awsCfg, err := awsConfig.LoadDefaultConfig(ctx)
if err != nil {
return nil, fmt.Errorf("failed to load AWS config: %w", err)
}
imdsClient := imds.NewFromConfig(awsCfg)
appCreds := aws.NewCredentialsCache(ec2rolecreds.New(func(options *ec2rolecreds.Options) {
options.Client = imdsClient
}))
cluster := gocql.NewCluster(cassandraHost)
auth := sigv4.NewAwsAuthenticator()
auth.SessionToken = value.SessionToken
auth.AccessKeyId = value.AccessKeyID
auth.SecretAccessKey = value.SecretAccessKey
cluster.Authenticator = auth
session, err := cluster.CreateSession()
Retrieve()
returns一个错误
no EC2 IMDS role found, operation error ec2imds: GetMetadata, exceeded maximum number of attempts, 3, request send failed, Get \"http://169.254.169.254/latest/meta-data/iam/security-credentials/\": dial tcp 169.254.169.254:80: connect: host is down
更新 2
在相同的环境下,AWS SDK v1 工作正常。因此实际上 AWS 端点可用。
session, err := aws_sess.NewSession()
if err != nil {
return fmt.Errorf("failed to create AWS session: %w", err)
}
creds := credentialsV1.NewChainCredentials(
[]credentialsV1.Provider{
&credentialsV1.EnvProvider{},
&ec2rolecredsV1.EC2RoleProvider{
Client: ec2metadataV1.New(session),
}})
value, getErr := creds.Get()
no EC2 IMDS role found, operation error ec2imds: GetMetadata, exceeded maximum number of attempts, 3, request send failed, Get \"http://169.254.169.254/latest/meta-data/iam/security-credentials/\": dial tcp 169.254.169.254:80: connect: host is down
您的代码片段正在尝试使用 EC2 实例 meta-data 服务来读取要使用的 IAM 角色。为此,您需要能够与其通信,并且该角色必须附加到该实例。
您的 Go 服务 运行 是在 EC2 实例上吗?如果不是,那将解释您的错误。如果是,请确保进程或容器具有适当的网络访问权限(例如:网络命名空间)以与 169.254.169.254 通信。
我有一个 Go 服务需要连接 AWS 上的 Keyspaces。我的 pod 有一个角色和 AWS_SECRET_ACCESS_KEY
、AWS_ACCESS_KEY_ID
和 AWS_SESSION_TOKEN
环境变量。
我想使用 aws SDK v2。我应该使用什么凭证提供者? ec2rolecreds
或其他(也许 stscreds
)?
我尝试实现 here 中的示例。但是我得到一个错误
no EC2 IMDS role found, operation error ec2imds: GetMetadata, request canceled, context deadline exceeded
在哪里可以找到工作示例和更多解释?
更新
现在我的代码如下所示:
awsCfg, err := awsConfig.LoadDefaultConfig(ctx)
if err != nil {
return nil, fmt.Errorf("failed to load AWS config: %w", err)
}
imdsClient := imds.NewFromConfig(awsCfg)
appCreds := aws.NewCredentialsCache(ec2rolecreds.New(func(options *ec2rolecreds.Options) {
options.Client = imdsClient
}))
cluster := gocql.NewCluster(cassandraHost)
auth := sigv4.NewAwsAuthenticator()
auth.SessionToken = value.SessionToken
auth.AccessKeyId = value.AccessKeyID
auth.SecretAccessKey = value.SecretAccessKey
cluster.Authenticator = auth
session, err := cluster.CreateSession()
Retrieve()
returns一个错误
no EC2 IMDS role found, operation error ec2imds: GetMetadata, exceeded maximum number of attempts, 3, request send failed, Get \"http://169.254.169.254/latest/meta-data/iam/security-credentials/\": dial tcp 169.254.169.254:80: connect: host is down
更新 2
在相同的环境下,AWS SDK v1 工作正常。因此实际上 AWS 端点可用。
session, err := aws_sess.NewSession()
if err != nil {
return fmt.Errorf("failed to create AWS session: %w", err)
}
creds := credentialsV1.NewChainCredentials(
[]credentialsV1.Provider{
&credentialsV1.EnvProvider{},
&ec2rolecredsV1.EC2RoleProvider{
Client: ec2metadataV1.New(session),
}})
value, getErr := creds.Get()
no EC2 IMDS role found, operation error ec2imds: GetMetadata, exceeded maximum number of attempts, 3, request send failed, Get \"http://169.254.169.254/latest/meta-data/iam/security-credentials/\": dial tcp 169.254.169.254:80: connect: host is down
您的代码片段正在尝试使用 EC2 实例 meta-data 服务来读取要使用的 IAM 角色。为此,您需要能够与其通信,并且该角色必须附加到该实例。
您的 Go 服务 运行 是在 EC2 实例上吗?如果不是,那将解释您的错误。如果是,请确保进程或容器具有适当的网络访问权限(例如:网络命名空间)以与 169.254.169.254 通信。