정리 목적
이번에 AWS에 배포 테스트를 하며 UI가 변경된 부분도 좀 있었고 이전에는 도메인 구매 후 접근 테스트만 해본 반면 이번에는 여러 환경을 설정하고 처리했기 때문에 이전 정리 내용을 지우고 새로 다시 정리.
처리 환경 정리
Project
- BackEnd - Spring Boot 3
- FrontEnd - React
- 빌드 방식 - 통합빌드
AWS
- EC2 t2.micro
- ubuntu 22.0.4
- Application Load Balancer
- AWS Certificate Manager(ACM)
- Route53
- S3
- RDS(MySQL)
- ElastiCache(Redis)
CI / CD
- Jenkins
- Git Webhook
WebServer
- Nginx
Domain Register
- Gabia
정리 순서
- S3 Bucket 생성 후 Local에서 테스트
- RDS MySQL Database Instance 생성 후 Local Workbench와 연결 테스트 및 프로젝트 연결 테스트
- EC2 Instance 생성 후 설정
- swap 메모리 설정
- JDK 17 설치
- nvm 설치 및 node 21.7.1 설치
- Nginx 설치 및 설정
- Jenkins 설치 및 빌드 Job 설정을 제외한 나머지 처리
- ElasiCache Redis OSS Cache 생성 및 Redis 설치
- Gabia 도메인 구매 후 Route53, ACM 처리
- Load Balancer 대상 그룹 생성 및 ALB 생성 후 대상 그룹 설정
- A레코드 생성 및 도메인 접근 테스트
- git clone을 통해 사전 테스트 이후 Jenkins Job 설정과 Build 테스트
- Git Webhook 연동 및 테스트
S3 Bucket 생성 후 Local 연결 테스트
AWS IAM 계정 생성
S3 Bucket을 생성하기 전에 IAM에 계정을 생성한다.
AWS에서 IAM에 접근해 액세스 관리 -> 사용자 탭을 눌러 접근한다.
사용자 이름을 작성하고 다음으로 넘어간다.
이 계정은 단지 S3 계정에 접근하기 위해 생성하는 것이므로 AWS Management Console에 대한 사용자 액세스 권한 제공은 체크하지 않는다.
권한 옵션에서 직접 정책 연결을 선택하면 아래에 권한 정책이 나온다.
여기서 S3를 검색하고 AmazonS3FullAccess 체크박스를 체크해주고 다음으로 넘어간다.
다음 페이지에 나오는 검토 및 생성에서는 태그를 추가할 수 있는데 선택사항이기 때문에 필요하다면 태그를 추가하고 사용자 생성을 눌러 계정 생성을 마무리한다.
계정이 처음 생성되고 나서 리스트에 있는 계정을 클릭해서 접근하고 아래 이미지의 탭들 중 보안 자격 증명 탭으로 이동한다.
그리고 하단의 액세스 키 만들기를 눌러 액세스 키를 생성해준다.
그럼 가장 먼저 액세스 키 모범 사례 및 대안이라는 페이지가 나오는데 여기서는 말 그대로 모범 사례와 그 설정 대안에 대해서만 알려주는 정도이기 때문에 뭘 선택해도 상관없다.
이번에는 로컬 연결에서 먼저 테스트 해 볼것이기 때문에 로컬 코드를 선택했고 하단의 권장되는 대안에서 자세히 알아보기를 눌러 링크로 이동하면 어느 환경에서는 어떻게 설정하는지에 대한 문서를 확인할 수 있다.
다음!
다음 페이지는 설명 태그 설정 탭인데 여기서는 원하는 태그값을 작성해준다.
설명에 있는 내용 그대로 키의 용도와 사용 위치를 명시하는 태그다.
액세스 키 만들기 버튼을 눌러 다음으로 넘어오면 아래 이미지와 같은 페이지를 볼 수 있다.
액세스키와 비밀 액세스키가 나오게 되며 표시 버튼을 눌러 확인할 수 있다.
여기서 비밀 액세스 키는 이 페이지가 아니라면 더이상 확인 할 방법이 없기 때문에 꼭 저장해둬야 한다.
복사해서 어디 메모해두거나 .csv 파일 다운로드 버튼을 통해 다운받아 저장해둔다.
그럼 이제 계정 생성은 마무리.
다음은 S3 bucket을 생성해준다.
S3로 이동해 버킷 탭으로 들어가 버킷 만들기 버튼을 클릭
가장 먼저 일반 구성 탭에서 버킷의 이름을 작성한다.
기존에 사용하고 있는 버킷이 있고 그 설정과 동일하게 처리하고자 한다면 버킷 선택을 통해 처리할 수 있는 것 같다.
객체 소유권의 경우 ACL 활성화를 선택하고 소유권은 객체 라이터를 선택한다.
퍼블릭 액세스 차단 설정의 경우 모든 퍼블릭 액세스 차단 체크박스를 해제해준다.
지금은 테스트이기 때문에 모드 해제해주지만 그렇지 않다면 당연히 환경 또는 상황에 맞춰 체크해주고 설정해야 한다.
그리고 모두 해제하게 되면 아래 안내 창이 뜨는데 현재 설정으로 인해 객체가 퍼블릭 상태가 될 수 있음을 알고 있습니다에 체크해준다.
버전 관리 역시 필요에 따라 선택. 테스트이기 때문에 비활성화했다.
기본암호화 설정은 SSE-S3가 선택된 그대로 유지한다.
SSE-KMS를 선택하는 경우 추가적인 요금이 발생할 수 있다.
고급 설정도 따로 건드리지 않고 비활성화 상태로 버킷 만들기 버튼을 눌러 버킷 생성!
다음은 버킷 정책을 설정해야 한다.
테스트에서는 버킷에 업로드, 조회, 삭제에 대한 정책만 설정해준다.
자세한 정책 예시는 아래 링크에서 자세하게 알아볼 수 있다.
https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/example-bucket-policies.html
Amazon S3 버킷 정책 예시 - Amazon Simple Storage Service
특정 IP 주소에 대한 액세스를 제한할 때는 S3 버킷에 액세스할 수 있는 VPC 엔드포인트, VPC 소스 IP 주소 또는 외부 IP 주소도 지정해야 합니다. 그렇지 않으면 적절한 권한이 이미 갖춰지지 않은
docs.aws.amazon.com
이것도 제대로 이해하고 자유자재로 사용하기 위해서는 좀 더 알아봐야 할 것 같다.
생성한 버킷 명을 눌러 들어가고, 하단의 탭 중 권한 탭으로 이동하면 버킷 정책 탭을 볼 수 있다.
여기서 편집 버튼을 눌러준다.
그럼 아래 이미지와 같은 페이지가 나오는데 버킷 ARN을 복사해준뒤에 정책 생성기 버튼을 클릭.
그럼 여기서 아래와 같이 설정해준다.
Select type of Policy -> S3 Bucket Policy
Principal -> *
Actions -> DeleteObject, GetObject, PutObject 체크박스 선택
Amazon Resource Name (ARN) -> 이전 페이지에서 복사했던 버킷 ARN 붙여넣기
모두 설정하고 나면 AddStatement 버튼이 활성화 될 것이고 버튼을 클릭!
Add Statement 버튼을 클릭하고 나면 입력한 정보가 출력되며 Generate Policy 버튼이 생성된 것을 볼 수 있다.
클릭!
그럼 아래와 같은 모달창이 출력된다.
이 내용을 모두 복사해준 뒤 닫아주고 버킷 정책 설정 페이지로 이동해 버킷 정책 탭 내부의 정책에 붙여넣기를 해주면 된다.
그리고 추가적인 설정으로 Resource 부분에 ARN이 작성되어있을텐데 ARN 끝에 /* 를 꼭 붙여줘야 한다.
"arn:aws:::버킷명" -> "arn:aws:::버킷명/*" 이렇게!
그럼 이제 로컬에 연결을 한다.
가장 먼저 build.gradle에 aws 의존성 추가를 해준다.
implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE'
그리고 application.yml에 아래와 같이 추가해준다.
cloud:
aws:
credentials:
access-key: IAM 액세스 키
secret-key: IAM 비밀 액세스 키
region:
static: 자신의 리전
s3:
bucket: 버킷명
stack:
auto: false
다음으로 설정 클래스를 생성한다.
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
//...
@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.region.static}")
private String region;
@Bean
public AmazonS3Client amazonS3Client() {
BasicAWSCredentials awsCredentials =
new BasicAWSCredentials(accessKey, secretKey);
return (AmazonS3Client) AmazonS3ClientBuilder.standard()
.withRegion(region)
.withCredentials(
new AWSStaticCredentialsProvider(awsCredentials)
)
.build();
}
}
그럼 이제 저장하는 코드와 삭제하는 코드를 정리.
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.CannedAccessControlList;
import com.amazonaws.services.s3.model.DeleteObjectRequest;
import com.amazonaws.services.s3.model.ObjectMetadata;
import com.amazonaws.services.s3.model.PutObjectRequest;
//...
@Service
public class TestServiceImpl implements TestService {
@Value("${cloud.aws.s3.bucket}")
private String bucket;
private final AmazonS3 amazonS3;
private final AmazonS3Client amazonS3Client;
//파일 객체 저장
public String imageInsert(MultipartFile image) {
StringBuffer sb = new StringBuffer();
String saveName = sb.append(new SimpleDateFormat("yyyyMMddHHmmss")
.format(System.currentTimeMillis()))
.append(UUID.randomUUID().toString())
.append(
image
.getOriginalFilename()
.substring(
image
.getOriginalFilename()
.lastIndexOf(".")
)
)
.toString();
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentLength(image.getSize());
objectMetadata.setContentType(image.getContentType());
try{
amazonS3.putObject(
new PutObjectRequest(
bucket
, saveName
, image.getInputStream()
, objectMetadata
)
.withCannedAcl(CannedAccessControlList.PublicRead)
);
}catch (Exception e) {
throw new CustomIOException();
}
//접근 url이 바로 필요하다면 아래 코드처럼 조회가 가능하다.
//String.valueOf(amazonS3Client.getUrl(bucket, saveName))
return saveName;
}
//S3 파일 객체 삭제
public void deleteImage(String imageName) {
amazonS3.deleteObject(
new DeleteObjectRequest(bucket, imageName)
);
}
}
조회에 대한 처리는 따로 정리했다.
https://myyoun.tistory.com/230
S3 이미지 파일 처리
이번에 프로젝트를 마무리하고 AWS를 통해 배포하면서 S3를 같이 사용해보게 되었는데 솔직히 시작할때는 S3 Bucket 생성과 보안 같은 설정 말고는 별거 있겠나 했는데 역시 사용해봐야 한다는 것
myyoun.tistory.com
참고 블로그
https://skatpdnjs.tistory.com/70
AWS에서 제공하는 S3에 이미지 업로드 해보기
저번시간에 간단하게 내 컴퓨터에다가 이미지를 저장하고, 현재 진행하고 있는 프로젝트에 적용해보았다. 이번포스팅에서는 s3에 이미지를 업로드하는 방법을 알아보겠다. 내 로컬에다 이미지
skatpdnjs.tistory.com
'Web > AWS' 카테고리의 다른 글
SpringBoot & React AWS 배포 테스트 3) EC2 Instance 생성 후 설정 (0) | 2024.08.02 |
---|---|
SpringBoot & React AWS 배포 테스트 2) RDS MySQL Database Instance 생성 후 Local Workbench와 연결 테스트 및 프로젝트 연결 테스트 (0) | 2024.08.02 |
S3 이미지 파일 처리 (0) | 2024.08.01 |
AWS HTTPS 502, 503 에러 해결. (0) | 2021.12.21 |
[AWS Spring boot (Gradle) 연동] 인스턴스 서버 접속 (0) | 2021.11.05 |