[TIL]2025.05.07

기 원·2025년 5월 7일

[Project] Spring-plus

목록 보기
5/8

TIL - 2025-05-07

AWS 핵심 정리

IAM이란?

  • AWS 리소스 접근 제어를 위한 서비스
  • 사용자(User), 그룹(Group), 역할(Role), 정책(Policy)을 통해 접근 권한을 관리함

IAM 주요 기능

  1. 인증(Authentication): 사용자 로그인 확인 (아이디/비밀번호, MFA 등)
  2. 권한 부여(Authorization): 정책(Policy)을 통해 리소스 접근 권한 부여
  3. 권한 검증: 요청이 해당 사용자에게 허용된 것인지 검사

정책(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); // S3에 업로드 후 URL 반환
		return ResponseEntity.ok(imageUrl);
	}

Service

private final AmazonS3 amazonS3;
	private final UserRepository userRepository;

	@Value("${cloud.aws.s3.bucket}")
	private String bucket; // S3 버킷 이름 (application.yml에서 설정)

	
	public String updateFile(MultipartFile multipartFile, String dirName, Long userId) {
    	// 고유한 파일명을 생성 (디렉토리/UUID_원본파일명)
		String fileName = dirName + "/" + UUID.randomUUID() + "_" + multipartFile.getOriginalFilename();
        
        // S3 객체 메타데이터 설정
		ObjectMetadata metadata = new ObjectMetadata();
		metadata.setContentLength(multipartFile.getSize());
		metadata.setContentType(multipartFile.getContentType());
		metadata.setContentDisposition("inline");


		try (InputStream inputStream = multipartFile.getInputStream()) {
        	// 파일을 S3에 업로드
			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)) {
            	// 이전 이미지 key 추출 후 삭제
				String oldKey = oldUrl.substring(oldUrl.indexOf(bucket) + bucket.length() + 1);
				amazonS3.deleteObject(bucket, oldKey);
			}
            
			// 새 이미지 URL 설정 및 저장
			String newUrl = amazonS3.getUrl(bucket, fileName).toString();
			user.setProfileImage(newUrl);
			userRepository.save(user);
		});

		// 새 이미지의 S3 URL 반환
		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;

	// AmazonS3 클라이언트 Bean 등록
	@Bean
	public AmazonS3 amazonS3() {
    	// 자격 증명 객체 생성
		BasicAWSCredentials awsCredentials = new BasicAWSCredentials(accessKey, secretKey);
        
        // S3 클라이언트 빌더를 통해 리전 및 인증 정보 설정
		return AmazonS3ClientBuilder.standard()
			.withRegion(region)
			.withCredentials(new AWSStaticCredentialsProvider(awsCredentials))
			.build();
	}

RDS (Relational Database Service)

  • MySQL, PostgreSQL, MariaDB, Oracle, SQL Server 등 관계형 데이터베이스 관리형 서비스
  • Multi-AZ 배포 가능 (고가용성)
  • 자동 백업, 모니터링, 보안 그룹 적용 가능
  • DB 인스턴스와 엔드포인트 개념 존재
profile
노력하고 있다니까요?

0개의 댓글