我有一個 Flask 應用程序,我想從 s3 儲存桶中提取圖像以顯示。
如何實現憑證部分?我的意思是:
我是否使用帶有 aws 憑證的 boto3 從儲存桶中提取圖像?
我可以在沒有 aws 憑證的情況下使用 boto3 並將角色附加到 ECS 嗎?那麼它可以在沒有憑證的情況下提取圖像嗎?
目前我想要實現的是將應用程式放在 CodePipeline 中到 ECS,並且我想將圖像更新到 s3 儲存桶,因此 ECS 上的 Flask 應用程式會在 s3 儲存桶上顯示新圖像。
我對憑證等的最佳做法感到困惑。
答案1
始終使用 IAM 角色並且切勿在生產中使用任何明確存取/秘密密鑰。閱讀更多關於EC2執行個體角色這裡,同樣適用於ECS IAM 角色。
對於您的 ECS 案例,您應該:
- 建立 IAM 角色具有
s3:GetObject
來自 S3 儲存桶的權限。 - 附您的 ECS 任務的 IAM 角色作為
TaskRole
。 - 如果您使用 ECS Fargate 而不是基於 EC2 的 ECS,您還需要
ExecutionRole
這實質上為 Fargate 提供了啟動您的任務的權限。
在雲形成模板它會是這樣的:
Parameters:
S3BucketName:
Type: String
Resources:
TaskDefinition:
Type: AWS::ECS::TaskDefinition
Properties:
NetworkMode: awsvpc
TaskRoleArn: !Ref TaskRole
ExecutionRoleArn: !Ref ExecutionRole
RequiresCompatibilities:
- FARGATE
Cpu: ...
Memory: ...
ContainerDefinitions:
- ...
TaskRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Statement:
- Effect: Allow
Principal:
Service: [ ecs-tasks.amazonaws.com ]
Action:
- sts:AssumeRole
Path: /
Policies:
- PolicyName: TaskAccess
PolicyDocument:
Version: '2012-10-17'
Statement:
- Action:
- s3:GetObject
Effect: Allow
Resource:
- !Sub "arn:aws:s3:::${S3BucketName}/*"
ExecutionRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Statement:
- Effect: Allow
Principal:
Service: [ ecs-tasks.amazonaws.com ]
Action:
- sts:AssumeRole
Path: /
ManagedPolicyArns:
- arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy
然而往往沒有意義下載 公共形象從 S3 到您的 Flask Web 應用程式。相反,製作圖像民眾在 S3 中並透過 HTML 直接引用它們<img src="https://your-bucket-name.s3.amazonaws.com/whatever/image.jpg"/>
。
如果圖像是不公開你仍然不應該將它們下載到 Flask 而是創建預簽名 URL提供對 S3 中文件的限時存取。再次直接連結到 S3 位置,而不先將檔案從 S3 下載到 Flask。
希望有幫助:)