반응형


이번 포스트에서는 제가 실제로 경험한 iOS 인앱결제(IAP)와 Apple Server Notification(ASN) 개발 과정에서의 고민과 해결 방법을 정리해 보려고 합니다. 특히, 실시간 구독 상태를 동기화하기 위해 ASN을 백엔드에 통합하는 과정에 집중했습니다.


왜 Apple Server Notification(ASN)을 도입했을까?

기존에는 앱에서 유저가 접속할 때마다 Apple receipt를 백엔드로 전송해서 유효성을 검증했는데요,
이 방식은 실시간성이 떨어지고, 사용자가 앱을 켜지 않으면 구독 상태가 반영되지 않는 문제가 있었습니다.

이를 해결하고자 애플에서 제공하는 실시간 알림 시스템인 ASN을 도입하게 되었습니다.


인프라 구성: Apple → API Gateway → SQS → Backend

애플은 ASN을 외부 HTTP(S) 엔드포인트로 전송하므로, 이를 안정적으로 처리하기 위해 아래와 같은 구조를 구성했습니다.

Apple ASN → API Gateway (HTTPS endpoint) → AWS SQS → Backend 서버
  • API Gateway: Apple에서 직접 호출할 수 있는 HTTPS 엔드포인트 제공
  • SQS: Apple의 긴 재시도 정책 대응 (ex: 수시간 간격으로 재시도됨)
  • Backend: SQS에서 메시지를 받아 구독 상태 업데이트 처리

이 구조 덕분에 유실 없이 비동기 안정 처리가 가능했습니다.


ASN 서명 검증: SignedDataVerifier

Apple ASN은 JWT 포맷의 서명된 데이터를 전송합니다. 이를 검증하기 위해 SignedDataVerifier를 사용하여 ASN의 유효성을 검증하고, payload를 디코딩했습니다.

주의할 점:

  • 로컬 테스트에서는 Apple이 메시지를 직접 전송하지 않기 때문에 테스트가 어렵습니다.
  • 실제 환경에서는 Apple에서 직접 HTTPS로 메시지를 보내기 때문에 반드시 정식 도메인/SSL 인증서가 필요합니다.

개발 중 겪었던 주요 고민

1. 테스트 어려움

Apple은 로컬 테스트 환경에서는 ASN을 전송하지 않기 때문에, 초기 테스트에 큰 제약이 있었습니다.
API Gateway + SQS 구조를 미리 만들어두고, Apple 콘솔에 등록해서 테스트해야 했습니다.

2. receipt-data 미포함 이슈

ASN에는 receipt-data가 포함되지 않아, 서버에서 별도로 Apple API를 호출해 구독 상태를 확인해야 합니다.

3. Apple의 재시도 정책 대응

ASN 전송 실패 시 Apple은 몇 시간 단위로 재시도하기 때문에, 안정적인 처리를 위해 SQS와 Dead-Letter Queue(DLQ)도 설정해두었습니다.


구현 포인트 정리

  • verifySignedData()로 ASN 서명 검증
    - Apple에서 보낸 ASN인지 검증하는 함수
  • SQS Lambda consumer에서 메시지 처리
    - SQS 쌓인 메시지를 읽고 백엔드로 전달하는 로직
  • 구독 상태(AUTO_RENEW_DISABLED, RENEWAL, CANCEL, EXPIRE 등)에 따라 DB 상태 업데이트

마무리

iOS ASN 개발은 쉽지 않았지만, 앱에서 유저가 앱을 열지 않아도 실시간으로 구독 상태를 반영할 수 있다는 점에서 큰 효과가 있었습니다.

728x90
반응형
반응형

 


https://www.credly.com/badges/1eb9a040-948b-4327-ac64-521b1bdbd9c6/public_url

 

AWS Certified Solutions Architect – Associate was issued by Amazon Web Services Training and Certification to gyucheol Kim.

Earners of this certification have a comprehensive understanding of AWS services and technologies. They demonstrated the ability to build secure and robust solutions using architectural design principles based on customer requirements. Badge owners are abl

www.credly.com

 

2024 올해 목표 중에 하나였던 AWS SSA 자격증 취득에 가까스로 성공했다~! 야호~ㅎㅎㅎ
올해 가기 전에 합격해서 참 다행이다,,

