Назад | Перейти на главную страницу

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

У меня есть приложение для фляги, которое я хочу вытаскивать для отображения из ведра s3.

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

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

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

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

Я не понимаю, как лучше всего использовать учетные данные и т. Д.

Всегда используйте роли 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.

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