ECS 上的 Flask 應用程式從 s3 儲存桶中擷取影像

ECS 上的 Flask 應用程式從 s3 儲存桶中擷取影像

我有一個 Flask 應用程序,我想從 s3 儲存桶中提取圖像以顯示。

如何實現憑證部分?我的意思是:

我是否使用帶有 aws 憑證的 boto3 從儲存桶中提取圖像?

我可以在沒有 aws 憑證的情況下使用 boto3 並將角色附加到 ECS 嗎?那麼它可以在沒有憑證的情況下提取圖像嗎?

目前我想要實現的是將應用程式放在 CodePipeline 中到 ECS,並且我想將圖像更新到 s3 儲存桶,因此 ECS 上的 Flask 應用程式會在 s3 儲存桶上顯示新圖像。

我對憑證等的最佳做法感到困惑。

答案1

始終使用 IAM 角色並且切勿在生產中使用任何明確存取/秘密密鑰。閱讀更多關於EC2執行個體角色這裡,同樣適用於ECS IAM 角色

對於您的 ECS 案例,您應該:

  1. 建立 IAM 角色具有s3:GetObject來自 S3 儲存桶的權限。
  2. 您的 ECS 任務的 IAM 角色作為TaskRole
  3. 如果您使用 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。

希望有幫助:)

相關內容