첫 AWS, 그리고 공포

fart man·2026년 2월 3일

처음으로 AWS를 사용하게되었다.

옛날 cafe24는 한 6만원만 내면 한 1년? 정도 그냥 VM한대 주는 서비스였는데 AWS는 굉장히 복잡했다.

Secure String은 공짜 맞나?

Parameter Store의 Secure String은 공짜 일까 아닐까?

AWS공식 문서를 보면 이렇게 적혀 있다

Parameter Store 파라미터 생성 시 SecureString에서 비용이 부과되지 않지만 AWS KMS 암호화 사용에 대한 요금이 적용됩니다. 자세한 내용은 AWS Key Management Service 요금을 참조하십시오.

그래서 AWS Key Management Service를 가보면

요청 10,000건당 USD 0.03
RSA 2048 키 관련 요청 10,000건당 USD 0.03
ECC GenerateDataKeyPair 요청 10,000건당 USD 0.10
RSA 2048 제외 비대칭 요청 10,000건당 USD 0.15
RSA GenerateDataKeyPair 요청 1만 건당 USD 12.00

근데 이 요청이라는게 언제 일어나는 걸까? 내가 읽을 때? 내가 생성 할 때? 둘다?

...뭐 10000건당 0.03 dollar 고 Parameter는 앱 실행 시 한번 밖에 안읽으니까, 그런가부다... 하고 넘어가기로 했다.

Spring Parameter는 자동으로 갱신되나?

spring.config.import=aws-parameterstore:/foo/bar/
spring.cloud.aws.parameterstore.enabled=true

management.info.env.enabled=true
info.app.message=${MESSAGE}

이렇게 application.properties에 적은 담에 AWS Parameter에 적힌 MESSAGE 값을 io.awspring.cloud:spring-cloud-aws-starter-parameter-store통해 읽게 했을 때,

AWS Parameter에 적힌 MESSAGE값을 바꾸면 자동으로 갱신될까?

실험을 해봤을 때는 다행이도 자동 갱신같은 미친 일이 발생 하지는 않는다 😮‍💨.

응?? ACCESS KEY가 노출 됬다고????

즐겁게 README를 다 쓴뒤 github에 올렸는데 ACCESS KEY가 노출됬다는 경고가 올라왔다!!!

응!!??

알고 보니 S3에 있는 image를 돌려줄 때 presigned url로 돌려주는데 여기에 임시 토큰이 있었다. 그리고 그 URL을 README에 올린게 문제였다.

근데 그럼 이 임시 토큰으로는 뭘 할 수 있을까? 열심히 찾아본 결과 내린 결론은...

아마 해당 reource를 읽기만 가능할 거 같다... 아마도. 제발.

일단 AWS공식 문서의 예시

    /* Create a pre-signed URL to download an object in a subsequent GET request. */
    public String createPresignedGetUrl(String bucketName, String keyName) {
        try (S3Presigner presigner = S3Presigner.create()) {

            GetObjectRequest objectRequest = GetObjectRequest.builder()
                    .bucket(bucketName)
                    .key(keyName)
                    .build();

            GetObjectPresignRequest presignRequest = GetObjectPresignRequest.builder()
                    .signatureDuration(Duration.ofMinutes(10))  // The URL will expire in 10 minutes.
                    .getObjectRequest(objectRequest)
                    .build();

            PresignedGetObjectRequest presignedRequest = presigner.presignGetObject(presignRequest);
            logger.info("Presigned URL: [{}]", presignedRequest.url().toString());
            logger.info("HTTP method: [{}]", presignedRequest.httpRequest().method());

            return presignedRequest.url().toExternalForm();
        }
    }

내가 쓰고 있는 library io.awspring.cloud:spring-cloud-aws-starter-s3 의 소스랑 거의 똑같은데.

	@Override
	public URL createSignedGetURL(String bucketName, String key, Duration duration) {
		Assert.notNull(bucketName, "bucketName is required");
		Assert.notNull(key, "key is required");
		Assert.notNull(duration, "duration is required");

		GetObjectRequest getObjectRequest = GetObjectRequest.builder().bucket(bucketName).key(key).build();

		GetObjectPresignRequest presignRequest = GetObjectPresignRequest.builder().getObjectRequest(getObjectRequest)
				.signatureDuration(duration).build();

		PresignedGetObjectRequest signedRequest = s3Presigner.presignGetObject(presignRequest);
		return signedRequest.url();
	}

설마 AWS측에서 이상한 예시를 주지는 않았을 거 같다... 아마도. 설마. 제발.

공포

AWS가 처음 인 것도 있지만... 역시 돈이 개입되는 순간 모든게 무시무시해진다... 😱😱😱😱

0개의 댓글