본문 바로가기
프로젝트/AeStagram

배포환경에서 애플리케이션과 S3 연동방법

by 에어컨조아 2021. 10. 26.

본 포스팅은 이미 AWS에 EC2와 S3가 만들어져 있다고 가정하고 시작하겠습니다.

혹시라도 S3를 어떻게 만들지?, SpringBoot와 연동은 어떻게 하지? 하시는 분이 있으시다면 이전 포스팅을 참고 부탁드립니다.

RDS 만들기

일단 SpringBoot 애플리케이션을 EC2에 띄우기 위해서는 해당 애플리케이션이 접속하는 DB를 구축해야 합니다. 여기서는 MariaDB를 사용하였습니다.

MariaDB를 사용하는 이유는 가격입니다.

현재 AWS의 프리티어를 사용하고 있어 1년동안은 최대한 프리티어의 이점을 누리기 위해서 제일먼저 고민했던 부분입니다.

MariaDB는 라이센스가 무료임으로 추후 프리티어 기간이 끝나도 MsSql이나 Oracle보다 가격선방을 해줄 것 같았습니다. 또한 성능면에서도 Mysql과 비슷하며, Mysql의 대부분의 기능들과 호환이 되어 큰 문제없이 바로 사용 가능할 것으로 판단했습니다.

AWS RDS 생성과정

자 그럼 MariaDB를 설정하도록 하겠습니다.

  1. 우선 RDS를 생성하기 전에 DB 설정을 위한 파라미터 그룹을 생성합니다.
  • 파라미터 설정방법

    • character_set_client
    • character_set_connection
    • character_set_database
    • character_set_filesystem
    • character_set_results
    • character_set_server

    위 6개의 설정값을 이모지도 저장가능한 utf8mb4로 설정합니다.

    • collation_connection
    • collation_server그런다음 나머지 2개도 utf8mb4_general_ci로 설정합니다.
  • 인코딩타입을 변경하는 이유는 기본적으로 한글이 DB에 저장되야 함과 동시에 이모지도 저장될 수 있기 때문입니다.

  • 생성시 DB 버전이 동일한지 확인하고 만듭니다.
    파라미터 그룹 생성 버튼을 클릭하여 그룹을 만듭니다.

  • AWS RDS 의 탭을 보면 파라미터 그룹이 있습니다.

  1. RDS 생성에서 MariaDB를 선택 후 프리티어를 선택해줍니다.
    그다음 AWS에서 식별할 수 있도록 식별자와 사용자 id, pw를 입력합니다.

스토리지는 프리티어에서 최대 20GB까지 사용가능하므로 20GB까지 설정합니다.

퍼블릭 액세스 설정하여 외부에서도 접근 가능하도록 설정합니다.

마지막으로 추가구성을 통해 DB 이름과 만들어둔 파라미터설정 등록합니다.

만약 파라미터 그룹을 만들어 두지 않았다면 해당 설정을 합니다.

마지막으로 외부에서 접근 가능하도록 VPC 보안 그룹 설정을 추가해줘야 합니다.

  1. 내 PC의 ip를 등록합니다.
  2. EC2 보안 그룹을 등록합니다.

위 2개의 설정으로 local에서 RDS로, EC2에서 RDS로 접속이 가능해졌습니다.
그러면 Intellij에서 RDS를 접속해보겠습니다.

우선 엔드포인트를 확인 후 DB host부분에 엔드포인트를 입력합니다.

user, password, 초기 database 스키마를 입력 후 test connection을 누르면 정상적으로 연결되는 것을 확인할 수 있습니다.

연결이 다 되었으면 aws console에서 설정한 RDS 파라미터 설정들이 정상적으로 설정되었는지 확인합니다.

show variables like 'c%';
select @@time_zone, now();

마지막으로 EC2에서도 해당 RDS가 접속이 잘 되는지 확인합니다.

sudo yum install mysql
mysql -u admin -p -h 엔드포인트(climblabs-dev.cgx9tr6kgblu.ap-northeast-2.rds.amazonaws.com)

AWS IAM 설정하기

이전 포스팅을 확인하면 어플리케이션에서 S3를 연동할때 access-key, secret-key가 필요하다는 것을 확인할 수 있습니다. 이는 S3에 접속할 수 있는 중요한 키 임으로 Github 등 public한 곳에 공유하면 안됩니다.

그래서 해당 키를 프로젝트에 yml형식으로 읽어와 처리했던 부분을 변경하여 위 설정값들이 애플리케이션이 구동하는 환경에 설정되게 한 뒤 이를 읽어오도록 처리해야합니다.

기존에 AWS의 access-key와 secret-key를 yml에서 읽어와 설정했던 부분을 제거하였습니다.

배포환경에 있는 application-aws.yml도 변경합니다.

instance-profile을 true로 해야 AWS의 Role 설정값을 읽어 동작하게됩니다.

이렇게 제거를 하면 애플리케이션 환경에 맞게 설정값을 읽어옵니다.

  • Window Path : 사용자/.aws/credentials
  • EC2 Path : EC2에 Role 설정한 값

윈도우에서는 해당 경로에 credentials파일을 생성합니다.

[default]
aws_access_key_id = 발급받은 access key
aws_secret_access_key = 발급받은 secret key

EC2에서는 아래 그림처럼 Role을 설정하지 않았을때에는 access_key, secret_key가 비어있는것을 확인할 수 있습니다.

AWS에서 내 보안 자격 증명 을 선택합니다.

역할에 들어가서 역할 만들기를 선택합니다.

위 설정들을 선택 후 다음을 누릅니다.

정책은 s3의 모든 접근권한을 부여하도록 체크해줍니다.

이렇게 만든 Role은 EC2에 적용시킵니다.

그럼 다시 Console로 돌아와서 명령어를 입력해보겠습니다.

access_key, secret_key가 등록되있는것을 확인할 수 있습니다.

그러면 EC2에 배포된 SpringBoot 애플리케이션에서 Role에서 설정한 S3 액세스 값들을 읽어와 처리하게됩니다.

댓글