s3 버킷에서 이미지를 가져오는 ECS의 Flask 앱

s3 버킷에서 이미지를 가져오는 ECS의 Flask 앱

s3 버킷에서 표시할 이미지를 가져오려는 플라스크 앱이 있습니다.

자격 증명 부분을 어떻게 구현합니까? 내가 말하고 싶은 건:

버킷에서 이미지를 가져오려면 aws 자격 증명과 함께 boto3을 사용해야 합니까?

aws 자격 증명 없이 boto3을 사용하고 ECS에 역할을 연결할 수 있습니까? 그러면 자격 증명 없이 이미지를 가져올 수 있나요?

현재 제가 달성하고 싶은 것은 ECS의 CodePipeline에 앱을 배치하고 이미지를 s3 버킷으로 업데이트하여 ECS의 플라스크 앱이 s3 버킷에 새 이미지를 표시하도록 하는 것입니다.

자격 증명 등에 대한 모범 사례가 무엇인지 혼란 스럽습니다.

답변1

항상 IAM 역할 사용프로덕션 환경에서는 명시적인 액세스/비밀 키를 사용하지 마세요. 자세히 알아보기EC2 인스턴스 역할여기, 동일하게 적용됩니다ECS IAM 역할.

ECS의 경우 다음을 수행해야 합니다.

  1. IAM 역할 생성s3:GetObjectS3 버킷에 대한 권한이 있습니다 .
  2. 붙이다ECS 작업에 대한 IAM 역할TaskRole.
  3. EC2 기반 ECS 대신 ECS Fargate를 사용하는 경우에도 필요합니다.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에서 <img src="https://your-bucket-name.s3.amazonaws.com/whatever/image.jpg"/>.

이미지가 다음과 같은 경우공개되지 않음여전히 Flask에 다운로드해서는 안 되며 대신 생성해야 합니다.미리 서명된 URLS3의 파일에 대한 시간 제한 액세스를 제공합니다. 먼저 S3에서 Flask로 파일을 다운로드하지 않고 다시 S3 위치에 직접 연결합니다.

도움이 되었기를 바랍니다 :)

관련 정보