Flask-App auf ECS, die Bilder aus dem S3-Bucket zieht

Flask-App auf ECS, die Bilder aus dem S3-Bucket zieht

Ich habe eine Flask-App, aus der ich Bilder zum Anzeigen aus einem S3-Bucket ziehen möchte.

Wie implementiere ich die Anmeldeinformationsteile? Ich meine Folgendes:

Verwende ich boto3 mit AWS-Anmeldeinformationen, um die Bilder aus dem Bucket zu ziehen?

Kann ich boto3 ohne die AWS-Anmeldeinformationen verwenden und dem ECS eine Rolle zuordnen? sodass es die Bilder ohne Anmeldeinformationen abrufen kann?

Im Moment möchte ich die App in die CodePipeline zu ECS einfügen und die Bilder im S3-Bucket aktualisieren, sodass die Flask-App auf ECS die neuen Bilder im S3-Bucket anzeigt.

Ich bin mir nicht sicher, was die beste Vorgehensweise für Anmeldeinformationen usw. ist.

Antwort1

Verwenden Sie immer IAM-Rollenund verwenden Sie in der Produktion niemals explizite Zugriffs-/Geheimschlüssel. Lesen Sie mehr überEC2-Instance-RollenHiergilt das Gleiche fürECS IAM-Rollen.

In Ihrem ECS-Fall sollten Sie:

  1. IAM-Rolle erstellenmit Berechtigungen für s3:GetObjectden S3-Bucket.
  2. Anfügendiese IAM-Rolle zu Ihrer ECS-Aufgabe alsTaskRole.
  3. Wenn Sie ECS Fargate anstelle von EC2-basiertem ECS verwenden, benötigen Sie außerdem einExecutionRoleDadurch erhält Fargate im Wesentlichen die Berechtigung, Ihre Aufgabe zu starten.

InCloudFormation-Vorlagees wäre ungefähr so:

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

Es hat jedoch oft keinen Sinnwird heruntergeladen öffentliche Bildervon S3 zu Ihrer Flask-Web-App. Erstellen Sie stattdessen die Bilderöffentlichin S3 und verweisen Sie mit direkt aus Ihrem HTML darauf <img src="https://your-bucket-name.s3.amazonaws.com/whatever/image.jpg"/>.

Wenn die Bildernicht öffentlichSie sollten sie dennoch nicht in Flask herunterladen und stattdessenvorsignierte URLsdie zeitlich begrenzten Zugriff auf die Dateien in S3 ermöglichen. Auch hier erfolgt eine direkte Verknüpfung mit dem S3-Speicherort, ohne dass die Dateien vorher von S3 in Flask heruntergeladen werden müssen.

Hoffentlich hilft das :)

verwandte Informationen