Aplicativo Flask no ECS que extrai imagens do bucket s3

Aplicativo Flask no ECS que extrai imagens do bucket s3

Eu tenho um aplicativo flask que desejo extrair imagens para exibir de um balde s3.

Como faço para implementar as partes de credenciais? o que eu quero dizer é:

Devo usar o boto3 com credenciais do AWS para extrair as imagens do bucket?

Posso usar o boto3 sem as credenciais do aws e anexar uma função ao ECS? para que ele possa extrair as imagens sem credenciais?

No momento o que quero alcançar é colocar o aplicativo no CodePipeline para ECS e quero atualizar as imagens para o bucket s3, para que o aplicativo flask no ECS exiba as novas imagens no bucket s3.

Estou confuso sobre qual é a melhor prática para credenciais, etc.

Responder1

Sempre use funções IAMe nunca use chaves secretas/de acesso explícitas na produção. Leia mais sobreFunções de instância EC2aqui, o mesmo se aplica aFunções IAM do ECS.

No seu caso ECS você deve:

  1. Criar função IAMcom permissões s3:GetObjectdo bucket S3.
  2. Anexaressa função do IAM para sua tarefa ECS como umTaskRole.
  3. Se você estiver usando o ECS Fargate em vez do ECS baseado em EC2, você também precisará de umExecutionRoleisso essencialmente dá ao Fargate as permissões para iniciar sua tarefa.

EmModelo CloudFormationseria algo assim:

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

No entanto, muitas vezes não há sentidobaixando imagens públicasdo S3 para seu aplicativo da web Flask. Em vez disso, faça as imagenspúblicono S3 e consulte-os diretamente em seu HTML com <img src="https://your-bucket-name.s3.amazonaws.com/whatever/image.jpg"/>.

Se as imagens foremprivadovocê ainda não deve baixá-los para o Flask e, em vez disso, criarURLs pré-assinadosque fornecem acesso por tempo limitado aos arquivos no S3. Novamente vinculando diretamente ao local do S3 sem primeiro baixar os arquivos do S3 para o Flask.

Espero que ajude :)

informação relacionada