1. Ec2를 만들었다.
2. 리전 설정을 제대로 하지 않아 미국 동부 (us-east-2) 에 만들었다.
3. s3 버킷이랑 연결하는데 버킷은 또 서울에 만들었다.
4. awsconfig로 파일 불러오는 과정에서 자꾸 미국 서부(us-west-2)로 불러와졌다.
5. 4의 문제를 해결했다. 이 문제를 해결하며 리전 위치의 중요성을 알게되었고, 미국 동부(us-east-2)에 만들었다는 사실을 알게되었다.
6. 그 때부터 ec2가 매우 느리다고 느껴졌고 어떤 블로그에서 서버가 멀리있을수록 느리다는 말에 더 느리다고 느껴졌다.
7. 한번 ec2 설정을 잘못했더니 다 꼬이는 기분이었다. 탄력적 ip를 발급받아 ec2에 연결하고 8080포트로 접근하려는데 접근이 되지 않았다.
8. 보안규칙, 인바운드규칙, 다다다다다 확인했는데 안됐다. 그러던 중 리눅스의 방화벽 ufw를 알게되었고 80포트는 열려있지만 8080포트는 열려있지 않았다 .. . . . . . . . . 그래서 열었다.
9. ec2는 정말 자주 다운되었고 우리는 이걸 '미국 동부' 라고 부르기로 했다.
10. 이렇게 '미국 동부'를 놔둘순 없었다. 유료 결제를 해서라도 늘려야하나 하고 있던 찰나 SWAP 을 알게되었다..... to be continued
Ec2 생성 시 리전을 지정한다. 리전은 AWS 서비스들이 제공되는 서버의 물리적인 위치를 의미한다.
내가 서비스 하려는 지역의 주 고객들이 사용하는 지역과 서버의 거리가 멀면 멀수록 느려진다.
( 따라서 서울 유저인데 미국 리전으로 서버를 구축하면 안된다. ㅋ ㅋ)
그리고 다음 글에 따라 Ec2를 생성한다.
@Slf4j
@Service
@RequiredArgsConstructor
public class AwsS3Service {
private final AmazonS3Client amazonS3Client;
@Value("${cloud.aws.s3.bucket}")
private String bucketName;
public String getThumbnailPath(String path) {
return amazonS3Client.getUrl(bucketName, path).toString();
}
}
@Configuration
public class AwsS3Config {
@Value("${cloud.aws.access-key}")
private String accessKey;
@Value("${cloud.aws.secret-key}")
private String secretKey;
@Value("${cloud.aws.region}")
private String region;
@Bean
@Primary
public AmazonS3Client amazonS3Client() {
BasicAWSCredentials awsCredentials = new BasicAWSCredentials(accessKey, secretKey);
return (AmazonS3Client) AmazonS3ClientBuilder.standard()
.withRegion(region)
.withCredentials(new AWSStaticCredentialsProvider(awsCredentials))
.build();
}
}
@SpringBootTest
class DashboardApplicationTests {
@Autowired
private AwsS3Service s3UploadService;
@DisplayName("이미지 찾기")
@Test
public void findImg() {
String imgPath = s3UploadService.getThumbnailPath("pl.png");
Assertions.assertThat(imgPath).isNotNull();
}
}
위의 AwsS3Config 에서 아주 헤맸다 amazonS3Client() 메소드의 리턴값을 원래 'AmazonS3'로 해두었다. 그랬더니 테스트 코드를 통해 파일이름을 이용해 파일 링크를 얻으려 했을 때 얻은 링크에서
권한 없음 에러가 떴고, 이는 설정한 리전이 아닌 다른 리전으로 접근했을 때 발생하는 에러였다.
AwsS3Config 의 getThumnailPath를 이용해 얻은 링크는 내가 설정하고, ${cloud.aws.region} 로 전달한 us-east-2가 아닌 us-west-2로 연결되었고 링크에도 그렇게 나타났다. (bucketname.us-west-2.amazonaws.com 처럼)
열심히 찾아보고 코드를 비교하던중 amazonS3Client() 리턴값을 'AmazonS3Client' 로 변경하였고 기적처럼 내가 설정한 리전으로 링크가 나타났다.
위의 문제들을 해결하고 어느정도 프로젝트 개발이 진행되었다. Github Actions와 AWS Codedeploy를 이용한 CI/CD를 구축했기에 이제 빌드파일을 옮겨 백그라운드에서 실행한 후 탄력적 IP를 통해 접근하는 일만 남았었다.
그렇게 쉽게 풀리는 줄 알았다.
아무리 "탄력적IP:8080/swagger-ui/index.html#/" 를 쳐도 해당 링크로 접근이 되지 않았다.
nohup 으로 백그라운드에서 .jar 파일을 실행시켜두고,
ps -ef | grep java 해서 백그라운드에서 jar 파일이 실행중임을 확인하고,
curl http://localhost:8080/swagger-ui/index.html#/ 를 실행하면 응답값도 잘 나왔다.
근데 왜 ..........
AWS의 보안그룹-인바운드 규칙도 사용자 지정 tcp 8080 모두 열어두었다 .... 근데 왜 ....
$ sudo apt-get install ufw
$ sudo ufw enable
/* 방화벽 포트 허용 */
$ sudo ufw allow 8080
ufw 명령어를 이용해 8080 포트 방화벽을 열어준다.
이 모든 과정을 거쳐 미국 동부에 올라간 myEc2가 완성되었다. 근데 문제는 또 있었다. 진짜 조금만 에러나면 팡팡 터져버리는 나의 myEc2 ..
매번 폭탄 맞는 ec2가 안타까워 살릴 수 있는 방법을 찾아보았다.
AWS 프리티어의 경우 RAM이 1GB 이기 때문에 툭하면 매번 다운되었다.
SWAP Space를 이용해 사용되지 않는 RAM의 page들을 저장해준다.
SWAP Space 에 대한 이론적 설명은 추후에 추가하겠다.
free
sudo dd if=/dev/zero of=/swapfile bs=128M count=16
sudo chdmod 666 / swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
sudo swapon -s
sudo vi/etc/fstab
/swapfile swap swap defaults 0 0
free