현재 회사에서도 AWS 서비스를 많이 사용하고 있어서 조금 더 효율적으로 사용하고 싶은 마음에 자격증 취득 목표를 가졌었는데 성공해서 너무 뿌듯하다!!
시험 합격을 위해서는 문제를 많이 풀어보는 게 정답인 것 같다 물론 개념 정리는 계속하면서! 

아래는 내가 도움 받은 사이트들입니다. 선배님들 감사합니다 ㅎㅎ

[시험에 도움 받은 사이트]
https://julie-tech.tistory.com/128

 

AWS CAA - 덤프 사이트 및 오답노트 공유, 합격후기

오늘은 AWS CAA 자격증 준비과정의 마지막 글이 될 시험 합격후기를 쓰려고 한다. 결국 많은 사람들이 말하지만, "덤프를 열심히 풀고 가세요!"가 한 줄 요약이 될 것 같다! 필자는 2022년 8월 30일부

julie-tech.tistory.com

https://blog.naver.com/PostList.naver?blogId=gam_jaong&categoryNo=18&from=postList&parentCategoryNo=0

 

일본사는 감자옹 : 네이버 블로그

나는 말하는 왜노자 포테이토

blog.naver.com

 

728x90
반응형

'AWS' 카테고리의 다른 글

AWS ECS 이용한 서비스 배포  (0) 2024.04.28
S3 객체 대량 삭제 시 복구 방법  (2) 2023.11.03
AWS를 이용한 SSL 적용하기  (0) 2023.01.08
반응형

배포하실 서비스가 Dockerfile에 준비되어 있다는 전제에서 설명드리겠습니다.

 

순서

  1. ECR 레포 docker 이미지 push
  2. ECS 태스크 정의
  3. ECS 클러스터 생성
  4. 클러스터 서비스 생성

 

ECS 이란?

Amazon Elastic Container Service(Amazon ECS)는 완전관리형 컨테이너 오케스트레이션 서비스입니다. 기본적으로 Amazon Route 53, Secrets Manager, AWS Identity and Access Management(IAM), Amazon CloudWatch 등의 다른 서비스와 통합을 통해 컨테이너 배포 및 확장을 위한 익숙한 환경을 제공할 수 있습니다. 다른 AWS 서비스와의 신속한 통합을 통해 ECS에 새로운 기능을 추가할 수도 있습니다. ECS를 통해 애플리케이션에서 Amazon EC2  AWS Fargate를 스팟 및 온디맨드 요금 옵션과 조합하여 유연하게 사용할 수도 있습니다.


ECR 이란?

AWS ECR (Amazon Elastic Container Registry)는 Amazon Web Services가 제공하는 Docker 컨테이너 이미지를 저장하고 관리할 수 있는 서비스입니다. 이 서비스를 사용하여 개발자는 Docker 이미지를 안전하게 업로드, 저장, 관리 및 배포할 수 있습니다. ECR은 AWS 클라우드의 다른 서비스와 통합되어 컨테이너화된 애플리케이션의 빌드, 저장 및 배포 프로세스를 간소화합니다.

 

1. ECR 레포 docker 이미지 push

1. AWS ECR에 접속해서 원하는 레포 이름으로 레포지토리를 생성합니다.

2. 레포를 생성했다면 푸시 명령 보기를 클릭해서 배포하려는 프로젝트 파일에서 순차적으로 명령어를 실행시켜서 푸시를 진행합니다.(푸시 명령 1~4번 실행)

주의할 점, 배포하는 ECS가 Linux이기 때문에 Linux 환경에서 실행되는 docker 이미지를 push 해야 합니다.
추후에 ECS 서비스를 생성할 때 계속 서킷 브레이커가 발생한다면 docker 이미지를 먼저 의심해 보시면 됩니다.

(저 같은 경우 docker 이미지가 제 MAC에서는 잘 동작해서 ECR에 올렸는데 ECS는 Linux 계열이라서 계속적으로 ECS 서비스 생성에 문제가 발생해서 오랜 삽질을 했습니다,, 저 같은 분들이 없기를,,)

 

 

 

