Приложение Flask на ECS, которое извлекает изображения из контейнера s3

Приложение Flask на ECS, которое извлекает изображения из контейнера s3

У меня есть приложение Flask, которое я хочу извлекать изображения для отображения из контейнера S3.

Как мне реализовать части учетных данных? Я имею в виду следующее:

Можно ли использовать boto3 с учетными данными aws для извлечения изображений из контейнера?

Могу ли я использовать boto3 без учетных данных aws и прикрепить роль к ECS? Чтобы он мог извлекать изображения без учетных данных?

На данный момент я хочу поместить приложение в CodePipeline в ECS и обновить изображения в контейнере s3, чтобы приложение Flask в ECS отображало новые изображения в контейнере s3.

Я не знаю, что является наилучшей практикой для учетных данных и т.п.

решение1

Всегда используйте роли IAMи никогда не используйте явные ключи доступа/секретные ключи в производстве. Подробнее оРоли экземпляра EC2здесь, то же самое относится кРоли ECS IAM.

В вашем случае ECS вам следует:

  1. Создать роль IAMс разрешениями на s3:GetObjectиз контейнера S3.
  2. Прикреплятьчто роль IAM для вашей задачи ECS какTaskRole.
  3. Если вы используете ECS Fargate вместо ECS на базе EC2, вам также понадобитсяExecutionRoleчто по сути дает Fargate разрешение на запуск вашей задачи.

ВШаблон CloudFormationэто будет что-то вроде этого:

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. Вместо этого сделайте образыпубличныйв S3 и ссылайтесь на них напрямую из вашего HTML с помощью <img src="https://your-bucket-name.s3.amazonaws.com/whatever/image.jpg"/>.

Если изображенияне публичныйвам все равно не следует загружать их во Flask, а вместо этого создаватьпредварительно подписанные URL-адресакоторые предоставляют ограниченный по времени доступ к файлам в S3. Опять же, ссылка напрямую на местоположение S3 без предварительной загрузки файлов из S3 во Flask.

Надеюсь, это поможет :)

Связанный контент