Aplicación Flask en ECS que extrae imágenes del depósito s3

Aplicación Flask en ECS que extrae imágenes del depósito s3

Tengo una aplicación de matraz que quiero extraer imágenes para mostrarlas desde un depósito s3.

¿Cómo implemento las partes de las credenciales? lo que quiero decir es:

¿Utilizo boto3 con credenciales de AWS para extraer las imágenes del depósito?

¿Puedo usar boto3 sin las credenciales de AWS y adjuntar un rol al ECS? ¿Entonces puede extraer las imágenes sin credenciales?

Por el momento, lo que quiero lograr es colocar la aplicación en CodePipeline en ECS y quiero actualizar las imágenes en el depósito s3, para que la aplicación flask en ECS muestre las nuevas imágenes en el depósito s3.

No sé cuál es la mejor práctica para las credenciales, etc.

Respuesta1

Utilice siempre funciones de IAMy nunca utilice claves secretas o de acceso explícitas en producción. Leer más sobreRoles de instancia EC2aquí, lo mismo se aplica aFunciones de IAM de ECS.

En su caso de ECS usted debe:

  1. Crear rol de IAMcon permisos s3:GetObjectdesde el depósito S3.
  2. Adjuntarese rol de IAM a su tarea de ECS comoTaskRole.
  3. Si está utilizando ECS Fargate en lugar de ECS basado en EC2, también necesitará unExecutionRoleeso esencialmente le da a Fargate los permisos para iniciar su tarea.

EnPlantilla de formación de nubesería algo como esto:

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

Sin embargo, a menudo no tiene sentidodescargando imagenes publicasdesde S3 a su aplicación web Flask. En lugar de eso, haz las imágenes.públicoen S3 y consúltelos directamente desde su HTML con <img src="https://your-bucket-name.s3.amazonaws.com/whatever/image.jpg"/>.

Si las imágenes sonno publicoaún así no deberías descargarlos a Flask y en su lugar crearURL prefirmadasque proporcionan acceso por tiempo limitado a los archivos en S3. Nuevamente vinculando directamente a la ubicación de S3 sin descargar primero los archivos de S3 a Flask.

Espero que ayude :)

información relacionada