由于没有此类主机错误,Amazon S3 无法调用 API
Amazon S3 cannot call API because of no such host error
我正在尝试在 GoLang 中构建 Amazon S3 客户端,但在进行 API 调用时遇到问题。我收到一条错误消息,提示“没有这样的主机”,但我确信我提供的凭据是正确的。
正在定义一个结构来保存客户端
// the Client struct holding the client itself as well as the bucket.
type S3Client struct {
S3clientObject s3.S3
bucket string
}
// Initialize the client
func CreateS3Client() S3Client{
S3clientCreate := S3Client{S3clientObject: Connect(), bucket: GetS3Bucket()}
if (!CheckBuckets(S3clientCreate)) {
exitErrorf("Bucket does not exist, try again.")
}
return S3clientCreate
}
正在连接到存储桶
func Connect() s3.S3{
// Initialize a session
sess, err := session.NewSession(&aws.Config{
Credentials: credentials.NewStaticCredentials("myCredentials", "myCreds", ""),
Endpoint: aws.String("myDomain"),
Region: aws.String("myRegion"),
},
)
if err != nil {
exitErrorf("Unable to use credentials, %v", err)
}
// Create S3 service client
svc := s3.New(sess)
return *svc
}
此时,我能够建立连接并使用 ListBuckets 功能接收所有存储桶的列表(如下所示:https://docs.aws.amazon.com/sdk-for-go/api/service/s3/#S3.ListBuckets)
当我尝试调用 GetObject API 时,它告诉我找不到主机
// Gets an object from the bucket
func Get(client S3Client, key string) interface{} {
// golang does not support "default values" so I used a nil (same as null)
if (key == "") {
return nil
}
svc := client.S3clientObject
input := &s3.GetObjectInput{
Bucket: aws.String("myBucket"),
Key: aws.String("myPathKey"),
}
result, err := svc.GetObject(input)
if err != nil {
if aerr, ok := err.(awserr.Error); ok {
switch aerr.Code() {
case s3.ErrCodeNoSuchKey:
fmt.Println(s3.ErrCodeNoSuchKey, aerr.Error())
case s3.ErrCodeInvalidObjectState:
fmt.Println(s3.ErrCodeInvalidObjectState, aerr.Error())
default:
fmt.Println(aerr.Error())
}
} else {
fmt.Println(err.Error())
}
}
return result
}
这个returns:
dial tcp: lookup "hostname": no such host
我不明白为什么会这样,因为我能够成功连接到存储桶,并使用 ListBuckets 列出它们,但是当使用另一个 API 调用时,它找不到主持人。我的代码有问题吗?还有其他配置我忘了吗?
非常感谢任何帮助或指导,因为我对使用 GoLang 和 S3 还有些陌生。
显然问题出在存储桶名称上。为了解决这个问题,我所做的只是在创建它时在存储桶名称前面加上一个“/”,它起作用了。
我正在尝试在 GoLang 中构建 Amazon S3 客户端,但在进行 API 调用时遇到问题。我收到一条错误消息,提示“没有这样的主机”,但我确信我提供的凭据是正确的。
正在定义一个结构来保存客户端
// the Client struct holding the client itself as well as the bucket.
type S3Client struct {
S3clientObject s3.S3
bucket string
}
// Initialize the client
func CreateS3Client() S3Client{
S3clientCreate := S3Client{S3clientObject: Connect(), bucket: GetS3Bucket()}
if (!CheckBuckets(S3clientCreate)) {
exitErrorf("Bucket does not exist, try again.")
}
return S3clientCreate
}
正在连接到存储桶
func Connect() s3.S3{
// Initialize a session
sess, err := session.NewSession(&aws.Config{
Credentials: credentials.NewStaticCredentials("myCredentials", "myCreds", ""),
Endpoint: aws.String("myDomain"),
Region: aws.String("myRegion"),
},
)
if err != nil {
exitErrorf("Unable to use credentials, %v", err)
}
// Create S3 service client
svc := s3.New(sess)
return *svc
}
此时,我能够建立连接并使用 ListBuckets 功能接收所有存储桶的列表(如下所示:https://docs.aws.amazon.com/sdk-for-go/api/service/s3/#S3.ListBuckets)
当我尝试调用 GetObject API 时,它告诉我找不到主机
// Gets an object from the bucket
func Get(client S3Client, key string) interface{} {
// golang does not support "default values" so I used a nil (same as null)
if (key == "") {
return nil
}
svc := client.S3clientObject
input := &s3.GetObjectInput{
Bucket: aws.String("myBucket"),
Key: aws.String("myPathKey"),
}
result, err := svc.GetObject(input)
if err != nil {
if aerr, ok := err.(awserr.Error); ok {
switch aerr.Code() {
case s3.ErrCodeNoSuchKey:
fmt.Println(s3.ErrCodeNoSuchKey, aerr.Error())
case s3.ErrCodeInvalidObjectState:
fmt.Println(s3.ErrCodeInvalidObjectState, aerr.Error())
default:
fmt.Println(aerr.Error())
}
} else {
fmt.Println(err.Error())
}
}
return result
}
这个returns:
dial tcp: lookup "hostname": no such host
我不明白为什么会这样,因为我能够成功连接到存储桶,并使用 ListBuckets 列出它们,但是当使用另一个 API 调用时,它找不到主持人。我的代码有问题吗?还有其他配置我忘了吗?
非常感谢任何帮助或指导,因为我对使用 GoLang 和 S3 还有些陌生。
显然问题出在存储桶名称上。为了解决这个问题,我所做的只是在创建它时在存储桶名称前面加上一个“/”,它起作用了。