Tengo una aplicación de matraz que quiero extraer imágenes para mostrarlas desde un depósito s3.
¿Cómo implemento las partes de las credenciales? lo que quiero decir es:
¿Utilizo boto3 con credenciales de AWS para extraer las imágenes del depósito?
¿Puedo usar boto3 sin las credenciales de AWS y adjuntar un rol al ECS? ¿Entonces puede extraer las imágenes sin credenciales?
Por el momento, lo que quiero lograr es colocar la aplicación en CodePipeline en ECS y quiero actualizar las imágenes en el depósito s3, para que la aplicación flask en ECS muestre las nuevas imágenes en el depósito s3.
No sé cuál es la mejor práctica para las credenciales, etc.
Respuesta1
Utilice siempre funciones de IAMy nunca utilice claves secretas o de acceso explícitas en producción. Leer más sobreRoles de instancia EC2aquí, lo mismo se aplica aFunciones de IAM de ECS.
En su caso de ECS usted debe:
- Crear rol de IAMcon permisos
s3:GetObject
desde el depósito S3. - Adjuntarese rol de IAM a su tarea de ECS como
TaskRole
. - Si está utilizando ECS Fargate en lugar de ECS basado en EC2, también necesitará un
ExecutionRole
eso esencialmente le da a Fargate los permisos para iniciar su tarea.
EnPlantilla de formación de nubesería algo como esto:
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
Sin embargo, a menudo no tiene sentidodescargando imagenes publicasdesde S3 a su aplicación web Flask. En lugar de eso, haz las imágenes.públicoen S3 y consúltelos directamente desde su HTML con <img src="https://your-bucket-name.s3.amazonaws.com/whatever/image.jpg"/>
.
Si las imágenes sonno publicoaún así no deberías descargarlos a Flask y en su lugar crearURL prefirmadasque proporcionan acceso por tiempo limitado a los archivos en S3. Nuevamente vinculando directamente a la ubicación de S3 sin descargar primero los archivos de S3 a Flask.
Espero que ayude :)