[AWS] Fargate에서 S3 Pre-signed URL 만료 문제 해결하기

궁금하면 500원·2024년 12월 21일

데브옵스

목록 보기
23/36

STS 임시 자격 증명의 제약과 이를 해결하는 전략

문제 소개

AWS Fargate에서 애플리케이션을 실행하는 동안, S3 Pre-signed URL을 사용하여 객체에 접근하려고 했지만, 예상보다 빠르게 만료되는 문제에 직면했습니다.

Pre-signed URL의 유효 기간을 최대 7일로 설정했음에도 불구하고, 불과 12시간 후에 "The provided token has expired"라는 오류 메시지를 받게 된 것입니다.

이 문제는 S3 Pre-signed URL 자체의 만료 시간 설정을 넘어서는 AWS Fargate의 보안 모델에 의한 것이었습니다.

문제 분석

문제의 원인 Fargate에서 S3 Pre-signed URL을 사용할 때, 예상한 것과 달리 URL이 만료되는 문제는 주로 AWS 보안 모델에서 비롯됩니다.

AWS Fargate 태스크는 IAM 역할을 통해 AWS 리소스에 접근하는데, 이 IAM 역할은 AWS Security Token Service(STS)를 통해 임시 자격 증명을 발급받습니다.

기본적으로, STS 임시 자격 증명의 유효 기간은 12시간으로 제한됩니다.

따라서, Pre-signed URL을 생성할 때 STS 임시 자격 증명이 사용되며, 이 자격 증명이 만료되면 URL도 무효화됩니다.

Pre-signed URL 자체는 7일의 유효 기간을 설정할 수 있지만, 실제 자격 증명이 12시간 후 만료되기 때문에 예상보다 빠르게 URL이 만료된 것입니다.

해결책 1: STS 임시 자격 증명의 만료 시간 연장

문제 해결을 위한 첫 번째 접근법은 AWS IAM 역할의 "Maximum session duration"을 최대 12시간으로 설정하는 것입니다.

이는 IAM 역할의 최대 세션 시간을 늘려 임시 자격 증명의 유효 기간을 연장하는 방법입니다.

방법

  • IAM 콘솔에서 Fargate 태스크에 할당된 IAM 역할을 찾습니다.
  • 해당 역할을 선택하고, Maximum session duration 값을 확인합니다.
  • 기본적으로 최대 1시간으로 설정되어 있는 경우가 많습니다. 이를 12시간으로 변경하여 STS 임시 자격 증명의 만료 시간을 늘릴 수 있습니다.

이 방법은 IAM 역할에 대해 설정된 최대 세션 기간을 확장하여, Fargate 태스크가 12시간 동안 유효한 임시 자격 증명을 사용할 수 있게 합니다.

그러나 여전히 12시간 이상의 유효 기간이 필요한 경우에는 다른 방법을 고려해야 합니다.

해결책 2: Pre-signed URL 갱신 메커니즘 구현

두 번째 해결책은 주기적으로 Pre-signed URL을 갱신하는 메커니즘을 구현하는 것입니다.

이를 통해 임시 자격 증명이 만료된 후에도 최신 URL을 계속해서 사용할 수 있도록 합니다.

방법

1. Pre-signed URL을 생성하는 메서드를 작성합니다.

  • generate_presigned_url 함수는 S3 객체를 대상으로 Pre-signed URL을 생성하며, 만료 시간을 파라미터로 받아 처리합니다.

2. URL이 만료될 때마다 이를 갱신하는 루프를 추가합니다.

  • 예를 들어, 12시간마다 새로운 URL을 생성하고, 이를 캐시하거나 클라이언트에 제공하는 방식으로 구현할 수 있습니다.

코드 예시 (Python)

import time

def generate_presigned_url(bucket_name, object_name, expiration=43200):
    """
    STS 임시 자격 증명 만료 시간을 고려하여 Pre-signed URL 생성
    """
    try:
        url = s3_client.generate_presigned_url('get_object',
                                              Params={'Bucket': bucket_name,
                                                     'Key': object_name},
                                              ExpiresIn=expiration)
        return url
    except Exception as e:
        logger.error(f"Error generating pre-signed URL: {e}")
        return None

def refresh_presigned_url():
    """
    주기적으로 Pre-signed URL을 갱신하는 로직
    """
    while True:
        url = generate_presigned_url(BUCKET_NAME, OBJECT_KEY)
        cache.set('presigned_url', url, timeout=39600)  # 11시간
        time.sleep(39600)  # 11시간 대기

이 방식은 URL이 만료되기 전에 새로운 URL을 갱신하여 계속해서 유효한 URL을 제공할 수 있게 합니다.

캐시를 사용하여 URL을 관리하는 방식으로 서버 부하를 줄일 수 있습니다.

해결책 3: Amazon CloudFront 서명된 URL 사용

세 번째 해결책은 Amazon CloudFront를 활용하여 서명된 URL을 사용하는 것입니다.
CloudFront는 Pre-signed URL보다 훨씬 긴 유효 기간을 제공할 수 있으며, 최대 1년까지 설정 가능합니다.
이 방식은 장기적인 해결책으로, 매우 긴 유효 기간이 필요한 경우 유용하게 사용될 수 있습니다.

방법

  • CloudFront 배포를 설정하고, S3 버킷을 오리진으로 설정합니다.
  • CloudFront에서 서명된 URL을 생성하여 배포된 URL을 통해 S3 객체에 접근합니다.
  • CloudFront 서명된 URL은 최대 1년의 유효 기간을 제공하므로, 장기적인 해결책으로 적합합니다.

CloudFront 서명된 URL을 사용하면 STS 임시 자격 증명의 유효 기간에 구애받지 않으므로, 보다 안정적인 URL 관리가 가능합니다.

결론

AWS Fargate에서 S3 Pre-signed URL을 사용할 때는 AWS 보안 모델과 STS 임시 자격 증명의 동작 방식을 깊이 이해하는 것이 중요합니다.

S3 Pre-signed URL 자체는 유효 기간을 길게 설정할 수 있지만, Fargate에서 사용하는 임시 자격 증명의 유효 기간에 따라 URL이 예상보다 빨리 만료되는 문제가 발생할 수 있습니다.

이 문제를 해결하기 위해서는 STS 임시 자격 증명의 만료 시간을 연장하거나, Pre-signed URL을 주기적으로 갱신하는 방법을 사용할 수 있습니다.

또한, Amazon CloudFront 서명된 URL을 활용하면 더욱 장기적인 해결책을 마련할 수 있습니다.

이 문제를 해결하면서 AWS Fargate와 보안 모델에 대한 이해를 깊이 있게 다루었고, 다양한 해결책을 통해 AWS에대해 인프라에대해 관심을 갖아야한다는 생각이든 시간이 되었습니다.

profile
에러가 나도 괜찮아 — 그건 내가 배우고 있다는 증거야.

0개의 댓글