如何获取 AWS 凭证并访问 Docker 上的 S3

我正在设置 Docker 容器。

在服务器端,文件上传到S3。

在我本地环境下上传成功。

但是在Docker环境下上传失败。

article

 ├ client

 ├ api  

 └ docker-compose.yml

这是 docker-compose.yml:


version: '3'

services:

  api:

    build:

      dockerfile: Dockerfile.dev

      context: ./api

    volumes:

      - ./api:/app

    ports:

      - 2345:2345

    depends_on:

      - db

    tty: true

    volumes:

      - $HOME/.aws/credentials.properties:/home/api/.aws/credentials.properties

这是访问 S3 的服务器端代码。


api := router.Group("/api")

{

    api.POST("/post/image", func(c *gin.Context) {

        var creds *credentials.Credentials

        var err error


        creds = credentials.NewSharedCredentials("", "default")

        _, err = creds.Get()


        if err != nil {

            creds = credentials.NewCredentials(&ec2rolecreds.EC2RoleProvider{})

            _, err = creds.Get()

        }


        cfg := aws.NewConfig().WithRegion("ap-northeast-1").WithCredentials(creds)

        svc := s3.New(session.New(), cfg)


        form, _ := c.MultipartForm()


        files := form.File["images[]"]


        var imageNames []ImageName

        imageName := ImageName{}


        for _, file := range files {


            f, err := file.Open()


            if err != nil {

                log.Println(err)

            }


            defer f.Close()


            size := file.Size

            buffer := make([]byte, size)


            f.Read(buffer)

            fileBytes := bytes.NewReader(buffer)

            fileType := http.DetectContentType(buffer)

            path := "/media/" + file.Filename

            params := &s3.PutObjectInput{

                Bucket:        aws.String("article-s3-jpskgc"),

                Key:           aws.String(path),

                Body:          fileBytes,

                ContentLength: aws.Int64(size),

                ContentType:   aws.String(fileType),

            }


我希望图像在服务器端上传到 S3。



慕后森
浏览 190回答 3
3回答

慕森卡

我设置环境变量docker-compose.yml并在控制台中设置值。    environment:      - AWS_ACCESS_KEY_ID      - AWS_SECRET_ACCESS_KEY$ export AWS_ACCESS_KEY_ID=$(aws --profile default configure get aws_access_key_id)$ export AWS_SECRET_ACCESS_KEY=$(aws --profile default configure get aws_secret_access_key)creds := credentials.NewStaticCredentials(os.Getenv("AWS_ACCESS_KEY_ID"), os.Getenv("AWS_SECRET_ACCESS_KEY"), "")

千万里不及你

您可以使用环境变量传递您的凭据,如下所示:AWS_ACCESS_KEY_ID=xxxAWS_SECRET_ACCESS_KEY=yyy所以你的 docker-compose 看起来像:version: '3'services:  api:    build:      dockerfile: Dockerfile.dev      context: ./api    volumes:      - ./api:/app    environment:      AWS_ACCESS_KEY_ID: YOUR-ACCESS-KEY-ID      AWS_SECRET_ACCESS_KEY: YOUR-SECRET-KEY    ports:      - 2345:2345    depends_on:      - db    tty: true您不应该在生产中执行此操作,而应该使用 IAM 配置文件,这既是为了简单起见,避免到处都有大量密钥,也是为了安全性,避免在日志或任何地方泄露密钥,但它非常适合开发目的。

PIPIONE

我通过将主机 .aws 目录挂载到 docker 容器 docker-compose.yml 来使 AWS SDK for Go V2 满意:    volumes:       - $HOME/.aws/credentials:/.aws/credentials:roSDK 会在目录.aws下查找目录$HOME,因此您可能需要找出HOMEdocker 容器中的 env,然后进行相应更新。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go