Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

forDevLife

[해결] S3 upload 시 issue(Could not resolve placeholder, IOException) 본문

Error

[해결] S3 upload 시 issue(Could not resolve placeholder, IOException)

JH_Lucid 2022. 7. 16. 00:03

1) 등록한 ACCESS_KEY를 찾을 수 없는 문제

CodeDeploy를 이용해 배포를 하는 도중, S3 업로드 기능을 추가한 후 아래와 같이 yml에 추가했다.

cloud:
  aws:
     credentials:
       access-key: ${S3_ACCESS_KEY}
       secret-key: ${S3_SECRET_KEY}
     s3:
       bucket: ${S3_BUCKET_NAME}
     region:
       static: ${S3_REGION}
     stack:
       auto: false

 

 

그리고 나서 EC2 환경에 해당 환경 변수들을 .bashrc에 등록 & echo로 체크한 후 배포했다.

이 때 아래 문제가 발생했다.

 

 

 

원인 파악

  • 배포된 jar를 EC2에서 실행할 때는 문제가 없었다.
  • 따라서 CodeDeploy로 script 실행 중에 문제가 있을거라고 예상했다.

 

 

해결 : deploy_was.sh에 아래 내용 추가하면 해결된다.

source /home/ec2-user/.bash_profile
  • CodeDeploy agent 에서 정상적으로 환경변수를 사용할 수 없는 경우가 있다고 한다. 이로 인해 CodeDeploy agent에 의해 실행되는 프로세스도 내부에서 사용하는 환경변수를 찾을 수 없게 된다.

 


2) S3업로드 시 임시 File 이름을 아래와 같이 지정하면 I/O Exception 발생

private Optional<File> convert(MultipartFile file) throws IOException {
    File convertFile = new File(System.currentTimeMillis() + file.getOriginalFilename());
	// ...

 

원인 파악

임시파일을 경로 없이 생성할 경우, CodeDeploy를 통해 배포하면, root 디렉토리에 파일 생성을 시도하게 된다. 이로 인해 Access Deny 에러가 발생한다. 

 

 

배포된 jar를 EC2에서 직접 실행하면 경로는 다음과 같다.

 

 

즉, CodeDeploy를 통해 생성되는 절대 경로와 직접 Jar를 실행하는 절대 경로가 다름을 알 수 있다.

 

 

방법 1 : deploy_was.sh에서 java -jar 실행 전, 홈으로 이동해서 실행시킨다.

# 경로를 홈으로 이동하고,
cd ~

# jar 실행
java -jar ~ ...

 

 

방법 2 : 파일 생성 시 절대 경로를 지정해준다.

File convertFile = new File(
	System.getProperty("java.io.tmpdir") +
	System.getProperty("file.separator") +
	System.currentTimeMillis() +
	file.getOriginalFilename());
  • java.io.tmpdir는 /tmp 위치를 가리키고 있다. 따라서 임시 저장 파일이 이곳에 생성된다.

 

Comments