AutoScaling 시에 생성되는 EC2 인스턴스의 PHP 소스를 기존 EC2 인스턴스들과…

AutoScaling 시에 생성되는 EC2 인스턴스의 PHP 소스를 기존 EC2 인스턴스들과 동기화하기 위해,
S3 버킷에 PHP 소스를 저장하고 EC2 인스턴스에서 s3fs 로 마운트하여 사용하고 있습니다.
Launch Configuration 의 User data 에 사진1과 같이 스크립트를 적용하였습니다.

AutoScaling 이 되어 새로운 EC2 인스턴스가 생성되었고, HTTPD 스타트, TEST1 과 TEST2 디렉토리가 만들어져 있으므로 스크립트 실행이 되는 것은 확인하였습니다.
그런데, s3fs 명령어는 실행에 실패하여 s3mount 폴더가 비어있는 상태로 확인되었습니다. (사진2)
동일한 s3fs 명령어를 수동으로 실행하면 정상적으로 마운트가 됩니다.

질문 1) 스크립트의 결과 로그를 볼 수 있는 방법은 없나요? ( /var/log/httpd/error_log 에는 관련 내용 없음 )
또는 리눅스에서 발생한 모든 (아파치, 리눅스 자체, DB..) 에러 로그를 볼 수 있는 명령어나 매니지먼트 콘솔 위치를 알고 싶습니다.

질문 2) user-data 스크립트로 s3fs 명령을 자동수행하면 실패하는 이유는 무엇일까요?

질문 3) Autoscaling 으로 자동생성된 인스턴스에 소스파일을 항상 최신으로 유지할 수 있는 대중화된 다른 방법이 있는지요?
EC2 에 PHP 소스를 두고 AMI 를 매번 갱신하지 않고도 동기화를 유지할 수 있는 방법이 궁금합니다.

질문 4) 다른 방법중의 하나로, 스크립트에 “AMI 에 담겨있는 소스에서, 구동중인 EC2 인스턴스의 소스와 비교하여 추가/수정/삭제된 파일만 자동생성된 EC2 로 복사” 를
생각해볼 수 있는데 “업데이트된 PHP 소스” 를 추가/수정/삭제할 수 있는 방법이 있나요?
scp 명령어는 타겟 서버에서가 아니라 소스 서버에서만 복사가 가능하다고 알고 있습니다.

AutoScaling 시에 생성되는 EC2 인스턴스의 PHP 소스를 기존 EC2 인스턴스들과 동기화하기 위해,  
S3 버킷에 PHP 소스를 저장하고 EC2 인스턴스에서 s3fs 로 마운트하여 사용하고 있습니다.
Launch Configuration 의 User data 에 사진1과 같이 스크립트를 적용하였습니다.

AutoScaling 이 되어 새로운 EC2 인스턴스가 생성되었고, HTTPD 스타트, TEST1 과 TEST2 디렉토리가 만들어져 있으므로 스크립트 실행이 되는 것은 확인하였습니다.
그런데, s3fs 명령어는 실행에 실패하여 s3mount 폴더가 비어있는 상태로 확인되었습니다. (사진2)
동일한 s3fs 명령어를 수동으로 실행하면 정상적으로 마운트가 됩니다.

질문 1) 스크립트의 결과 로그를 볼 수 있는 방법은 없나요? ( /var/log/httpd/error_log 에는 관련 내용 없음 )
또는 리눅스에서 발생한 모든 (아파치, 리눅스 자체, DB..) 에러 로그를 볼 수 있는 명령어나 매니지먼트 콘솔 위치를 알고 싶습니다.

질문 2) user-data 스크립트로 s3fs 명령을 자동수행하면 실패하는 이유는 무엇일까요?

질문 3) Autoscaling 으로 자동생성된 인스턴스에 소스파일을 항상 최신으로 유지할 수 있는 대중화된 다른 방법이 있는지요?
EC2 에 PHP 소스를 두고 AMI 를 매번 갱신하지 않고도 동기화를 유지할 수 있는 방법이 궁금합니다.

