땅굴파는이야기-AWS EC2 리전 설정 및 우분투 리눅스 SWAP 설정

정 승 연·2023년 3월 22일
1

땅굴파는 이야기

목록 보기
2/5

약 2주간 땅파며 얻은 이야기들


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 생성-리전 이슈

Ec2 생성 시 리전을 지정한다. 리전은 AWS 서비스들이 제공되는 서버의 물리적인 위치를 의미한다.

내가 서비스 하려는 지역의 주 고객들이 사용하는 지역과 서버의 거리가 멀면 멀수록 느려진다.
( 따라서 서울 유저인데 미국 리전으로 서버를 구축하면 안된다. ㅋ ㅋ)

그리고 다음 글에 따라 Ec2를 생성한다.

해결?

AWS S3-리전 이슈2

@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() 리턴값을 'AmazonS3Client' 로 변경하였고 기적처럼 내가 설정한 리전으로 링크가 나타났다.

해결

또 Ec2야?-방화벽이슈

위의 문제들을 해결하고 어느정도 프로젝트 개발이 진행되었다. 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 모두 열어두었다 .... 근데 왜 ....

  • 보안그룹 규칙
    아 그리고 어디서 80포트랑 8080포트가 같다고 들은것 같은데 .. 아니었다 ...

알았다. 리눅스의 방화벽.

$ sudo apt-get install ufw

$ sudo ufw enable

/* 방화벽 포트 허용 */
$ sudo ufw allow 8080

ufw 명령어를 이용해 8080 포트 방화벽을 열어준다.

해결

폭탄같은 EC2

이 모든 과정을 거쳐 미국 동부에 올라간 myEc2가 완성되었다. 근데 문제는 또 있었다. 진짜 조금만 에러나면 팡팡 터져버리는 나의 myEc2 ..

매번 폭탄 맞는 ec2가 안타까워 살릴 수 있는 방법을 찾아보았다.

알았다. Linux Ubuntu SWAP Space.

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

해결.

0개의 댓글