使用aws-sdk-go从Fargate容器向S3进行IAM身份验证失败

问题描述

我在go应用中正在使用aws-sdk-go库。

大致代码如下: awsSession,err := session.NewSession(&aws.Config{Region:aws.String(region)})

        upParams := &s3manager.UploadInput{
            Bucket: aws.String(bucket),Key:    aws.String(filename),Body:   bytes.NewReader(fileContents),}

        uploader := s3manager.NewUploader(awsSession)

        result,err := uploader.Upload(upParams)

当在容器外部以二进制形式在本地运行时,此方法可行,因为它从〜/ .aws / credentials中读取我的密钥。

在Docker容器中本地运行时,此方法可行,因为启动容器时我通过$HOME/.aws/credentials:/root/.aws/credentials:ro传递〜/ .aws / credentials。

但是,当我告诉Fargate从ECR(有效)获取容器并运行它时,它会在任务日志中给出以下错误

  • Failed to upload files to S3
  • For verbose messaging see aws.Config.CredentialsChainVerboseErrors
  • Failed to upload file: NoCredentialProviders: no valid providers in chain. Deprecated.

我假设我应该依靠Fargate管理的容器/任务的IAM策略来获得对S3的读/写访问权限。

我尝试去IAM->角色-> ecsTaskExecutionRole,并添加AmazonS3FullAccess角色,然后停止任务(并让Fargate重新启动它)。但是我遇到了同样的错误

我认为我需要更改Golang代码以某种方式从IAM而非文件中读取证书,或者我在IAM或Fargate / ECS方面做错了事。

任何帮助将不胜感激。

解决方法

我遇到了同样的问题,问题是一个误解,我们将 executionRoleArntaskRoleArn 作为任务定义中的属性。当您启动新任务时,您需要 executionRoleArn,但要使用 aws-sdk,您需要传递 taskRoleArn

您需要在 taskRoleArn 中附加 s3 策略。