질문 4) 다른 방법중의 하나로, 스크립트에

9 thoughts on “AutoScaling 시에 생성되는 EC2 인스턴스의 PHP 소스를 기존 EC2 인스턴스들과…

  1. 사실상 opsworks를 사용해서 userdata를 ec2에 직접 전달해보진 않았지만…
    1번의 질문은 아래 링크에서 해결법을 찾았습니다.

    내용에 따르면, 별도로 ec2 내 어딘가에 user-data script output이 나오진 않지만 나오게는 할 수 있을 것 같습니다.

    http://stackoverflow.com/questions/15904095/how-to-check-whether-my-user-data-passing-to-ec2-instance-working-or-not

    https://alestic.com/2010/12/ec2-user-data-output/

  2. 1번 내용에 이어, (아파치, 리눅스 자체, DB..) 등의 에러로그는 설정에 따라 각각 다르지 않을까요..? 해당 부분은 제 경험이 부족해 이해를 못한 것일 수도 있습니다.

  3. 3번 문제 OpsWorks를 써서 해결하고 있습니다.
    OpsWorks는 Chef solo기능을 포함한 관리형 서비스인데, chef recipe로 ‘Setup 주기(인스턴스 최초 기동)’에 배포되었어야 할 application이 배포되있는지 확인하고 없을 경우에 S3 스토리지에서 최신 빌드 바이너리(or 원하는 빌드)를 가져오도록 하였습니다.
    chef 경험이 있으시면 쉽게 사용하실 것 같고, 아니시더라도 AWS에서 사용할 경우 그렇게 어려운 솔루션은 아니라고 생각이 듭니다.
    위와 같이 할 경우, 특정 바이너리를 적용한 EC2 AMI를 매번 생성하지 않고, opsworks에서 Layer 단위(인스턴스 묶음)나 Stack 단위(Layer 묶음)로 관리가 가능합니다.
    추가로 OpsWorks를 이용하시면 Load-based로 Autoscaling 그룹 관리 및 모니터링이 한번에 가능한 장점도 있습니다.

  4. 4번 같은 경우는 (위 내용을 포함해서) 환경이 좀 다르긴 하지만, 유사하게 해결할 수 있을 것 같습니다.
    일단 저희는 : Java 및 Jsp, html 코드등 으로 구성되어 있는 환경입니다. php는 언어를 잘 몰라서 그러는데, Java처럼 빌드 후 바이너리가 나오는 방식인지, php 파일 자체가 빌드가 따로 없고, apache 서버가 바로 구동해주는 방식인지 모르겠습니다.

  5. 이어서…빌드 및 자동 반영 과정은 아래와 비슷합니다.

    – 개발자 소스커밋 to SVN or Git
    – Jenkins는 소스코드 repository에서 소스를 받아 빌드 및 테스트 후 s3에 전송. or (주기적으로 검사 후, revision 변경 시 자동 빌드 후 전송) (s3 전송 과정은 shell script로 aws cli를 섞어서 구현할 수 있습니다.)
    – AWS의 OpsWorks에서 최신 버전의 바이너리 (or 지정된 버전의 바이너리)를 수동으로 deploy 수행.
    deploy recipe 에는 Jenkins를 통해 S3에 업로드된 바이너리를 가져오도록 recipe 작성

  6. 3번질문에대해 답해드립니다
    현재 저희서비스는 기본적인 서버구성을 해서 AMI를 만들어두고
    최신소스는 항상 S3 버킷에 저장해둡니다
    ec2가 새로 launch되고나면 자동으로 s3의 소스랑 동기화합니다

    s3에 소스가들어있어서 새로 launch하는 서버는 항상 s3의 최신소스로 유지됩니다

  7. s3fs 문제 해결했습니다! 역시 path 설정이 문제였네요. 아마 user-data 명령들이 실행될때는 path 적용이 안된 상태인가봅니다. s3fs 명령어 윗 줄에 export PATH=”/usr/local/bin:$PATH” 를 추가해주니 잘 되네요~!

답글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.