2. ECS 태스크 정의

  • 태스크 정의 패밀리 : 원하시는 이름 작성
  • 시작 유형 : AWS Fargate
  • OS, 아키텍처, 네트워크 모드 : Linux/X86_64
  • 태스크 크기 : 1 vCPU, 3GB
  • 태스크 역할 : ecsTaskExecutionRole
  • 태스크 실행 역할 : ecsTaskExecutionRole

 

컨테이너

  • 이미지 URI : ECR 이미지 URI (주의, ECR 레포 URI 아닙니다.  아래 이미지 참고)
  • 컨테이너 포트 : 컨테이너에서 사용하는 포트 작성
  • 환경변수 파일 추가 : S3에 환경 변수 파일 업로드해서 객체 ARN 값 작성(옵션)
  • 로깅을 선택하면 ecsTaskExecutionRole 값에 CloudWatchFullAccess 권한 추가 필요(옵션, 아래 이미지 참고)

나머지 설정은 기본 설정으로 진행

 

 

ECR 레포 안에 이미지 URI 복사
ecsTaskExecutionRole 권한에 CloudWatchFullAccess 권한 추가

3. ECS 클러스터 생성

  • 클러스터 이름 작성
  • AWS Fargate 선택

나머지 설정은 기본 설정값으로 진행

 

 

4. 클러스터 서비스 생성

환경
- 컴퓨팅 옵션 : 시작 유형

- 시작 유형 : FARGATE
배포 구성

- 애플리케이션 유형 : 서비스

- 패밀리 : 앞에서 정의한 태스크 선택
네트워킹
- 사용하는 VPC 있으면 선택

로드 벨런싱

- 로드 벨런서 연결

- 기존 대상 그룹을 연결할 때는 대상 유형을 “IP 주소 선택해서 생성한 대상 그룹 연결 가능(Fargate 연결하는 경우)

 

 

ECS 서비스 상태가 활성이면 배포 성공!

 

서비스에 들어가면 상태 및 지표와 연결된 로드 벨런서 확인이 가능하고

테스크에 들어가면 태스크 구성(IP등)과 로그를 확인할 수 있습니다.

728x90
반응형

'AWS' 카테고리의 다른 글

AWS SAA-CO3 Certification 취득  (0) 2024.12.08
S3 객체 대량 삭제 시 복구 방법  (2) 2023.11.03
AWS를 이용한 SSL 적용하기  (0) 2023.01.08
반응형
Github Action을 이용해서 CDN S3 업로드 POC 진행중..
너무 오래 걸리는데?? Action log를 살펴보는데..

 

 

 

upload : 오호 예상대로 업로드가 잘됐군
delete : 뭐지..?
delete : 이
delete : 거
delete : 어
delete : 떻
delete : 게
delete : 멈
delete : 추
delete : 지...
 

 

제가 멍청하게 Github 지정된 폴더와 S3 버킷을 동기화하는 코드를 넣어서 S3 객체를 날리고 있었습니다..
평정심을 찾고.. 아니 끝까지 못 찾았습니다..
부랴부랴 버킷에 들어가 봅니다!
 

 

 
버킷 버전 관리가 활성화되어 있으면 복구가 가능합니다!!
버전 관리가 활성화되어있는 상태에서는 객체를 삭제하면 삭제 마커 버전이 생성되는데요
삭제 마커 버전을 삭제하면 전 버전으로 복구 시킬 수 있습니다.
 
 
이렇게 aws console을 이용해서 복구 시킬 수도 있지만, 저같이 대량의 파일을 삭제했을 경우에는 코드로 복구 시킬 수 있는데요.
AWS SDK를 사용해서 여러 프로그래밍 언어로 코딩하는 방법도 있지만, 저는 급한 마음에 AWS CLI를 이용해서 S3 복구를 진행하였습니다.

 

1. AWS CLI를 설치

