出现此错误:
S3 err creating bucket: operation error S3: CreateBucket, https response error StatusCode: 0, RequestID: , HostID: , request send failed, Put "https://s3..amazonaws.com/astromail-test3.com": dial tcp: lookup s3..amazonaws.com: no such host. With bucket name: astromail-test3.com
当我将凭据切换为默认值时,它可以正常工作并创建存储桶。但是,当我使用自定义 IAM 时,它不起作用,但该错误不是权限错误。到底是怎么回事?我相信我已经设置了正确的权限,如果这是问题所在,通常 sdks 会输出一个权限被拒绝的权限,并且您可以更新所需的权限。上面的输出只是失败了。
package smtpstack
import (
"AstroMail/storage"
"context"
"fmt"
"regexp"
"strings"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/config"
"github.com/aws/aws-sdk-go-v2/service/s3"
)
// MakeAWSS3BucketNameCompliant makes a string compliant with AWS S3 bucket naming rules
func makeAWSS3BucketNameCompliant(input string) string {
// Convert the input string to lowercase
input = strings.ToLower(input)
// Replace invalid characters with "-"
invalidCharsRegex := regexp.MustCompile(`[^a-z0-9-.]`)
input = invalidCharsRegex.ReplaceAllString(input, "-")
// Replace multiple consecutive "-" with single "-"
input = strings.ReplaceAll(input, "--", "-")
// input = strings.ReplaceAll(input, ".", "-")
// Remove leading and trailing "-"
input = strings.Trim(input, "-")
// Limit the length to 63 characters
if len(input) > 63 {
input = input[:63]
}
return input
}
func CreateEmailBucket(domain string) error {
bucketName := makeAWSS3BucketNameCompliant(fmt.Sprintf("AstroMail-%s", domain))
sdkConfig, err := config.LoadDefaultConfig(context.TODO(), config.WithSharedConfigProfile("AstroMailApp"))
fmt.Println(sdkConfig, err, bucketName)
S3Client := s3.NewFromConfig(sdkConfig)
newBucket, err := S3Client.CreateBucket(context.TODO(), &s3.CreateBucketInput{
Bucket: aws.String(bucketName),
})
if err != nil {
return fmt.Errorf("S3 err creating bucket: %s. With bucket name: %s", err, bucketName)
}
fmt.Println("new bucket: ", newBucket)
storage.SaveKey("bucketName", bucketName)
return nil
}
我找到了解决方案,关键部分是将这个 config.WithRegion("us-east-1") 添加到 sdkConfig 变量初始化中。这是完整的代码,我做了一些更多的更改,例如等待创建存储桶。
func CreateEmailBucket(domain string) error {
bucketName := makeAWSS3BucketNameCompliant(fmt.Sprintf("AstroMail-%s", domain))
sdkConfig, err := config.LoadDefaultConfig(context.TODO(), config.WithSharedConfigProfile("AstroMailApp"), s)
fmt.Println(sdkConfig, err, bucketName)
s3Client := s3.NewFromConfig(sdkConfig)
createBucketParams := &s3.CreateBucketInput{
Bucket: aws.String(bucketName),
}
_, err = s3Client.CreateBucket(context.TODO(), createBucketParams)
if err != nil {
panic(fmt.Errorf("failed to create bucket: %v", err))
}
// Wait for S3 Bucket to Exist
fmt.Println("wait for s3 bucket to exist")
waiter := s3.NewBucketExistsWaiter(s3Client)
err = waiter.Wait(context.TODO(), &s3.HeadBucketInput{
Bucket: aws.String(bucketName),
}, 120*time.Second)
if err != nil {
panic(fmt.Sprintf("bucket failed to materialize: %v", err))
}
storage.SaveKey("bucketName", bucketName)
return nil
}
等待存储桶创建只是等待设定的时间,我认为这并不明智,因为它在大多数情况下创建得更快。我将使其循环并检查多次。谢谢评论的人。