

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이 만료된 것입니다.
문제 해결을 위한 첫 번째 접근법은 AWS IAM 역할의 "Maximum session duration"을 최대 12시간으로 설정하는 것입니다.
이는 IAM 역할의 최대 세션 시간을 늘려 임시 자격 증명의 유효 기간을 연장하는 방법입니다.
이 방법은 IAM 역할에 대해 설정된 최대 세션 기간을 확장하여, Fargate 태스크가 12시간 동안 유효한 임시 자격 증명을 사용할 수 있게 합니다.
그러나 여전히 12시간 이상의 유효 기간이 필요한 경우에는 다른 방법을 고려해야 합니다.
두 번째 해결책은 주기적으로 Pre-signed URL을 갱신하는 메커니즘을 구현하는 것입니다.
이를 통해 임시 자격 증명이 만료된 후에도 최신 URL을 계속해서 사용할 수 있도록 합니다.
1. Pre-signed URL을 생성하는 메서드를 작성합니다.
2. 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을 관리하는 방식으로 서버 부하를 줄일 수 있습니다.
세 번째 해결책은 Amazon CloudFront를 활용하여 서명된 URL을 사용하는 것입니다.
CloudFront는 Pre-signed 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에대해 인프라에대해 관심을 갖아야한다는 생각이든 시간이 되었습니다.