AWS CLI 이용하려면 CLI 설치를 먼저 진행해야 합니다.
Homebrew를 이용해서 설치를 진행하도록 하겠습니다.
aws cli 설치 : brew install awscli
설치 확인 : aws --version
aws cli를 이용하기 위해서는 aws configure 설정을 해줘야 합니다.
aws iam 서비스에서 관련된 권한만 부여된 사용자를 생성해서 설정하는게 보안에 더 좋습니다.
저는 s3 관련 권한만 부여된 사용자를 생성하였습니다.
 
 
위와 같이 사용자를 생성하면 AWS Access Key ID와 Secret Access Key가 생성되는데요,
중요한 정보이기에 외부 유출에 유의하셔야 합니다.
aws cli 설정 : aws configure
설정값에 key와 각종 정보를 등록하셨다면 이제 aws cli를 이용해서 S3 객체를 복원해 보도록 하겠습니다.
 
순서는 크게 두가지 입니다.
  1. 오늘 날짜로 삭제된 S3 객체 목록 추출
  2. 추출된 리스트를 이용해서 삭제 마커 버전 삭제

 

2. 삭제된 S3 객체 목록 추출

cli를 이용해서 aws api를 호출하면 아래와 같이 삭제 마커가 붙은 객체를 가져올 수 있습니다.
터미널에서 조회
aws s3api list-object-versions --bucket s3_bucket_name --output text | grep DELETEMARKERS

 

 
aws s3 api를 이용해서 오늘 날짜로 삭제된 객체 목록을 txt 파일로 가져올 수 있습니다.
s3_deleted_object_list.sh
#!/bin/bash
TODAY=$(date +"%Y-%m-%d")
aws s3api list-object-versions --bucket s3_bucket_name --output text | grep DELETEMARKERS | grep $TODAY > deleted_objects_today.txt

 

3. 추출된 리스트를 이용해서 삭제 마커 버전 삭제

위에서 추출한 목록에서 객체의 key 값과 version_id를 이용해서 해당 버전을 삭제시킬 수 있습니다.
s3_restore.sh
#!/bin/bash


while read -r line; do
key=$(echo $line | awk '{print $3}')
versionId=$(echo $line | awk '{print $5}')
aws s3api delete-object --bucket s3_bucket_name --key "$key" --version-id "$versionId"
done < deleted_objects_today.txt

 

 

 

 

728x90
반응형

'AWS' 카테고리의 다른 글

AWS SAA-CO3 Certification 취득  (0) 2024.12.08
AWS ECS 이용한 서비스 배포  (0) 2024.04.28
AWS를 이용한 SSL 적용하기  (0) 2023.01.08
반응형

AWS에서 제공하는 인증서 관리 서비스인 ACM(AWS Certificate Manager)을 이용해서 웹 서버에 SSL을 적용해 보도록 하겠습니다.

 ACM 공식 문서를 한 번 읽어 보시면 좋을 것 같습니다.

  • 이 방법은 AWS에서 제공하는 인증서 관리 서비스로 갱신에 대한 신경을 쓸 필요가 없습니다.
  • 간편하게 사용이 가능하고 유효기간은 13개월이며, ACM에서 인증서 발급은 무료입니다.

사전 준비 상태

  • 도메인 구매 완료
  • EC2 Instances
  • AWS Rout 53 사용

SSL 적용 순서

  1. ACM을 이용한 인증서 발급
  2. 로드밸런서 생성
  3. Route 53 등록

1.  ACM을 이용한 인증서 발급

 

1.1 퍼블릭 인증서 요청 선택합니다.

1.2 완전히 정규화된 도메인 이름에 사전에 발급 받으신 도메인을 작성합니다.

 - 검증 방법은 Route 53을 이용하기 때문에 DNS 검증을 선택하면 보다 더 편리하게 자동으로 갱신됩니다.

 - 키 알고리즘은 가장 널리 사용되는 RSA 2048을 사용하겠습니다.

1.3 인증서 검증을 위해서 발급된 인증서에 들어가셔서 "Rout 53에서 레코드 생성"을 선택합니다.

 - Route 53에 들어가 보시면 레코드 리스트에 CNAME 유형으로 생성된 걸 확인할 수 있습니다.

 

2.  로드밸런서 생성

현재 발급받은 인증서는 사용 중이 아니라서 갱신 자격이 부적격입니다.(로드밸런서에 연결하면 적격으로 변경됩니다.)

ACM 인증서는 Elastic Load Balancing(ELB)과 같은 다른 AWS 서비스와 연결되어야 합니다.

로드밸런서를 생성하도록 하겠습니다.

 

