안녕하세요! 오늘은 Pre-signed URL에 대해서 알아보겠습니다.
1) Presigned URL이 15분만에 expire 된 이유
The default pre-signed URL expiration time is 15minutes. Make sure to adjust this value to your specific needs.
Pre-signed URL의 세션 만료 시간은 기본적으로 15분입니다. 해당 내용에 대해서 매개변수 세팅을 통해서 유효 기간을 세팅하실 수 있습니다. 미리 서명된 URL은 기본적으로 15분 후에 만료됩니다. expiresIn매개변수를 전달하여 URL이 유효한 기간(초)을 지정할 수 있습니다.
예1) Python SDK를 통한 Presigned URL 생성
import boto3
from botocore.client import Config
# Get the service client with sigv4 configured
s3 = boto3.client('s3', config=Config(signature_version='s3v4'))
# Generate the URL to get 'key-name' from 'bucket-name'
# URL expires in 604800 seconds (seven days)
url = s3.generate_presigned_url(
ClientMethod='get_object',
Params={
'Bucket': 'bucket-name',
'Key': 'key-name'
},
ExpiresIn=604800
)
print(url)
여기서는 ExpiresIn으로 제한한 내용 확인할 수 있습니다.
예2) JavaScript SDK를 통한 S3 Pre-signed URL 생성
var AWS = require('aws-sdk') // 올바른 패키지명으로 수정했습니다
var cuid = require('cuid')
const s3 = new AWS.S3({
accessKeyId: /* Bucket owner access key id */,
secretAccessKey: /* Bucket owner secret */,
sessionToken: `session-${cuid()}`
})
var params = {
Bucket: BUCKET_NAME,
Key: OBJECT_NAME,
ContentType: 'application/json',
Expires: 120 // In seconds
}
const readSignedUrl = await s3.getSignedUrlPromise('getObject', params).promise() // Read access
const writeSignedUrl = await s3.getSignedUrlPromise('putObject', params).promise() // Write access
js에서는 Expires를 통해서 특정할 수 있습니다.
참조 링크: https://www.altostra.com/blog/aws-s3-presigned-url
예3) CLI를 통한 S3 Pre-signed URL 생성
aws s3 presign s3://awsexamplebucket/test2.txt --expires-in 604800
CLI를 통한 제어는 --expires-in으로 가능합니다.
참조 링크: https://docs.aws.amazon.com/cli/latest/reference/s3/presign.html
인증 요청 검증
presigned URL의 예제는 다음과 같습니다. X-Amz-Expires가 만료 시간을 나타내는데, 수치는 초로 환산됩니다. 86400의 경우, 24시간을 나타냅니다. 최장 7일 604800까지 가능합니다. (위의 Python sdk 예제에서와 같이)
https://s3.amazonaws.com/examplebucket/test.txt
?X-Amz-Algorithm=AWS4-HMAC-SHA256
&X-Amz-Credential=<your-access-key-id>/20130721/us-east-1/s3/aws4_request
&X-Amz-Date=20130721T201207Z
&X-Amz-Expires=86400
&X-Amz-SignedHeaders=host
&X-Amz-Signature=<signature-value>
참조 링크:
- https://aws.amazon.com/ko/blogs/developer/generate-presigned-url-modular-aws-sdk-javascript/
- https://boto3.amazonaws.com/v1/documentation/api/latest/guide/s3-presigned-urls.html
2) IAM Role과 Pre-signed URL에 관한 QnA
Q: 만약 S3에 대해 getObject 권한을 갖는 IAM role을 만들고, 해당 Role을 assume하여 signing을 수행하려 하는데 assumeRole을 이용해서 24시간 download가 가능한 URL을 generate할 수 있을까?
A: 해당 내용은 불가능합니다. IAM을 통한 역할의 세션 기간은 기본 15분(900초), 최대는 1시간에서 12시간까지 확장이 가능합니다.
역할 연결은 AWS CLI 또는 AWS API 역할 세션을 최대 1시간으로 제한합니다. AssumeRole API 작업을 사용하여 역할을 수임할 때 DurationSeconds 매개변수를 사용하여 역할 세션의 기간을 지정할 수 있습니다.
역할에 대한 최대 세션 기간 설정에 따라 매개변수 값을 최대 43200초(12시간)까지 지정할 수 있습니다.
그러나 역할 연결을 사용하여 역할을 수임하고 DurationSeconds가 1시간보다 큰 매개변수 값을 제공하면 작업이 실패합니다.
역할의 최대값을 보는 방법을 알아보려면 IAM 사용 설명서의 역할에 대한 최대 세션 기간 설정 보기를 참조하세요!
STS를 활용한 DurationSecond의 설정은 다음과 같습니다:
response = client.assume_role(
DurationSeconds=3600,
ExternalId='123ABC',
Policy='{"Version":"2012-10-17","Statement":[{"Sid":"Stmt1","Effect":"Allow","Action":"s3:*","Resource":"*"}]}',
RoleArn='arn:aws:iam::123456789012:role/demo',
RoleSessionName='Bob'
)
print(response)
참조 링크: https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sts.html
즐거운 하루 되세요. 감사합니다! 🙂
'IT > AWS' 카테고리의 다른 글
Lambda vs Fargate (0) | 2022.02.15 |
---|---|
aws efs vs ebs (0) | 2022.01.25 |
Aws Cloudwatch와 EC2 내부 CPU 사용량 차이 (0) | 2022.01.09 |
AWS Athena를 통한 S3 Request 분석하기 (0) | 2022.01.01 |
Aws Aurora 다수 DB 커넥션 끊어졌을때 (0) | 2022.01.01 |