AWS認証情報を取得してDockerのS3にアクセスする方法

jpskgc:

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),
            }
            resp, err := svc.PutObject(params)

            fmt.Printf("response %s", awsutil.StringValue(resp))

            imageName.NAME = file.Filename

            imageNames = append(imageNames, imageName)
        }

        c.JSON(http.StatusOK, imageNames)
    })
}

画像がサーバー側でS3にアップロードされることを期待しています。

しかし、実際にはそうではありません。

ここにいくつかのログがあります:

api_1     | 2019/07/31 14:58:53 [Recovery] 2019/07/31 - 14:58:53 panic recovered:
api_1     | POST /api/post/image HTTP/1.1
api_1     | Host: localhost:2345
api_1     | Accept: application/json, text/plain, */*
api_1     | Accept-Encoding: gzip, deflate, br
api_1     | Accept-Language: en-US,en;q=0.9
api_1     | Connection: keep-alive
api_1     | Content-Length: 92267
api_1     | Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryYx6aOI06AYceIHnU
api_1     | Origin: http://localhost:3000
api_1     | Referer: http://localhost:3000/post/finish
api_1     | User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36
api_1     | 
api_1     | 
api_1     | runtime error: invalid memory address or nil pointer dereference
api_1     | /usr/local/go/src/runtime/panic.go:82 (0x4427f0)
api_1     |     panicmem: panic(memoryError)
api_1     | /usr/local/go/src/runtime/signal_unix.go:390 (0x44261f)
api_1     |     sigpanic: panicmem()
api_1     | /go/src/github.com/aws/aws-sdk-go/aws/ec2metadata/api.go:26 (0xa01a35)
api_1     |     (*EC2Metadata).GetMetadata: req := c.NewRequest(op, nil, output)
api_1     | /go/src/github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds/ec2_role_provider.go:134 (0xa05607)
api_1     |     requestCredList: resp, err := client.GetMetadata(iamSecurityCredsPath)
api_1     | /go/src/github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds/ec2_role_provider.go:90 (0xa05159)
api_1     |     (*EC2RoleProvider).Retrieve: credsList, err := requestCredList(m.Client)
api_1     | /go/src/github.com/aws/aws-sdk-go/aws/credentials/credentials.go:241 (0x945246)
api_1     |     (*Credentials).Get: creds, err := c.provider.Retrieve()
api_1     | /app/main.go:172 (0xb1dde1)
api_1     |     main.func5: _, err = creds.Get()
api_1     | /go/src/github.com/gin-gonic/gin/context.go:147 (0x8f97c9)
api_1     |     (*Context).Next: c.handlers[c.index](c)
api_1     | /go/src/github.com/gin-gonic/gin/recovery.go:83 (0x90d259)
api_1     |     RecoveryWithWriter.func1: c.Next()
api_1     | /go/src/github.com/gin-gonic/gin/context.go:147 (0x8f97c9)
api_1     |     (*Context).Next: c.handlers[c.index](c)
api_1     | /go/src/github.com/gin-gonic/gin/logger.go:240 (0x90c300)
api_1     |     LoggerWithConfig.func1: c.Next()
api_1     | /go/src/github.com/gin-gonic/gin/context.go:147 (0x8f97c9)
api_1     |     (*Context).Next: c.handlers[c.index](c)
api_1     | /go/src/github.com/gin-gonic/gin/gin.go:391 (0x9036c9)
api_1     |     (*Engine).handleHTTPRequest: c.Next()
api_1     | /go/src/github.com/gin-gonic/gin/gin.go:352 (0x902dbd)
api_1     |     (*Engine).ServeHTTP: engine.handleHTTPRequest(c)
api_1     | /usr/local/go/src/net/http/server.go:2774 (0x6dcc77)
api_1     |     serverHandler.ServeHTTP: handler.ServeHTTP(rw, req)
api_1     | /usr/local/go/src/net/http/server.go:1878 (0x6d8860)
api_1     |     (*conn).serve: serverHandler{c.server}.ServeHTTP(w, w.req)
api_1     | /usr/local/go/src/runtime/asm_amd64.s:1337 (0x45a090)
api_1     |     goexit: BYTE    $0x90   // NOP
api_1     | 
api_1     | [GIN] 2019/07/31 - 14:58:53 | 500 |    695.0698ms |      172.18.0.1 | POST     /api/post/image
jpskgc:

環境変数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"), "")

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Spark / scalアプリを使用してs3にアクセスするときにAWS認証情報が見つかりません

分類Dev

AWSはS3フォルダーレベルのアクセス用の動的認証情報を生成しますか?

分類Dev

AWS認証情報を自動的に更新してオンプレミスサーバーからS3オブジェクトにアクセスすることは可能ですか?

分類Dev

すべての認証情報を提供せずにGmailにアクセスする方法

分類Dev

保護されたS3オブジェクトにアクセスするためのモバイルアプリケーションのSTS認証情報を取得するにはどうすればよいですか?

分類Dev

複数の認証情報ファイルを渡してGCPサービスにアクセスする

分類Dev

IAMロール認証情報を使用してPythonでS3にアンロードする

分類Dev

AWSは、StsClientを使用して一時的な認証情報getSessionTokenへのアクセスを制限します

分類Dev

Rails、SlackのOmniauth:認証ハッシュ情報にアクセスする方法

分類Dev

一時的な認証情報を使用して Postman から AWS API Gateway にリクエストする方法

分類Dev

Cognito IdentityPoolを介して一時的なAWS認証情報を取得する方法

分類Dev

OAuth:アクセストークンの後に認証されたユーザー情報を取得する方法は?

分類Dev

LinuxからAWS S3バケットに同期するときに所有者とファイルのアクセス許可情報を保持する

分類Dev

Expressを使用してリクエストスコープ内の認証されたユーザーの情報にアクセスする

分類Dev

Jenkinsfileアクセスaws認証情報

分類Dev

gflagsなしでGoogleアナリティクスの認証情報を取得する方法-代わりにrun_flow()を使用しますか?

分類Dev

Google認証プロバイダーから返された情報を使用してデータへのアクセスを提供する方法

分類Dev

gcloudの認証情報ヘルパーを使用してGoogleSource Repositoriesにアクセスすると、osxkeychainが機能しなくなります

分類Dev

S3一時認証情報を使用してJavascriptでファイルをアップロードする方法

分類Dev

AWSサービスにアクセスするときにIAM認証情報ローテーションを処理する方法

分類Dev

S3バケット(Node.js)に何かを送信しようとするとAWSの認証情報が見つかりません

分類Dev

別のアカウントにアクセスするために、実行中のCLI GoプログラムからAWS認証情報を更新する

分類Dev

AWS が 1 回のリクエストで認証情報を使用する方法

分類Dev

AWS認証情報をDockerに渡す

分類Dev

codedeployスクリプトを使用してAWS認証情報をEC2サーバーに渡す方法は?

分類Dev

S3アクセス用にgoogle +認証トークンを更新する方法

分類Dev

SparkがS3ファイルの読み取りに使用しているAWS認証情報を確認するにはどうすればよいですか?

分類Dev

boto3を使用して、awsでs3アクセスキーが特定のバケットにアクセスできるかどうかを確認する方法

分類Dev

SUアクセスなしですべてのCPUキャッシュ情報を取得する方法

Related 関連記事

  1. 1

    Spark / scalアプリを使用してs3にアクセスするときにAWS認証情報が見つかりません

  2. 2

    AWSはS3フォルダーレベルのアクセス用の動的認証情報を生成しますか?

  3. 3

    AWS認証情報を自動的に更新してオンプレミスサーバーからS3オブジェクトにアクセスすることは可能ですか?

  4. 4

    すべての認証情報を提供せずにGmailにアクセスする方法

  5. 5

    保護されたS3オブジェクトにアクセスするためのモバイルアプリケーションのSTS認証情報を取得するにはどうすればよいですか?

  6. 6

    複数の認証情報ファイルを渡してGCPサービスにアクセスする

  7. 7

    IAMロール認証情報を使用してPythonでS3にアンロードする

  8. 8

    AWSは、StsClientを使用して一時的な認証情報getSessionTokenへのアクセスを制限します

  9. 9

    Rails、SlackのOmniauth:認証ハッシュ情報にアクセスする方法

  10. 10

    一時的な認証情報を使用して Postman から AWS API Gateway にリクエストする方法

  11. 11

    Cognito IdentityPoolを介して一時的なAWS認証情報を取得する方法

  12. 12

    OAuth:アクセストークンの後に認証されたユーザー情報を取得する方法は?

  13. 13

    LinuxからAWS S3バケットに同期するときに所有者とファイルのアクセス許可情報を保持する

  14. 14

    Expressを使用してリクエストスコープ内の認証されたユーザーの情報にアクセスする

  15. 15

    Jenkinsfileアクセスaws認証情報

  16. 16

    gflagsなしでGoogleアナリティクスの認証情報を取得する方法-代わりにrun_flow()を使用しますか?

  17. 17

    Google認証プロバイダーから返された情報を使用してデータへのアクセスを提供する方法

  18. 18

    gcloudの認証情報ヘルパーを使用してGoogleSource Repositoriesにアクセスすると、osxkeychainが機能しなくなります

  19. 19

    S3一時認証情報を使用してJavascriptでファイルをアップロードする方法

  20. 20

    AWSサービスにアクセスするときにIAM認証情報ローテーションを処理する方法

  21. 21

    S3バケット(Node.js)に何かを送信しようとするとAWSの認証情報が見つかりません

  22. 22

    別のアカウントにアクセスするために、実行中のCLI GoプログラムからAWS認証情報を更新する

  23. 23

    AWS が 1 回のリクエストで認証情報を使用する方法

  24. 24

    AWS認証情報をDockerに渡す

  25. 25

    codedeployスクリプトを使用してAWS認証情報をEC2サーバーに渡す方法は?

  26. 26

    S3アクセス用にgoogle +認証トークンを更新する方法

  27. 27

    SparkがS3ファイルの読み取りに使用しているAWS認証情報を確認するにはどうすればよいですか?

  28. 28

    boto3を使用して、awsでs3アクセスキーが特定のバケットにアクセスできるかどうかを確認する方法

  29. 29

    SUアクセスなしですべてのCPUキャッシュ情報を取得する方法

ホットタグ

アーカイブ