2.1 Application Loa Balancer로 생성하도록 하겠습니다.

 

2.2 Basic configuration

  - Load balancer name을 작성해 주시고 다른 설정은 그대로 두셔도 무방합니다.

2.3 Network mapping

  - Mappings는 두개 이상 선택해줍니다.

2.4 Security groups

  - 보안 그룹은 EC2 Instances에 등록된 보안 그룹을 추가해 줍니다.

  - 80, 443 번 포트가 오픈되어 있어야 합니다.

2.5 Listeners and routing에 인증서를 연결할 EC2 Instances를 연결합니다.

- 연결할 인스턴스가 안 보일 경우 create target group을 선택해서 생성합니다.

2.6 위 설정을 모두 하셨다면 로드밸런서를 생성합니다.

 - 생성된 로드밸런서에 리스너 탭으로 이동하면 위에서 등록한 리스너가 보입니다.

 - 443 리스너에 인증서 보기/편집을 선택해서 앞에서 생성한 인증서를 연결합니다.

2.7 80 포트는 443 포트로 리디렉션를 해주도록 하겠습니다.

 - 규칙 보기/편집을 선택합니다.

 

 

3.  Rout 53 등록

3.1 Rout 53에 위에서 생성한 로드밸런서를 레코드에 생성합니다.

3.2 SSL 연결이 끝났습니다. 

 - 브라우저에서 해당 도메인에 접근하시면 자물쇠 모양과 발급된 인증서를 확인할 수 있습니다.

 

주의사항

1. 로드밸런서 대상 그룹에 해당 인스턴스 Health status가 정상인지 확인합니다.

- Health checks 탭에서 Path 등을 변경해서 인스턴스 상태를 체크할 수 있습니다.

- Zone이 위에서 선택한 Network mapping과 같은지 확인합니다.

 

2. Route 53에 서브도메인을 www로 설정해서 로드밸런서를 등록하셨다면 "www.도메인"으로 접근하셔야만 접근이 가능합니다.

www를 빼고 접근을 해도 해당 도메인에 접근할 수 있도록 설정하기 위해서 서브도메인을 비우고 별칭을 이용해서 도메인과 연결합니다.

 

728x90
반응형

'AWS' 카테고리의 다른 글

AWS SAA-CO3 Certification 취득  (0) 2024.12.08
AWS ECS 이용한 서비스 배포  (0) 2024.04.28
S3 객체 대량 삭제 시 복구 방법  (2) 2023.11.03
반응형

토이 프로젝트로 혼자서 클라우드 서비스를 이용하여 웹 개발부터 배포까지 온 과정을 경험해 보았습니다.

이 과정을 단계별로 나누어서 정리해 보려고 합니다.!

많은 피드백은 감사합니다!

 

목차 

STEP 01) NCP 서버 

STEP 02) AWS RDS, S3

STEP 03) Web Application 개발

STEP 04) Jenkins pipeline 배포

STEP 05) Domain 등록

 


이번에는 AWS Route53 서비스를 이용해서 도메인을 등록해보겠습니다.

 

가비아에서 구매 한 도메인을 AWS Route53에 등록해보겠습니다.

Route53에서도 도메인 구매가 가능합니다

 

1. 호스팅 영역 > 호스팅 영역 생성

 

 

2. 도메인 정보 입력

  - 도메인 이름 : 구매한 도메인

  - EC2 퍼블릭 IP

  - 퍼블릭 호스팅 영역 : 인터넷에서 트래픽을 라우팅하고자 하는 방법을 지정하는 레코드를 포함합니다.

 

3. NameServer 등록

  - NS : 네임서버 레코드로 도메인에 대한 네임서버의 권한을 가지고 있는지 알려주는 레코드

  - SOA : 도메인의 정보를 가지고 있는 레코드

 

 

4. 가비아에 AWS 네임서버 등록

  - 호스팅업체의 네임서버를 사용해도 무방합니다.

 

가비아에 등록된 네임서버

5. 도메인과 EC2 인스턴스 IP 연결

  - 레코드 생성 클릭

 

 

레코드 이름 : 라우팅할 이름을 설정합니다.

레코드 유형 : ec2로 라우팅할 경우 ipv4로 라우팅합니다.

