diff --git a/build.gradle b/build.gradle index b0bffe9..d33b4ca 100644 --- a/build.gradle +++ b/build.gradle @@ -30,7 +30,6 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'io.fabric8:kubernetes-client:6.12.1' // 최신 버전 확인 - implementation 'mysql:mysql-connector-java:8.0.33' implementation 'org.springframework.boot:spring-boot-starter-freemarker' implementation 'org.springframework.boot:spring-boot-starter-security' diff --git a/src/main/java/AIWA/McpBackend/entity/member/Member.java b/src/main/java/AIWA/McpBackend/entity/member/Member.java deleted file mode 100644 index 962a043..0000000 --- a/src/main/java/AIWA/McpBackend/entity/member/Member.java +++ /dev/null @@ -1,41 +0,0 @@ -package AIWA.McpBackend.entity.member; - - -import jakarta.persistence.*; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - - -@Entity -@Getter -@Setter -@NoArgsConstructor -public class Member { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "member_id", unique = true, nullable = false) - private Long id; - - @Column(nullable = false) - private String name; - - @Column(nullable = false) - private String password; - - @Column(unique = true, nullable = false) - private String email; - - @Column(length = 1000) - private String access_key; - @Column(length = 1000) - private String secret_key; - - public Member(String name, String password, String email) { - this.name = name; - this.password = password; - this.email = email; - } - -} diff --git a/src/main/java/AIWA/McpBackend/provider/aws/api/controller/member/MemberController.java b/src/main/java/AIWA/McpBackend/provider/aws/api/controller/member/MemberController.java deleted file mode 100644 index df65f6c..0000000 --- a/src/main/java/AIWA/McpBackend/provider/aws/api/controller/member/MemberController.java +++ /dev/null @@ -1,74 +0,0 @@ -package AIWA.McpBackend.provider.aws.api.controller.member; - -import AIWA.McpBackend.entity.member.Member; -import AIWA.McpBackend.provider.aws.api.dto.membercredential.MemberCredentialDTO; -//import AIWA.McpBackend.service.kms.KmsService; -import AIWA.McpBackend.provider.aws.api.dto.membercredential.MemberDeleteRequestDto; -import AIWA.McpBackend.provider.aws.api.dto.membercredential.MemberRequestDto; -import AIWA.McpBackend.provider.aws.api.dto.membercredential.MemberResponseDto; -import AIWA.McpBackend.provider.response.CommonResult; -import AIWA.McpBackend.provider.response.ListResult; -import AIWA.McpBackend.provider.response.SingleResult; -import AIWA.McpBackend.service.member.MemberService; -import AIWA.McpBackend.service.response.ResponseService; -import lombok.RequiredArgsConstructor; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.util.List; -import java.util.stream.Collectors; - -@RestController -@RequiredArgsConstructor -@RequestMapping("/spring/api/members") -public class MemberController { - private final MemberService memberService; - private final ResponseService responseService; - - // 회원 등록 - @PostMapping("/register") - public SingleResult registerMember(@RequestBody MemberRequestDto memberRequestDto) { - Member savedMember = memberService.registerMember(memberRequestDto); - MemberResponseDto memberResponseDto = MemberResponseDto.toDto(savedMember); - return responseService.getSingleResult(memberResponseDto); - } - - // 회원 삭제 - @DeleteMapping("/delete") - public CommonResult deleteMember(@RequestBody MemberDeleteRequestDto deleteMemberRequestDto) { - // 회원 삭제 서비스 호출 - memberService.deleteMember(deleteMemberRequestDto); - - // 성공 응답 반환 (ResponseService를 통해) - return responseService.getSuccessResult(); - } - - - // 특정 회원 조회 - @GetMapping("/") - public SingleResult getMember(@RequestParam String email) { - Member findMember = memberService.getMemberByEmail(email); // 이 메서드가 Optional을 반환하지 않는다고 가정 - MemberResponseDto memberResponseDto = MemberResponseDto.toDto(findMember); - if (findMember != null) { - return responseService.getSingleResult(memberResponseDto); - } else { - return (SingleResult) responseService.getFailResult(); - } - } - - @GetMapping("/all") - public ListResult getAllMembers() { - List members = memberService.getAllMembers(); - List memberResponseDtoList = members.stream().map(MemberResponseDto::toDto).collect(Collectors.toList()); - return responseService.getListResult(memberResponseDtoList); - } - - @PostMapping("/update-credentials") - public CommonResult updateCredentials(@RequestBody MemberCredentialDTO memberCredentialDto) { - System.out.println(memberCredentialDto.getAccessKey()); - System.out.println(memberCredentialDto.getSecretKey()); - memberService.addOrUpdateKeys(memberCredentialDto.getEmail(),memberCredentialDto.getAccessKey(), memberCredentialDto.getSecretKey()); - return responseService.getSuccessResult(); - } - -} diff --git a/src/main/java/AIWA/McpBackend/provider/aws/api/dto/membercredential/MemberCredentialDTO.java b/src/main/java/AIWA/McpBackend/provider/aws/api/dto/member/MemberCredentialDTO.java similarity index 80% rename from src/main/java/AIWA/McpBackend/provider/aws/api/dto/membercredential/MemberCredentialDTO.java rename to src/main/java/AIWA/McpBackend/provider/aws/api/dto/member/MemberCredentialDTO.java index 898612b..d33b584 100644 --- a/src/main/java/AIWA/McpBackend/provider/aws/api/dto/membercredential/MemberCredentialDTO.java +++ b/src/main/java/AIWA/McpBackend/provider/aws/api/dto/member/MemberCredentialDTO.java @@ -1,9 +1,11 @@ -package AIWA.McpBackend.provider.aws.api.dto.membercredential; +package AIWA.McpBackend.provider.aws.api.dto.member; import lombok.Data; +import lombok.Getter; @Data +@Getter public class MemberCredentialDTO { private String email; private String accessKey; diff --git a/src/main/java/AIWA/McpBackend/provider/aws/api/dto/member/MemberDTO.java b/src/main/java/AIWA/McpBackend/provider/aws/api/dto/member/MemberDTO.java new file mode 100644 index 0000000..c643329 --- /dev/null +++ b/src/main/java/AIWA/McpBackend/provider/aws/api/dto/member/MemberDTO.java @@ -0,0 +1,16 @@ +package AIWA.McpBackend.provider.aws.api.dto.member; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Getter +public class MemberDTO { + private String accessKey; + private String secretKey; + // 다른 필드 추가 가능 +} \ No newline at end of file diff --git a/src/main/java/AIWA/McpBackend/provider/aws/api/dto/membercredential/MemberDeleteRequestDto.java b/src/main/java/AIWA/McpBackend/provider/aws/api/dto/membercredential/MemberDeleteRequestDto.java deleted file mode 100644 index 6e89b77..0000000 --- a/src/main/java/AIWA/McpBackend/provider/aws/api/dto/membercredential/MemberDeleteRequestDto.java +++ /dev/null @@ -1,14 +0,0 @@ -package AIWA.McpBackend.provider.aws.api.dto.membercredential; - -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@NoArgsConstructor // 기본 생성자 추가 -public class MemberDeleteRequestDto { - private String email; // final 제거 - - public MemberDeleteRequestDto(String email) { - this.email = email; - } -} diff --git a/src/main/java/AIWA/McpBackend/provider/aws/api/dto/membercredential/MemberRequestDto.java b/src/main/java/AIWA/McpBackend/provider/aws/api/dto/membercredential/MemberRequestDto.java deleted file mode 100644 index 30b9579..0000000 --- a/src/main/java/AIWA/McpBackend/provider/aws/api/dto/membercredential/MemberRequestDto.java +++ /dev/null @@ -1,19 +0,0 @@ -package AIWA.McpBackend.provider.aws.api.dto.membercredential; - -import lombok.Data; -import lombok.Getter; - -import lombok.Getter; - -@Getter -public class MemberRequestDto { - private final String name; - private final String password; - private final String email; - - public MemberRequestDto(String name, String password, String email) { - this.name = name; - this.password = password; - this.email = email; - } -} \ No newline at end of file diff --git a/src/main/java/AIWA/McpBackend/provider/aws/api/dto/membercredential/MemberResponseDto.java b/src/main/java/AIWA/McpBackend/provider/aws/api/dto/membercredential/MemberResponseDto.java deleted file mode 100644 index af61593..0000000 --- a/src/main/java/AIWA/McpBackend/provider/aws/api/dto/membercredential/MemberResponseDto.java +++ /dev/null @@ -1,23 +0,0 @@ -package AIWA.McpBackend.provider.aws.api.dto.membercredential; - -import AIWA.McpBackend.entity.member.Member; -import lombok.Data; - -import lombok.Data; - -@Data -public class MemberResponseDto { - private String userName; - private String email; - private String accessKey; - - public MemberResponseDto(String userName, String email, String accessKey) { - this.userName = userName; - this.email = email; - this.accessKey = accessKey; - } - - public static MemberResponseDto toDto(Member member) { - return new MemberResponseDto(member.getName(), member.getEmail(), member.getAccess_key()); - } -} \ No newline at end of file diff --git a/src/main/java/AIWA/McpBackend/repository/member/MemberRepository.java b/src/main/java/AIWA/McpBackend/repository/member/MemberRepository.java deleted file mode 100644 index 0386b11..0000000 --- a/src/main/java/AIWA/McpBackend/repository/member/MemberRepository.java +++ /dev/null @@ -1,8 +0,0 @@ -package AIWA.McpBackend.repository.member; - -import AIWA.McpBackend.entity.member.Member; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface MemberRepository extends JpaRepository { - Member findByEmail(String email); -} diff --git a/src/main/java/AIWA/McpBackend/service/aws/AwsResourceService.java b/src/main/java/AIWA/McpBackend/service/aws/AwsResourceService.java index fe797a5..c1f8600 100644 --- a/src/main/java/AIWA/McpBackend/service/aws/AwsResourceService.java +++ b/src/main/java/AIWA/McpBackend/service/aws/AwsResourceService.java @@ -1,19 +1,22 @@ package AIWA.McpBackend.service.aws; -import AIWA.McpBackend.entity.member.Member; //import AIWA.McpBackend.service.kms.KmsService; import AIWA.McpBackend.provider.aws.api.dto.ec2.Ec2InstanceDTO; import AIWA.McpBackend.provider.aws.api.dto.eip.EipDto; import AIWA.McpBackend.provider.aws.api.dto.eni.NetworkInterfaceDto; import AIWA.McpBackend.provider.aws.api.dto.internetgateway.InternetGatewayDto; +import AIWA.McpBackend.provider.aws.api.dto.member.MemberCredentialDTO; +import AIWA.McpBackend.provider.aws.api.dto.member.MemberResponseDto; import AIWA.McpBackend.provider.aws.api.dto.natgateway.NatGatewayDto; import AIWA.McpBackend.provider.aws.api.dto.routetable.RouteDTO; import AIWA.McpBackend.provider.aws.api.dto.routetable.RouteTableResponseDto; import AIWA.McpBackend.provider.aws.api.dto.securitygroup.SecurityGroupDTO; import AIWA.McpBackend.provider.aws.api.dto.subnet.SubnetResponseDto; import AIWA.McpBackend.provider.aws.api.dto.vpc.VpcTotalResponseDto; -import AIWA.McpBackend.service.member.MemberService; import lombok.RequiredArgsConstructor; +import lombok.Value; +import org.springframework.http.ResponseEntity; +import org.springframework.web.client.RestTemplate; import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; import software.amazon.awssdk.regions.Region; @@ -28,17 +31,22 @@ @RequiredArgsConstructor public class AwsResourceService { + private final RestTemplate restTemplate; + private Ec2Client ec2Client; - private final MemberService memberService; public void initializeClient(String email) { // 특정 멤버의 AWS 자격 증명 가져오기 - Member member = memberService.getMemberByEmail(email); + MemberCredentialDTO memberCredentialDto = getMemberCredentials(email); + + if (memberCredentialDto == null) { + throw new IllegalArgumentException("회원 정보를 찾을 수 없습니다."); + } // AWS 자격 증명 생성 AwsBasicCredentials awsCredentials = AwsBasicCredentials.create( - member.getAccess_key(), - member.getSecret_key() + memberCredentialDto.getAccessKey(), + memberCredentialDto.getSecretKey() ); // EC2 클라이언트 생성 @@ -48,6 +56,23 @@ public void initializeClient(String email) { .build(); } + private MemberCredentialDTO getMemberCredentials(String email) { + String url = "http://" + "member-svc" + "/api/members/email/" + email; // 이메일을 URL 경로로 전달 + + try { + ResponseEntity response = restTemplate.getForEntity(url, MemberCredentialDTO.class); + if (response.getStatusCode().is2xxSuccessful() && response.getBody() != null) { + return response.getBody(); // 응답에서 데이터 추출 + } else { + return null; + } + } catch (Exception e) { + // 오류 처리 + e.printStackTrace(); + return null; + } + } + // EC2 Instances 가져오기 public List fetchEc2Instances(String userId) { initializeClient(userId); diff --git a/src/main/java/AIWA/McpBackend/service/aws/s3/S3Service.java b/src/main/java/AIWA/McpBackend/service/aws/s3/S3Service.java index d4e10c1..839de8b 100644 --- a/src/main/java/AIWA/McpBackend/service/aws/s3/S3Service.java +++ b/src/main/java/AIWA/McpBackend/service/aws/s3/S3Service.java @@ -17,67 +17,6 @@ public class S3Service { private final AmazonS3 s3Client; private final String bucketName = "aiwa-terraform"; - public void createUserDirectory(String userId) { - String userPrefix = "users/" + userId + "/"; - // 초기 main.tf 및 terraform.tfstate 파일을 업로드합니다 - uploadInitialFiles(userPrefix); - } - - private void uploadInitialFiles(String userPrefix) { - // 초기 main.tf 파일 - String mainTfContent = """ - variable "aws_access_key" { - description = "AWS Access Key" - type = string - } - - variable "aws_secret_key" { - description = "AWS Secret Key" - type = string - } - - provider "aws" { - region = "ap-northeast-2" - access_key = var.aws_access_key // 변수로 AWS Access Key 제공 - secret_key = var.aws_secret_key // 변수로 AWS Secret Key 제공 - } - """; - - s3Client.putObject(bucketName, userPrefix + "main.tf", mainTfContent); - -// // 빈 상태 파일 -// String emptyState = "{}"; -// s3Client.putObject(bucketName, userPrefix + "terraform.tfstate", emptyState); - } - - public void deleteUserDirectory(String userId) { - String userPrefix = "users/" + userId + "/"; - - // S3에서 해당 디렉터리(prefix)를 기준으로 모든 파일 목록을 가져옴 - ListObjectsV2Request request = new ListObjectsV2Request().withBucketName(bucketName).withPrefix(userPrefix); - ListObjectsV2Result result; - - // 모든 객체를 반복적으로 가져와 삭제 - do { - result = s3Client.listObjectsV2(request); - for (S3ObjectSummary objectSummary : result.getObjectSummaries()) { - s3Client.deleteObject(bucketName, objectSummary.getKey()); - } - request.setContinuationToken(result.getNextContinuationToken()); - } while (result.isTruncated()); // 계속해서 모든 객체를 삭제할 때까지 반복 - } - - - public void createTfvarsFile(String userId, String accessKey, String secretKey) { - String userPrefix = "users/" + userId + "/"; - String tfvarsContent = String.format(""" - aws_access_key = "%s" - aws_secret_key = "%s" - """, accessKey, secretKey); - - s3Client.putObject(bucketName, userPrefix + "terraform.tfvars", tfvarsContent); - } - /** * S3에서 특정 사용자 디렉토리 내 모든 파일 목록을 가져옵니다. diff --git a/src/main/java/AIWA/McpBackend/service/member/MemberService.java b/src/main/java/AIWA/McpBackend/service/member/MemberService.java deleted file mode 100644 index 4fd1fc0..0000000 --- a/src/main/java/AIWA/McpBackend/service/member/MemberService.java +++ /dev/null @@ -1,80 +0,0 @@ -package AIWA.McpBackend.service.member; - -import AIWA.McpBackend.entity.member.Member; -import AIWA.McpBackend.provider.aws.api.dto.membercredential.MemberDeleteRequestDto; -import AIWA.McpBackend.provider.aws.api.dto.membercredential.MemberRequestDto; -import AIWA.McpBackend.repository.member.MemberRepository; -import AIWA.McpBackend.service.aws.s3.S3Service; -//import AIWA.McpBackend.service.kms.KmsService; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -import java.util.List; -import java.util.Optional; - -@Service -@RequiredArgsConstructor -public class MemberService { - private final MemberRepository memberRepository; - private final S3Service s3Service; - - public Member registerMember(MemberRequestDto memberRequestDto) { - if (memberRepository.findByEmail(memberRequestDto.getEmail()) != null) { - throw new RuntimeException("Email already exists"); - } - s3Service.createUserDirectory(memberRequestDto.getEmail()); - Member regiMember=new Member(memberRequestDto.getName(), memberRequestDto.getPassword(), memberRequestDto.getEmail()); - return memberRepository.save(regiMember); - } - - public void deleteMember(MemberDeleteRequestDto deleteMemberRequestDto) { - String email = deleteMemberRequestDto.getEmail(); - - // 회원 정보 조회 - Member member = memberRepository.findByEmail(email); - if (member == null) { - throw new RuntimeException("Member not found"); - } - - // S3에 저장된 사용자 디렉터리 삭제 - s3Service.deleteUserDirectory(email); - - // 회원 삭제 - memberRepository.delete(member); - } - - - // 특정 회원 조회 - public Optional getMemberById(Long id) { - return memberRepository.findById(id); - } - - public Member getMemberByEmail(String email) { - return memberRepository.findByEmail(email); - } - - public List getAllMembers() { - return memberRepository.findAll(); - } - - - public Member addOrUpdateKeys(String email,String access_key,String secret_key) { - - Member member = getMemberByEmail(email); - member.setAccess_key(access_key); - member.setSecret_key(secret_key); - s3Service.createTfvarsFile(email,access_key,secret_key); - return memberRepository.save(member); - } - - // Access Key와 Secret Key 삭제 - public Member removeKeys(Long id) { - Member member = memberRepository.findById(id) - .orElseThrow(() -> new RuntimeException("Member not found")); - - member.setAccess_key(null); - member.setSecret_key(null); - - return memberRepository.save(member); - } -} \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 03dbd7f..72bcd0e 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,10 +1,3 @@ -spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver -spring.datasource.url=${SPRING_DATASOURCE_URL} -spring.datasource.username=${SPRING_DATASOURCE_USERNAME} -spring.datasource.password=${SPRING_DATASOURCE_PASSWORD} -spring.jpa.hibernate.ddl-auto=create - - cloud.aws.credentials.access-key=${AWS_ACCESS_KEY_ID} cloud.aws.credentials.secret-key=${AWS_SECRET_ACCESS_KEY} cloud.aws.region.static=ap-northeast-2