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:
- IAM-Rolle erstellenmit Berechtigungen für
s3:GetObject
den S3-Bucket. - Anfügendiese IAM-Rolle zu Ihrer ECS-Aufgabe als
TaskRole
. - Wenn Sie ECS Fargate anstelle von EC2-basiertem ECS verwenden, benötigen Sie außerdem ein
ExecutionRole
Dadurch 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 :)