값 : ec2 인스턴스 퍼블릭 IP

TTL : DNS에 ip 주소를 저장하는 시간

 

 

레코드를 생성하면 시간이 조금 지나서 등록한 도메인으로 접속이 가능합니다!

Route53은 Free tier 사용하더라도 월별 호스팅 가격 및 쿼리(도메인을 통해서 AWS에 접속하는 횟수) 비용이 발생합니다.

  - Rout53 요금제

728x90
반응형
반응형

토이 프로젝트로 혼자서 클라우드 서비스를 이용하여 웹 개발부터 배포까지 온 과정을 경험해 보았습니다.

이 과정을 단계별로 나누어서 정리해 보려고 합니다.!

많은 피드백은 감사합니다!

 

목차 

STEP 01) NCP 서버 

STEP 02) AWS RDS, S3

STEP 03) Web Application 개발

STEP 04) Jenkins pipeline 배포

STEP 05) Domain 등록

 

 


 

* Web Application 개발은 앞에서 살펴보았던 AWS 서비스를 사용하는 방법만 소개하도록 하겠습니다.

 

개발 환경

 - SpringBoot 2.6.6

 - Mariadb 2.7.5

 - Gradle 7.4.1

 

1. RDS 연결(yml 설정)

  - 이전 RDS 설정 확인

spring:
  datasource:
    url: jdbc:mariadb://rds end point 주소 + prot + schema name
      예) jdbc:mariadb://rds.amazonaws.com:3306/rdstest
    driver-class-name: org.mariadb.jdbc.Driver
    username: admin
    password: 패스워드

 

2. S3 연결

  - 이전 S3 설정 확인

1.  spring cloud starter 의존성 추가

  - build.gradlew

implementation 'io.awspring.cloud:spring-cloud-starter-aws:2.3.1'

 

2. yml 설정

cloud:
  aws:
    credentials:
      access-key: access key
      secret-key: secret key
    s3:
      region: ap-northeast-2
      endpoint: s3-bucket

 

  - access key, secrey key 새 액세스 키 만들기로 생성

 

 

- region, endpoint 작성

  endpoint는 :::뒤에 복/붙

 

AwsS3Config.java

 

package com.bumblebee.dailyspecial.domain.aws;

import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author bumblebee
 */
@Configuration
public class AwsS3Config {

    @Value("${cloud.aws.credentials.access-key}")
    private String accessKey;

    @Value("${cloud.aws.credentials.secret-key}")
    private String secretKey;

    @Value("${cloud.aws.s3.region}")
    private String region;

    @Bean
    public AmazonS3Client amazonS3Client() {
        BasicAWSCredentials awsCreds = new BasicAWSCredentials(accessKey, secretKey);
        return (AmazonS3Client) AmazonS3ClientBuilder.standard()
                .withRegion(region)
                .withCredentials(new AWSStaticCredentialsProvider(awsCreds))
                .build();
    }

}

 

AwsS3Service.java

 

package com.bumblebee.dailyspecial.domain.aws;

import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.CannedAccessControlList;
import com.amazonaws.services.s3.model.ObjectMetadata;
import com.amazonaws.services.s3.model.PutObjectRequest;
import com.bumblebee.dailyspecial.domain.comutils.CommonUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;

/**
 * @author bumblebee
 */
@Slf4j
@RequiredArgsConstructor
@Service
public class AwsS3Service {

    private final AmazonS3Client amazonS3Client;

    @Value("${cloud.aws.s3.endpoint}")
    private String bucketName;

    public String uploadFileV1(String category, MultipartFile multipartFile) {
        validateFileExists(multipartFile);

        String fileName = CommonUtils.buildFileName(category, multipartFile.getOriginalFilename());

        ObjectMetadata objectMetadata = new ObjectMetadata();
        objectMetadata.setContentType(multipartFile.getContentType());

        try (InputStream inputStream = multipartFile.getInputStream()) {
            amazonS3Client.putObject(new PutObjectRequest(bucketName, fileName, inputStream, objectMetadata)
                    .withCannedAcl(CannedAccessControlList.PublicRead));
        } catch (IOException e) {
//            throw new FileUploadFailedException();
        }

        return amazonS3Client.getUrl(bucketName, fileName).toString();
    }

