Eu tenho um aplicativo flask que desejo extrair imagens para exibir de um balde s3.
Como faço para implementar as partes de credenciais? o que eu quero dizer é:
Devo usar o boto3 com credenciais do AWS para extrair as imagens do bucket?
Posso usar o boto3 sem as credenciais do aws e anexar uma função ao ECS? para que ele possa extrair as imagens sem credenciais?
No momento o que quero alcançar é colocar o aplicativo no CodePipeline para ECS e quero atualizar as imagens para o bucket s3, para que o aplicativo flask no ECS exiba as novas imagens no bucket s3.
Estou confuso sobre qual é a melhor prática para credenciais, etc.
Responder1
Sempre use funções IAMe nunca use chaves secretas/de acesso explícitas na produção. Leia mais sobreFunções de instância EC2aqui, o mesmo se aplica aFunções IAM do ECS.
No seu caso ECS você deve:
- Criar função IAMcom permissões
s3:GetObject
do bucket S3. - Anexaressa função do IAM para sua tarefa ECS como um
TaskRole
. - Se você estiver usando o ECS Fargate em vez do ECS baseado em EC2, você também precisará de um
ExecutionRole
isso essencialmente dá ao Fargate as permissões para iniciar sua tarefa.
EmModelo CloudFormationseria algo assim:
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
No entanto, muitas vezes não há sentidobaixando imagens públicasdo S3 para seu aplicativo da web Flask. Em vez disso, faça as imagenspúblicono S3 e consulte-os diretamente em seu HTML com <img src="https://your-bucket-name.s3.amazonaws.com/whatever/image.jpg"/>
.
Se as imagens foremprivadovocê ainda não deve baixá-los para o Flask e, em vez disso, criarURLs pré-assinadosque fornecem acesso por tempo limitado aos arquivos no S3. Novamente vinculando diretamente ao local do S3 sem primeiro baixar os arquivos do S3 para o Flask.
Espero que ajude :)