У меня есть приложение для фляги, которое я хочу вытаскивать для отображения из ведра s3.
Как мне реализовать части учетных данных? Я имею в виду:
Могу ли я использовать boto3 с учетными данными aws для извлечения изображений из корзины?
Могу ли я использовать boto3 без учетных данных aws и присоединить роль к ECS? так он может вытаскивать изображения без учетных данных?
На данный момент я хочу поместить приложение в CodePipeline в ECS, и я хочу обновить изображения в ведре s3, чтобы приложение flask на ECS отображало новые изображения в ведре s3.
Я не понимаю, как лучше всего использовать учетные данные и т. Д.
Всегда используйте роли IAM и никогда не используйте явные ключи доступа / секретные ключи в производстве. Узнать больше о Роли инстансов EC2 Вот, то же самое относится к Роли ECS IAM.
В случае вашего ECS вам следует:
s3:GetObject
из ведра S3.TaskRole
.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.
Надеюсь, это поможет :)