    private void validateFileExists(MultipartFile multipartFile) {
        if (multipartFile.isEmpty()) {
//            throw new EmptyFileException();
        }
    }

}

 

AwsS3Config class에 amazonS3Client 메소드를 @Bean으로 등록합니다.

파일을 업로드가 필요한 로직에 AwsS3Service class에서 uploadFIleV1 메소드를 이용해서 S3에 업로드 합니다.

예)

awsS3Service.uploadFileV1("Img", multipartFile);

 

그 외 다운로드 및 다중 업로드 기능도 제공하고 있습니다.

 

참조

  - Springboot로 S3 파일 업로드하기

728x90
반응형
반응형

토이 프로젝트로 혼자서 클라우드 서비스를 이용하여 웹 개발부터 배포까지 온 과정을 경험해 보았습니다.

이 과정을 단계별로 나누어서 정리해 보려고 합니다.!

많은 피드백은 감사합니다!

 

목차 

STEP 1) NCP 서버 

STEP 2) AWS RDS, S3

STEP 3) Web Application 개발

STEP 04) Jenkins pipeline 배포

STEP 05) Domain 등록


AWS(Amazon Web Services)

  - 아마존 클라우드 서비스

  - 현재 클라우드 컴퓨팅 분야에서 세계 1위

  - 다양한 클라우드 자원을 1년간 무료로 경험해 볼 수 있다.

  - 많은 국내 IT 기업에서도 사용 중이다.

 

* 이번 장에서는 Web Application를 만드는데 필요한 객체 스토리지 서비스(S3)를 AWS에서 사용하는 방법을 알아보겠습니다. 

S3

S3는 AWS(Amazon Web Service)에서 제공하는 인터넷 스토리지 서비스입니다.
S3(Simple Storage Service) 를 뜻합니다.

 

장점

  • 높은 내구도를 자랑하며 정보를 안전하게 저장 할 수 있습니다.
  • 저렴한 비용으로 사용이 가능합니다(ec2에 이미지, 영상등을 저장하며 비용이 만만치 않습니다.)
  • 보안성이 뛰어납니다 ( SSL을 통하여 데이터 전송과 암호화를 하므로 해킹 걱정이 적습니다.)
  • 속도가 빠릅니다 (각 지역에 맞게 선택하며, 업/다운로드 시 지역시간 최소화를 위한 멀티 파트 업로드를 지원합니다.)

 

1. Amazon S3에서 버킷 만들기를 선택합니다.

 

 

2. S3 버킷 만들기

  - 버킷 이름과 AWS 리전을 선택합니다.

 

3. ACL 활성화됨을 선택합니다.

  - 비활성화를 하게 되면 개발 당시 파일 업로드할 때 400 에러가 발생된 경험이 있습니다.

 

4. 퍼블릭 액세스 차단은 맨 마지막 임의의 퍼블릭 버킷 또는 엑세스 지점 정책을 ... 제외하고 체크 하도록 하겠습니다.

  - 모든 퍼블릭 액세스 차단을 권장하고 있습니다.

 

5.  버킷 버전 관리 및 기본 암호화 운영할 때는 활성화를 하는 게 유지 보수 측면에서나 보안상 좋습니다.

 

6. 생성된 버킷에 이미지를 업로드해 보겠습니다.

 

7. 파일 추가 후 업로드 클릭

 

 

8. 객체 URL 복사 후 접근!

 

 

AccessDenied 에러 발생..

 

9. 버킷 > 권한 탭 > 버킷 정책 설정

  9.1 ) 퍼블릭 액세스 차단 모두 해체 후 저장

 

  9.2 ) 버킷 정책 편집 > 정책 생성기

 

 

  - Select Type of Policy : S3 Bucket Policy 

  - Principal : *

  - Actions : GetObject

  - Amazon Resource Name(ARN) : 버킷 > 속성 탭 > Amazon 리소스 이름(ARN) /* (이름 뒤에 /* 붙여줍니다.)

  9.3 ) Generate Policy 후 JSON 복사 > 버킷 정책에 붙여넣기 후 저장

 

10. 객체 URL 접근 이미지 출력!

 

728x90
반응형

+ Recent posts