问题描述
我在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方面做错了事。
任何帮助将不胜感激。
解决方法
我遇到了同样的问题,问题是一个误解,我们将 executionRoleArn
和 taskRoleArn
作为任务定义中的属性。当您启动新任务时,您需要 executionRoleArn
,但要使用 aws-sdk,您需要传递 taskRoleArn
。
您需要在 taskRoleArn
中附加 s3 策略。