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