TIL - 2025-05-07
AWS 핵심 정리
IAM이란?
- AWS 리소스 접근 제어를 위한 서비스
- 사용자(User), 그룹(Group), 역할(Role), 정책(Policy)을 통해 접근 권한을 관리함
IAM 주요 기능
- 인증(Authentication): 사용자 로그인 확인 (아이디/비밀번호, MFA 등)
- 권한 부여(Authorization): 정책(Policy)을 통해 리소스 접근 권한 부여
- 권한 검증: 요청이 해당 사용자에게 허용된 것인지 검사
정책(Policy) 구성 요소
Version: 정책 언어 버전
Statement: 하나 이상의 접근 제어 규칙
Effect: Allow / Deny
Action: 수행할 수 있는 작업 (예: s3:ListBucket)
Resource: 리소스 ARN
Best Practices
- 최소 권한 원칙(Least Privilege) 적용
- 루트 사용자 사용 금지, MFA 활성화
- 역할 기반 접근 제어(RBAC), 태그 기반 제어도 가능
EC2 (Elastic Compute Cloud)
- 가상 서버를 제공하는 서비스
- 인스턴스 타입, AMI, 보안 그룹, 키 페어 설정 필요
- 상태: Stopped, Running 등
- 탄력적 IP(Elastic IP)로 고정 주소 사용 가능
S3 (Simple Storage Service)
- 객체(파일) 저장을 위한 스토리지 서비스
- 버킷 단위로 파일 관리
- 퍼블릭 접근 제어, 버전 관리, 정적 웹 호스팅 가능
- 각 객체는 고유한 URL로 접근 가능
Controller
@PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public ResponseEntity<String> uploadFile(
@AuthenticationPrincipal AuthUser authUser,
@RequestParam("file") MultipartFile file
) {
Long userId = authUser.getId();
String imageUrl = s3Service.updateFile(file, "profile/" + userId, userId);
return ResponseEntity.ok(imageUrl);
}
Service
private final AmazonS3 amazonS3;
private final UserRepository userRepository;
@Value("${cloud.aws.s3.bucket}")
private String bucket;
public String updateFile(MultipartFile multipartFile, String dirName, Long userId) {
String fileName = dirName + "/" + UUID.randomUUID() + "_" + multipartFile.getOriginalFilename();
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentLength(multipartFile.getSize());
metadata.setContentType(multipartFile.getContentType());
metadata.setContentDisposition("inline");
try (InputStream inputStream = multipartFile.getInputStream()) {
amazonS3.putObject(new PutObjectRequest(bucket, fileName, inputStream, metadata));
} catch (IOException e) {
throw new RuntimeException("S3 업로드에 실패하였습니다.", e);
}
userRepository.findById(userId).ifPresent(user -> {
String oldUrl = user.getProfileImage();
if (oldUrl != null && oldUrl.contains(bucket)) {
String oldKey = oldUrl.substring(oldUrl.indexOf(bucket) + bucket.length() + 1);
amazonS3.deleteObject(bucket, oldKey);
}
String newUrl = amazonS3.getUrl(bucket, fileName).toString();
user.setProfileImage(newUrl);
userRepository.save(user);
});
return amazonS3.getUrl(bucket, fileName).toString();
}
config
@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 AmazonS3 amazonS3() {
BasicAWSCredentials awsCredentials = new BasicAWSCredentials(accessKey, secretKey);
return AmazonS3ClientBuilder.standard()
.withRegion(region)
.withCredentials(new AWSStaticCredentialsProvider(awsCredentials))
.build();
}
RDS (Relational Database Service)
- MySQL, PostgreSQL, MariaDB, Oracle, SQL Server 등 관계형 데이터베이스 관리형 서비스
- Multi-AZ 배포 가능 (고가용성)
- 자동 백업, 모니터링, 보안 그룹 적용 가능
- DB 인스턴스와 엔드포인트 개념 존재