为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕后森 2023-07-10 14:29:40
我正在设置 Docker 容器。在服务器端,文件上传到S3。在我本地环境下上传成功。但是在Docker环境下上传失败。客户端:React/axios服务器:Golang/杜松子酒数据库:mysql源代码: https: //github.com/jpskgc/articlearticle ├ 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。
查看完整描述

3 回答

?
慕森卡

TA贡献1806条经验 获得超8个赞

我设置环境变量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"), "")



查看完整回答
反对 回复 2023-07-10
?
千万里不及你

TA贡献1784条经验 获得超9个赞

您可以使用环境变量传递您的凭据,如下所示:


AWS_ACCESS_KEY_ID=xxx

AWS_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 配置文件,这既是为了简单起见,避免到处都有大量密钥,也是为了安全性,避免在日志或任何地方泄露密钥,但它非常适合开发目的。

查看完整回答
反对 回复 2023-07-10
?
PIPIONE

TA贡献1829条经验 获得超9个赞

我通过将主机 .aws 目录挂载到 docker 容器 docker-compose.yml 来使 AWS SDK for Go V2 满意:

    volumes:
      - $HOME/.aws/credentials:/.aws/credentials:ro

SDK 会在目录.aws下查找目录$HOME,因此您可能需要找出HOMEdocker 容器中的 env,然后进行相应更新。


查看完整回答
反对 回复 2023-07-10
  • 3 回答
  • 0 关注
  • 129 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信