2018년 11월 10일 토요일

AWS beanstalk 사용기

새로운 프로젝트에서 서버개발 및 인프라를 담당하게 되면서 배포 및 서비스 운영에 대해 생각을 하다가 마침 관심있게 생각하는 AWS 서비스 중에 beanstalk이 있어서 사용해보면 좋을것 같다라는 생각에 도입을 하게 되었고, 도입할때 tutorial을 통해서 테스트 및 서비스를 배포해보면서 발생한 문제점 및 pre-requirement 에 대해서 적을까 합니다.


해야 했던 일


  • database setting
  • setup security
  • consider scaleable service
  • setup ec2 instance for service
  • setup load balancer
  • management deploy
  • setup log system


이거 하려면 ec2를 세팅해야하고, 
load balancer도 세팅해야하고 vpc도 만들어야 하고, 
매핑도 시켜야하고 scaling도 공부해야하고, 
매핑도 해봐야하고, 
상태체크 및 log system도 구축해야하고… 
너무 귀찮고 힘들고, 
처음해보는거라 실수라도 생기면… 나 막 그렇게 부지런한 개발자가 아니라서 ㅠㅠ 귀찮은데 누가 해줬으면 좋겠어.!!


beanstalk을 선택한 이유


  • security, scaling, log system 등을 한번에 관리할수 있다.
  • automatically setting security
  • sample command method
  • 귀찮거나 사람이 실수할수 있는 문제를 자동으로 세팅해줌.


방법은 amazon documentation site에 있는 beanstalk 에 있는 tutorial을 따라서 진행을 하였습니다. 

한국어로 되어있는 문서도 있었는데, 영어로 하면 좀 더 자세히 되어 있을까봐 영어문서를 보고 했습니다. (영어공부도 해볼 겸 …)
일단 tutorial을 따라 적는건 의미가 없을것 으로 판단해서 제가 진행하면서 막혔던 부분과 어떻게 해결했는지 해결 방법에 대해 적을까 합니다.
사실 documentation에 적혀있었을수도 있는데 제가 꼼꼼하지 못해서 못 읽었을수도 있어요.


git push 시에 Access deny Error


  • deploy시에 AWS에 세팅되어있는 code-commit에 있는 repository 서비스를 기준으로 그 안에 있는 code를 기준으로 deploy를 실행합니다.
  • code commit의 access token 및 credential은 AWS IAM 에서 관리합니다.
처음 deploy시 샘플 데이터 빼고 할 경우에
eb init 이란 메소드를 통해서 초기에 configuration을 구성할텐데 그때 codecommit 사용할꺼니? 
라는 문구가 나오고 사용하겠다고 하면 해당 코드가 올라가도록 되어 있습니다. 
그리고 나서 git push 명령어를 진행할 경우 id, password를 한번 더 치라고 나오는데 이때 “어 나 github쪽은 저장이 되어있는데 한번더 물어보네?” 라고 생각하고 똑같은걸 쳤는데,
왠걸 Access deny가 리턴되는겁니다. 
뭐지 하고 당황하고 code commit을 찾아보니깐. 
code commit의 경우는 AWS에 있는 source control servicecredentialAWS IAM를 통해서 따로 연결을 해줘야하더라구요. 이걸통해 나온 credential을 입력하면 push가 가능해집니다.
code commit을 사용안할경우 압축파일(tar, tar.gz)을 로컬에 만들어서 업로드 하는 방식도 지원합니다.
IAM 에서 git credential 만드는건 https://docs.aws.amazon.com/codecommit/latest/userguide/setting-up-gc.html 통해서 확인 가능합니다.


Service name validation at eb create command


간단한 건데 elasticbeanstalk 사용해서 application 만들 경우에 최소 글자가 4글자라서 생각없이 dev로 할 경우, 더 좋은 이름을 생각해야하는 경우가 생기므로 초반에 고려하면 좋을것 같네요.


Module not found when after deployed:


node.js 플랫폼을 사용해서 eb deploy 시에 elasticbeanstalk에서는 production 모드로 package가 설치가 됩니다. 그래서 혹시라도 dev 환경에서 사용하는것이 있으면 package가 설치가 되지 않아서 deploy가 잘 되지 않을수 있으니 유의하시면 좋을것 같습니다. 저 같은 경우에는 babel을 사용 했었는데요. deploy시에 babel-compile을 실행해서 es6 문법을 기본으로 변경하는 작업 후에 서버를 재 시작하는 방식으로 deploy가 진행되었는데, 그때 babel package가 devDependency에 들어가 있어서 배포가 되지 않는 문제가 있었습니다.
deploy시에 push할때 compile 된 데이터를 push하고 deploy시에는 그냥 바로 run server를 해도 되었는데, 그렇게 되니 eb deploy시에 tar.gz파일을 s3에 저장하는데 이때 업로드하는 파일의 용량이 커서 deploy에 시간소요가 좀 발생하였습니다. 그래서 저는 deploy시에 compile 과정까지 포함해서 진행하였습니다. 추후에 이런 문제로 메모리가 부족해지면 그때는 s3에 compile 완료된 데이터를 추가하는 방식 하거나 babel 사용을 지향할것 같네요.


&&를 사용해서 deploy시에 여러개의 command 실행할 경우 되지 않는 문제.


저의 경우 deploy시에 babel코드를 compile하고 server를 restart하는 작업을 했었는데, 그래서 commnad에 && 명령어 를 써서 두가지를 한번에 돌게 세팅을 했는데, 적용이 안되더라구요. 제가 YAML에 대해서 잘 모르는 부분도 있었고, 별로 중요하게 생각하지 않아서 저는 package.json에 eb:start 라는 command를 만들어서 그 안에서 두가지의 작업을 한번에 처리하도록 수정하였습니다.
저는 이정도로 elasticbeanstalk를 사용해서 코드를 배포 작업을 했습니다.
이글을 통해 혹시라도 저처럼 똑같은 문제로 이슈를 발생하는 사람이 없었으면 좋겠습니다.


TIP:


  • node platform의 경우 default는 node: 4.5.1, npm: 6.14.3 입니다.


TODO:

  • shrinkwrap 적용하기

    • deploy시 마다 npm install을 하는 불필요한 작업을 방지하기 위해서 사용하는 package


  • docker로 서비스 구성하기.
    • 지금 사용하고있는 t2 instance은 제공하는 메모리가 너무 적어서 npm install과 compile시에 cpu가 간당간당한 이슈가 있어 docker로 배포하고 image만 변경하는 작업을 진행해 deploy속도를 개선할 생각입니다.

댓글 없음:

댓글 쓰기