AWS 创建存储桶失败,问题是什么?

问题描述 投票:0回答:1

出现此错误:

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
}
amazon-web-services go amazon-s3 aws-sdk
1个回答
0
投票

我找到了解决方案,关键部分是将这个 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
}

等待存储桶创建只是等待设定的时间,我认为这并不明智,因为它在大多数情况下创建得更快。我将使其循环并检查多次。谢谢评论的人。

© www.soinside.com 2019 - 2024. All rights reserved.