2015.07.17 23:05

아마존 AWS로 안드로이드를 자동 빌드하고 테스트 하는 CI 설치해보자

아마존 AWS로 안드로이드를 자동 빌드하고 테스트 하는 CI 설치해보자


아래 3개의 문서를 참조하고 엄청난 실험으로….(거의 10시간 투자) 마침내 성공합니다. 생각보다 Android emulator 를 리눅스에 올리는 것이 쉽지 않네요.


기본 설치

0. AWS Instance

우선 하나의 Instance를 만들어야하는데 메모리는 2G 하드디스크는 반드시 30G를 선택 (Android SDK만 20G이상 필요).

(AWS를 잘 모르시면 제가 적은 AWS 관련 글 http://www.se.or.kr/category/%EC%95%84%EB%A7%88%EC%A1%B4%20%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4%20%28AWS%29 참조)


급하신 분들을 위해 아래 설정이 모두된 AWS 이미지 (AMI)를 공개합니다.

https://us-west-2.console.aws.amazon.com/ec2/v2/home?region=us-west-2#Images:visibility=public-images;imageId=ami-859496b5;sort=name



1. 오라클 자바 - Java (Oracle-java)

http://askubuntu.com/questions/521145/how-to-install-oracle-java-on-ubuntu-14-04

다른 자바는 중간에 이해할수 없는 에러가 발생하니 가급적 오라클자바 7/8이상 설치.


2. Android SDK 설치


(설치는 https://www.digitalocean.com/community/tutorials/how-to-build-android-apps-with-jenkins 참조)


cd ~

wget http://dl.google.com/android/android-sdk_r24.3.3-linux.tgz

tar xvfz android-sdk_r24.3.3-linux.tgz

cd android-sdk-linux/


Android를 위한 환경 설정


ubuntu@ip-172-31-19-3:~$ vi ~/.profile

--- Add this ---

export ANDROID_HOME="/home/ubuntu/android-sdk-linux"

export PATH="$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$PATH"

--- quit vi ---

ubuntu@ip-172-31-19-3:~$ source ~/.profile


android 명령실행 가능한지 간략 테스트후 실제 SDK와 Platform 설치.


-- 전체 다 설치: 가급적 이거 권장

android update sdk --no-ui


-- 리스트 보고 원하는 번호를 선택하여 설치

android list sdk --all


Packages available for installation or update: 151

  1- Android SDK Tools, revision 24.3.3

  2- Android SDK Platform-tools, revision 22

  3- Android SDK Platform-tools, revision 23 rc4

  4- Android SDK Build-tools, revision 23 rc3

  5- Android SDK Build-tools, revision 22.0.1



android update sdk -u --all --filter <number>

-- 예제

android update sdk -u --all --filter 5


24-28 (SDK Platform) 설치

1-5 (SDK Platform-tools/build-tools) 정도?


그러나 공간이 있다면 다 받아서 다양한 버전의 엡을 빌드하고 테스트 해보면 좋습니다.

skcpu1:hunkim:271> android update sdk --no-ui   (20G 이상의 공간 필요)


여기서 본인이 Ubuntu를 사용한다면 한가지 추가 설치.

https://developer.android.com/sdk/installing/index.html?pkg=tools


sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install libncurses5:i386 libstdc++6:i386 zlib1g:i386


3. Grandle: Android Studio에 기본 빌드프로그램


ubuntu@ip-172-31-19-3:~$ wget https://services.gradle.org/distributions/gradle-2.5-all.zip


[...] --- 설치


export PATH="/home/ubuntu/gradle-2.5/bin:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$PATH"git

ubuntu@ip-172-31-19-3:~$ gradle --version


------------------------------------------------------------

Gradle 2.5

------------------------------------------------------------


4. 나머지 git등 명령어 없다고 하는 것들 설치


잠시 쉬면서 중간 점검한번 해보고 가시겠습니다. 리눅스에서 내 안드로이드 코드 컴파일 될까요?

git clone …. --- 본인의 안드로이드 프로젝트

cd <project>

skcpu1:hunkim:271> gradle build


이때 문제 없이 컴파일 되어야 다음 단계로. 아님 이 문제를 해결하시고 다음 단계로… 이것 해보시고 안되면 android update sdk --no-ui 로 전 SDK설치.


Jenkins 로 넘어가자


1.  다운후 실행


buntu@ip-172-31-19-3:~$ cd ~

ubuntu@ip-172-31-19-3:~$ wget http://mirrors.jenkins-ci.org/war/latest/jenkins.war

ubuntu@ip-172-31-19-3:~$ java -jar -Xmx2g jenkins.war   -- 메모리는 2G정도



2. 브라우즈로 접속: 8080

대략 아래와 같이 보이면 일단 성공.


3. 플러그인 설치


Manage Jenkins 를 설정한다음 아래 3개의 플러그인을  설치


[Android Emulator]

[Gradle build]

[Git]

설치한후 안전하게 Jenkins를 다시 시작


잡 추가하기


이름을 주고 자유형식의 프로젝트로 설정



깃 저장소 잡아주고


Android emulator 를 시작하기 선택한 다음 ABI는 반드시 ameabi-v7a 를 선택




마지막으로 Gradle 설정. 본인 설정에 맞게. 이 예제에서는 clean build로



빌드하고 결과보기

아래 Build Now 를 선택.


그런다음 잽싸게 Console Output을 보면서… 잘안되면 여기서 힌트를 얻어 많이 얻을수 있으므로 유심히 보고 문제를 해결하다보면...


아래와 같이 성공!





Emulator로 테스트 돌리기

이 복잡한 Android SDK와 emulator를 설치한것은 바로 instrumentation base의 테스트를 하기 위함입니다. gradle의 자동 task인 connectedAndroidTest를 build에 넣어주면 됩니다.  즉 emulator랑 연결하여 시험하는 것입니다. 멋지죠? (테스트 하나가 실패해도 다른 테스및 작업을 계속하기 위해 --continue를 반드시 넣어 줍니다.) Wrapper를 사용하고 check 박스 클릭한거 참고 하세요.


그런후 다시 빌드해보면 아래와 같이 여러개의 테스트가 실패했다는 요약하여 보여 줍니다.


Jenkins Android 플러그인은 아쉽게도 테스트 결과 html을 보여주진 않네요. (플러그인 업그레이드 필요).  이렇게 되면 계속적인 빌드 실패로 날씨가 비가 오게 됩니다.

빨리 테스트를 수정하고 다시 push 해서 해뜨게 합시다! 몇번 빌드 성공하니 이제 날씨가 좋아 집니다.


하드 이미지 공유?

AWS 의 AMI로 다음의 이름으로 공유됩니다.


https://us-west-2.console.aws.amazon.com/ec2/v2/home?region=us-west-2#Images:visibility=public-images;imageId=ami-859496b5;sort=name


받아서 instance를 만드신 다음 jenkins만 돌리고 해당 호스트 8080으로 접속하면 끝!

문제해결


파일을 못찾음? 이상하게 파일이 있는데 파일이 없다는 에러

hudson_en-AU_160_QVGA_android-16_x86 -t android-16 --abi x86

$ /var/lib/jenkins/tools/android-sdk/platform-tools/adb start-server

FATAL: Cannot run program "/var/lib/jenkins/tools/android-sdk/platform-tools/adb": error=2, No such file or directory

java.io.IOException: Cannot run program "/var/lib/jenkins/tools/android-sdk/platform-tools/adb": error=2, No such file or directory


…. 혹 유분투? 그럼 lib32설치?

sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install libncurses5:i386 libstdc++6:i386 zlib1g:i386




KVM?


android] Starting Android emulator

$ /var/lib/jenkins/tools/android-sdk/tools/emulator -ports 6410,6411 -prop persist.sys.language=en -prop persist.sys.country=AU -avd hudson_en-AU_160_QVGA_android-16 -no-snapshot-load -no-snapshot-save -no-window

emulator: ERROR: x86 emulation currently requires hardware acceleration!

Please ensure KVM is properly installed and usable.

CPU acceleration status: KVM is not installed on this machine (/dev/kvm is missing).



AVI를 설정하지 않거나 x86계열로 주면 KVM필요. 본인 서버면 설치가능하지만 아쉽게도 AWS는 이미 가상화가 되어 있어 KVM을 설치해도 활성화 되지 않는다.

http://askubuntu.com/questions/564910/kvm-is-not-installed-on-this-machine-dev-kvm-is-missing


ubuntu@ip-172-31-47-206:~$ sudo kvm-ok

INFO: Your CPU does not support KVM extensions

KVM acceleration can NOT be used


KVM is not possible on EC2!

http://stackoverflow.com/questions/14193821/run-kvm-on-top-of-amazon-ec2-possible


그럼 어떻게? ARM EABI v7a 로 지정!


/tmp/and---/xxxxxx File exists: 파일이 분명히 없는데 있다고하거나 파일을 만들수 없다고 할때. 이것은 공간 부족으로 생기는 일. /tmp에 최소 1G정도의 공간이 필요.


$ /homes/hunkim/jenkins/android-sdk-linux/tools/emulator -ports 6415,6416 -prop persist.sys.language=en -prop persist.sys.country=AU -avd hudson_en-AU_160_WQVGA_android-19_armeabi-v7a -no-snapshot-load -no-snapshot-save -no-window
NAND: could not write file /tmp/android-hunkim/emulator-OlrGzz, Connection refused


abi 타입: 필자가 가장 많이 본 에러… Android OS version을 바꿔가며 맞는 조합을 찾아봄. commend라인에서 미리 테스트 해보면 좋음

[android] /homes/hunkim/jenkins/android-sdk-linux/tools/android create avd -f -a -s WQVGA400 -n hudson_en-AU_160_WQVGA_android-19_armeabi -t android-19 --abi armeabi
Error: Invalid --abi armeabi for the selected target.



오래된 라이버러리: 업데이트. AWS 를 사용하면 최신으로 업되어 있어 이런문제 없슴

$ /homes/hunkim/jenkins/android-sdk-linux/platform-tools/adb kill-server
/homes/hunkim/jenkins/android-sdk-linux/platform-tools/adb: /lib/libc.so.6: version `GLIBC_2.7' not found (required by /homes/hunkim/jenkins/android-sdk-linux/platform-tools/adb)
Finished: NOT_BUILT


저작자 표시 비영리 변경 금지
신고
트랙백이 없고 댓글이 없습니다.
2015.07.06 18:09

AWS S3 [3] Git으로 AWS S3에 Git Push 해보자

이제 AWS S3버킷도 만들었고, aws command line으로 쉽게 sync하는 방법도 알아 보았습니다.


그런데 요즈음 웹개발은 보통 git등을 사용하여 많이 하는데 본인의 git workspace에서 작업하다가 commit한다음 test등을 마치고 모든 것이 보기 좋으면 “git push s3” 같은 명령으로 한번에 aws s3에 엡데이트된 파일을 올릴수 있다면 정말 편할 것입니다.


아래와 같은 구성으로 가능합니다. (1) 우선 로컬에 git으로 개발을 하고 있다고 가정합니다. git 업데이트를 push할수 있는 (2) remote repository를 하나 만듭니다. (2) repository는 같은 로컬에 있어도 되고 본인의 다른 서버여도 됩니다만, (2) 에는 반드시 aws가 설치 되어 있어야 합니다.



  1. git workspace: 다른 remote에서 clone을 받을수도 있도 아니면 시작해볼수도 있습니다. 여기서는 간단하게 시작해봅니다.


$ mkdir website && cd website

$ git init

Initialized empty Git repository in /home/ams/website/.git/

$ echo 'Hello, world!' > index.html

$ git add index.html

$ git commit -q -m "The humble beginnings of my web site."


  1. remote를 하나 만듭니다. 이 예제에서는 aws client command 가 설치 되어 있는 local에 만들어 줍니다.


Macintosh-2:gitworkspace hunkim$ mkdir website_s3.git && cd website_s3.git/

Macintosh-2:website_s3.git hunkim$ git init --bare

Initialized empty Git repository in /Users/hunkim/gitworkspace/website_s3.git/.git/

Macintosh-2:website_s3.git hunkim$ mkdir checkoutdir/  -- remote 에 content를 담을 곧을 만듭니다.


그런다음 (2) repository에 아래와 같은 hook을 하나 만들어 줍니다.


Macintosh-2:website_s3.git hunkim$ vi hooks/post-receive


-----

#!/bin/sh

S3_BUCKET=hunkimweb   -- 본인의 S3 bucket 이름

WORK_TREE=/Users/hunkim/gitworkspace/website_s3.git/checkoutdir   -- content 가 담긴 디렉토리


GIT_WORK_TREE=$WORK_TREE git checkout -f              -- check out 실행

aws s3 sync $WORK_TREE s3://$S3_BUCKET/ --delete     -- s3 sync 및 없어진 파일은 삭제

-----


Macintosh-2:website_s3.git hunkim$ chmod +x hooks/post-receive --- hook이 실행가능한 모드로



다시 (1) repository (workspace) 로 돌아 와서 설정해놓은 (2)를 remote로 간단하게 추가 합니다.


git remote add s3 file:////Users/hunkim/gitworkspace/website_s3.git

git push s3 +master:refs/heads/master


그럼 설정끝. 쉽게  원하시는 파일을 workspace에서 추가/수정하신 다음 git commit, 그리고 마음에 드시면 git push s3 하시면 바로 AWS S3에 업됩니다.


아래 간단한 예를 보실수 있습니다.

Macintosh-2:website hunkim$ pwd

/Users/hunkim/gitworkspace/website

Macintosh-2:website hunkim$ vi index.html


-----

Hello, world!

Test4

-----

Macintosh-2:website hunkim$ git commit index.html -m"updated"

[master 65d72cb] updated

1 file changed, 1 insertion(+), 1 deletion(-)


Macintosh-2:website hunkim$ git push s3

Counting objects: 5, done.

Writing objects: 100% (3/3), 259 bytes | 0 bytes/s, done.

Total 3 (delta 0), reused 0 (delta 0)

remote: upload: checkoutdir/index.html to s3://hunkimweb/index.html

To file:////Users/hunkim/gitworkspace/website_s3.git

  65d72cb..4f0dd15  master -> master


웹으로 접속해보면 수정된 내용이 업되어 있음을 볼수 있습니다.

이미 사용중인 git이 있다면 역시 마찬가지로 사용가능합니다. 우선 clone을 합니다. 그런다음 remote를 위와 같이 설정/추가 한다음 push 하시면 됩니다.



--- cloning

Macintosh-2:gitworkspace hunkim$ git clone https://github.com/hunkim/homepage.git homepage

Cloning into 'homepage'...

remote: Counting objects: 396, done.

remote: Compressing objects: 100% (310/310), done.

remote: Total 396 (delta 38), reused 396 (delta 38), pack-reused 0

Receiving objects: 100% (396/396), 41.37 MiB | 2.90 MiB/s, done.

Resolving deltas: 100% (38/38), done.

Checking connectivity... done


-- workspace로 들어 갑니다.

Macintosh-2:gitworkspace hunkim$ cd homepage


-- Remote 를 추가 합니다.

Macintosh-2:homepage hunkim$ git remote add s3 file:////Users/hunkim/gitworkspace/website_s3.git


-- push 합니다.

Macintosh-2:homepage hunkim$ git push s3 +master:refs/heads/master

Counting objects: 396, done.

Delta compression using up to 4 threads.

Compressing objects: 100% (310/310), done.

Writing objects: 100% (396/396), 41.37 MiB | 75.51 MiB/s, done.

Total 396 (delta 38), reused 396 (delta 38)

remote: upload: checkoutdir/Software.html to s3://hunkimweb/Software.html

remote: upload: checkoutdir/README.md to s3://hunkimweb/README.md

[...]


To file:////Users/hunkim/gitworkspace/website_s3.git

+ 7f275f6...1da0548 master -> master (forced update)


아주 잘 된듯합니다. AWS S3로 들어가면 저의 멋진 홈페이지가 그대로 보입니다. 이제 수정과 업은 (git commit/git push s3)로 매우 쉽게 가능합니다. commit된 파일을 github로 push하시려면 “git push origin” 하셔야 합니다.


AWS S3 시리즈 다른글

  1. AWS 콘솔에서 S3로 공간 (bucket)을 만들고 호스팅 하는 방법을 살펴 보고

  2. aws command line으로 S3 공간을 업데이트 하는 방법

  3. 마지막으로 git 으로 S3 공간에 push 하는 방법.

(이글에 나오는 AWS관련 지식은 Amazon Web Services Korea 테크에반젤리스트 윤석찬 <channy@creation.net> 님에게 배운 것입니다.)


저작자 표시 비영리 변경 금지
신고
트랙백이 없고 댓글이 없습니다.
2015.07.06 18:08

AWS S3 [2] bucket을 command line으로 쉽게 관리하기

이전 글에서 간단하게 AWS S3 버킷을 만들고 웹호스팅 모드로 운영해 보았습니다. 그러나 항상 웹으로 파일을 업데이트 해야 한다면 정말 불편합니다. 아마존에서는 aws라는 커멘드 라인을 지원하는데 이를 이용하면 조금더 편리하게 파일을 업데이트 할수 있습니다.

AWS S3 bucket을 command line으로 쉽게 관리하기  

본인의 컴퓨터에 일단 aws command line 을 설치해봅니다. http://aws.amazon.com/cli/ 가시면 자세한 정보가 나오는데 일단 Mac의 경우 python 과 pip설치.

python 은 그냥 다운 받아서 (Mac에) 쉽게 설치.

pip는 https://pip.pypa.io/en/latest/installing.html#install-pip 에서 파일을 다운 받은 다음



python 으로 명령을 실행.


Macintosh-2:~ hunkim$ sudo python ~/Downloads/get-pip.py

Password:

[...]

https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.

 Downloading pip-7.1.0-py2.py3-none-any.whl (1.1MB)

   100% |████████████████████████████████| 1.1MB 361kB/s

Collecting wheel

 Downloading wheel-0.24.0-py2.py3-none-any.whl (63kB)

   100% |████████████████████████████████| 65kB 840kB/s

Installing collected packages: pip, wheel

Successfully installed pip-7.1.0 wheel-0.24.0



그런다음 pip를 이용 awscli (aws command line)를 설치합니다.

Macintosh-2:~ hunkim$ sudo pip install awscli

[...]

Successfully installed awscli-1.7.36 botocore-1.0.1 colorama-0.3.3 docutils-0.12 jmespath-0.7.1 pyasn1-0.1.8 python-dateutil-2.4.2 rsa-3.1.4 six-1.9.0



그러면 aws라는 명령을 사용할수 있는데 우선 본인의 Access/Security Key를 등록을 해야 합니다.


이 키를 얻기 위해서는 콘솔로 들어가서 본인의 Security Credentials 를 선택합니다.




이 키를 가지고 있으면 새로운 instance를 만들거나 돌릴수 있으므로 정말 주의 해야 합니다. 절대 다른 분들과 공유해서는 안됩니다. 이에 대한 주의 화면이 나옵니다.


그럼 “aws configure” 라는 명령으로 key를 입력합니다.


Macintosh-2:~ hunkim$ aws configure

AWS Access Key ID [None]: AKIAJN2MELXXXXXXX

AWS Secret Access Key [None]: gkL6oQHQgAj61CsuqglOci1RXXXXXXXXXX

Default region name [None]:

Default output format [None]:


aws s3 sync <src> <desc> 이렇게 명령을 주면 되는데 로컬의 경우 디렉토리 이름을, s3의 경우 s3://<bucket name>을 주면 됩니다. 아래와 같이 이 명령이 잘 되는지 테스트 해보겠습니다.


Macintosh-2:web hunkim$ mkdir /tmp/web && cd /tmp/web

Macintosh-2:web hunkim$  echo "<html>Hello</html>" > index.html  -- 간단한 html만듬

Macintosh-2:web hunkim$ aws s3 sync ./ s3://hunkimweb     --- 현재 디렉토리 파일을 s3로 올림

upload: ./index.html to s3://hunkimweb/index.html                  --- 성공!


그럼 이제 웹으로 s3 공간을 연결해 봅니다. 파일이 성공적으로 업데이트 되었음을 볼수 있습니다.


AWS S3 시리즈 다른글

  1. AWS 콘솔에서 S3로 공간 (bucket)을 만들고 호스팅 하는 방법을 살펴 보고

  2. aws command line으로 S3 공간을 업데이트 하는 방법

  3. 마지막으로 git 으로 S3 공간에 push 하는 방법을 알아 봅니다.


(
이글에 나오는 AWS관련 지식은 Amazon Web Services Korea 테크에반젤리스트 윤석찬 <channy@creation.net> 님에게 배운 것입니다.)


저작자 표시 비영리 변경 금지
신고
트랙백이 없고 댓글이 없습니다.
2015.07.06 18:06

AWS S3 [1] 정적 content들을 위한 AWS S3 에 공간 (bucket)을 마련하기

AWS S3는 정적인 페이지를 호스트하기에 매우 좋습니다. 별도로 autoscaling 할 필요도 없이 AWS S3의 빵빵한 서버들이 지켜주기 때문이죠. 특히 요즈음 대세인 MEAN (http://mean.io/#!/, MongoDB, ExpressJS, AngularJS and NodeJS) 등으로 서비스를 한다면 LAMP (Linux, Apache, MySQL and PHP) 와는 달리 별도로 서버를 운영하실 필요가 전혀 없습니다.


이 AWS S3 시리즈는

  1. AWS 콘솔에서 S3로 공간 (bucket)을 만들고 호스팅 하는 방법을 살펴 보고

  2. aws command line으로 S3 공간을 업데이트 하는 방법

  3. 마지막으로 git 으로 S3 공간에 push 하는 방법을 알아 봅니다.


자 시작합니다.

정적 content들을 위한 AWS S3 에 공간 (bucket)을 마련하기



가서 Create Bucket을 누르면 됩니다.




이름만 정해 주시면 됩니다. 저같은 경우 hunkimweb이라는 이름으로 버켓을 만들었습니다.


여기에 2가지 세팅만 더하시면 됩니다. 우선 Permissions를 열어 다른 사람들이 본인이 올린 object를 읽을수 있도록 해줘야 합니다. Permissions를 선택한 다음 Add bucket policy 를 선택



그러면 공허한 화면이 열리면서 다량의 입력을 기다립니다.


이게 좀 복잡한데 AWS예제 (http://docs.aws.amazon.com/AmazonS3/latest/dev/example-bucket-policies.html#example-bucket-policies-use-case-2) 를 그대로 사용합니다. 아래 빨간 부분에 본인의 버킷 이름을 적어 주시면 됩니다.


저같은 경우 아래와 같이 사용.


{

"Version": "2012-10-17",

"Statement": [

{

"Sid": "AddPerm",

"Effect": "Allow",

"Principal": "*",

"Action": [

"s3:GetObject"

],

"Resource": [

"arn:aws:s3:::hunkimweb/*"

]

}

]

}






두번째는 static web hosting 을 활성화 하고 index.html이 default로 나올수 있도록 설정합니다.


Endpoint: hunkimweb.s3-website-us-west-2.amazonaws.com 가 바로 웹페이지 주소. 브라우즈를 열어 접속해봅니다.



아직 올린 파일이 없으므로 예상한것 처럼 404 Not Found (index.html)이 나옵니다. 파일을 올리시려면 버킷을 선택하신다음 Upload를 눌러 웹 인터페이스를 통해 파일을 올릴수 있습니다. 아래와 같이 index.html을 올릴수 있습니다.


(이글에 나오는 AWS관련 지식은 Amazon Web Services Korea 테크에반젤리스트 윤석찬 <channy@creation.net> 님에게 배운 것입니다.)

저작자 표시 비영리 변경 금지
신고
트랙백이 없고 댓글이 없습니다.
2015.07.02 08:36

AWS05 - 클라우드 서버들이 부하에 따라 자동으로 많아 졌다 작아 졌다 (auto scaling)

앞단의 서버랑 뒷쪽 DB를 분리해보고, 앞단의 여러대 서버까지 늘인다음 Load Balancing 까지! 이만하면 앞단에 있는 몇대의 서버는 충분히 멋져 보이지만 예상치 못한 사용자의 폭증을 처리하기에는 안심할수 있을까 걱정될수도 있습니다. 만약 서버들의 부하에 따라 자동으로 서버들이 추가로 붙고, 서버가 필요없을때 자동으로 줄어 든다면 (Auto scaling) 정말 멋지겠죠? (많은 등록 웹사이트들이 등록시에 서버가 폭주되는데, 이런 서비스를 사용하면 폭주 문제가 없어 질수 있습니다.)


이 Auto scaling 기능은 AWS에서 매우 쉽게 구축할수 있습니다.  “AWS와 함께 확장성 높은 천만 사용자 웹 서비스 만들기, http://www.slideshare.net/awskorea/your-first-10-million-users-channy” 45 페이지에 나오는 이런 구성입니다.



AWS01 - 12개월간 무료로 클라우드 연결된 서버를 돌려보자 (EC2),  AWS02 - 클라우드에 DBMS를 연결 (AWS RDS),  AWS03 - 앞단의 클라우드 서버를 N대로 늘려보자, AWS04 - 클라우드 서버들을 묶어 Load Balancing하자 를 통해 아래와 같이 시스템이 구성되어 있고 이 두 서버가 Load Balancing 중이라고 가정합니다.



오토 스케일링 실행 환경  


우선 EC2 Dashboard에가서 하단부에 있는 Auto Scaling Groups를 선택합니다. 그럼 처음에는 그룹이 없으니 만들라고 합니다.




“Create Auto Scaling group” 버턴을 눌러줍니다.


우선 어떤 구성으로 자동 스케일링을 할것인지 이미지등 환경을 설정합니다. 즉 부하가 높아져 서버가 새로 필요할때 어떤 환경의 서버를 추가 할것인가를 결정합니다. 그런다음 두번째 구체적인 스케일링 (인스턴스) 그룹을 지정해 주면 됩니다.


서버가 자동으로 추가 될때 어떤 환경으로, 어떤 프로그램을 돌릴것인가에 이미 만들어 놓은 이미지를 선택할수 있습니다. 이 이미지는 서버를 돌리기 위한 OS와 필요한 프로그램등이 다 설치 되어있어야 겠지요? 이 예에서는 LMAP가 설치 되어 있고 사용자 count하는 index.php가 설치 되어 있는 서버에서 만들어 놓은 이미지를 선택합니다.



그런 다음 추가할 서버의 물리적 사양을 결정 해줍니다.


이 설정을 뭐라 부르면 좋을까요? 이름을 지정합니다.

저장공간은 기본 설정으로 갑니다.


Security group은 http가 연결되도록 열려있는 기존의 그룹을 선정해줍니다.


최종 점검후 이 설정을 생성합니다. 어떤 키로 접속할까 물어 봅니다. 한번 만들어 둔 키는 정말 중요합니다. (다른 사람들과 절대 공유하지 말고 잘 보관하시길…)



오토 스케일링 그룹 생성

방금 생성한 환경으로 그룹을 결성해 봅니다. 처음에는 하나의  instances로 시작.

그런다음 최소, 최대 몇대까지 돌릴것인지 어느 정도의 부하가 많이 걸리면 동시에 몇대씩 추가 할것인지 결정합니다.



이때 execution policy 라는 이름으로 어떤 조건에서 하나의 서버를 추가하거나 삭제할것인지. 예를 들어 CPU의 평균 부하가 90%이상을 5분 이상 유지하면 자동으로 서버를 하나 더 추가하라고 지정할수 있습니다. 비슷한 방법으로 부하가 50% 이하면 서버를 하나 삭제하라고 지정할수 있습니다.



다음은 서버가 추가 되고 삭제될때 이 상황에 대해 이메일로 정보를 받을수 있도록 설정합니다.

마지막으로 이 그룹 설정을 다시한번 확인.


좋아 보이니 “ Create Auto Scaling Group”을 눌러 줍니다. 그러면 금방 생성 완료를 알리는 화면이 나옵니다.


그룹이 잘 생성되었습니다. 이 그룹에 대한 자세한 정보를 봅니다. 이 그룹도 Public DNS등의 전체 그룹의 연결방법을 알려 줄것으로 예상했는데 그런것이 없습니다. 어쩌지?


자세히 보니 Load Balancers를 연결할수 있는데 (설정시 왜 안물어 봤는지 모르겠습니다.) 이전에 만들어 놓은 hunkim balancer를 이 그룹과 연결해 봅니다.



Edit 버턴을 누르면 바로 추가 가능

이미 설정된 hunkim이 리스트에 있습니다. 편안한 마음으로 추가후 저장. 아래와 같이 잘 저장되었습니다.



이때 살짝 Load Balances에 가보면 hunkim에 서버가 3대로 늘어난 것을 알수 있습니다. 미리 설정해놓은 2대와 이번에 auto scaling으로 들어간 1대, 이렇게 해서 3대가 된것 같습니다.




우선 주어진 Load Balancer의 DNS Name 으로 접속해봅니다. 여러번 reload 하다 보면 3대의 서버를 다 볼수 있습니다.



처음 한대로 시작하는 방법으로 auto-scaling 하고 싶으면 이 Load Balancer에 등록된 다른 서버들을 빼고 auto-scaling으로 생성된 한대만 남겨두면 될것입니다.



오토 스케일링 그룹 잘되나?


잘 되는지 테스를 해봅니다. 일단 부하를 엄청 걸어 보면서 테스트를 할수도 있도, 서버를 한대 더 추가하는 부하의 기준을 낮게하면서 서버가 생성되는지 불수도 있습니다. 이 예에서는 테스트를 위해 새로운 서버를 추가하는 부하의 조건을 매우 낮게 해줍니다. (CPU > 0.1 보다 크면 생성되도록)



그런다음 이 서버로 접속을 시도하면 부하가 조금 올라가 금방 instance의 갯수가 지정해놓은 최고의 서버인 5대로 올라가는 것을 볼수 있습니다.


다시 정상으로 세팅을 아래와 같이 돌려 (CPU 부하 10% 이하면 서버 삭제, 90% 이상이면 서버 추가) 놓고 천천이 기다려 보면



자동으로 instance가 삭제되고 있는 모습이 보입니다.

이제 3개로 줄고...


마지막으로 최소의 서버인 하나로 줄어 들었습니다. 잘 됩니다.

이메일 alert 설정으로 서버 추가/삭제시 이메일로 정보를 보내 주는데 무슨 내용인지 알아보기 힘들게 옵니다. :-) 추후 AWS 팀의 작업이 필요해 보입니다.


모든것이 잘되고 참 보기 좋은 설정입니다.

AWS 기본 시리즈

  1. AWS01 - 12개월간 무료로 클라우드 연결된 서버를 돌려보자 (EC2).

  2. AWS02 - 클라우드에 DBMS를 연결 (AWS RDS)

  3. AWS03 - 앞단의 클라우드 서버를 N대로 늘려보자.

  4. AWS04 - 클라우드 서버들을 묶어 Load Balancing하자.

  5. AWS05 - 클라우드 서버가 부하에 따라 자동으로 추가/삭제 (auto scaling)



(
이글에 나오는 AWS관련 지식은 Amazon Web Services Korea 테크에반젤리스트 윤석찬 <channy@creation.net> 님에게 배운 것입니다.)

저작자 표시 비영리 변경 금지
신고
트랙백이 없고 댓글이 없습니다.
2015.07.02 08:33

AWS04 - 클라우드 서버들을 묶어 Load Balancing하자

앞단의 서버랑 뒷쪽 DB까지 분리해보고, 앞단의 여러대 서버까지 늘여 보았습니다. 이제 이들을 하나의 서비스 (URL)로 묶고 사용자들이 이중 더 여유가 있는 서버로 자동 연결되도록 (Load Balancing) 해봅니다.


“AWS와 함께 확장성 높은 천만 사용자 웹 서비스 만들기, http://www.slideshare.net/awskorea/your-first-10-million-users-channy” 33 페이지에 나오는 구성입니다.


AWS01 - 12개월간 무료로 클라우드 연결된 서버를 돌려보자 (EC2),  AWS02 - 클라우드에 DBMS를 연결 (AWS RDS), 와 AWS03 - 앞단의 클라우드 서버를 N대로 늘려보자 를 통해 아래와 같이 시스템이 구성되어 있다고 가정합니다.



두개의 서버가 카운터 db는 공유하지만 호스트 이름이 다르다는 것을 확인할수 있습니다.


로드 벨런싱 생성  


우선 EC2 Dashboard에가서 Load Balancers를 선택합니다.




여기서 “Create Load Balancer”를 선택합니다. 대부분 기본 설정으로 가면 됩니다. 이 예제에서는 웹 서비스를 여러 서버에서 공유하는 것이라 HTTP에 관한 포트 설정만 하면 됩니다.



다음은 Security Group 설정. 이 security group은 http가 열려있는 그룹으로 반드시 선택하거나 설정을해야 외부에서 웹접속이 됩니다.



HTTPS등에 대한 이야기가 나오는데 일단은 pass.

서버의 건전성 확인하는 설정도 기본으로 해둡니다.

그리고 Load Balancer에 추가할 instance들을 선택합니다. 여기서 우리는 이미 만들어 놓은 두개의 instance를 모두 선택합니다. 다른 존에 포함된 instance들 간에도 Load Balancing 이 가능하네요. 멋집니다.






마지막으로 테그 부분은 pass. 끝으로 설정을 살표본후 Load Balancer를 생성시킵니다.



아래와 같이 생성에 성공했다는 이야기가 나옵니다.


생성된 Balancer의 자세한 정보를 봅니다.


이중 가장 중요한 것은 DNS Name 으로 이 경우 hunkim-104723420.us-west-2.elb.amazonaws.com

로 주어집니다. 이것이 바로 웹주소. 일단 웹으로 접속해 봅니다.


이 주소로 연결하면 예상한것 처럼 172-31-19-88 서버와 172-31-26-143에 교차로 연결됩니다. 설정이 잘 되었습니다.


필요할 경우 본인이 가지고 있는 도메인 이름의 DNS CNAME등의 설정으로 hunkim-104723420.us-west-2.elb.amazonaws.com 이름을 짧게 (hunkim.noip.me 등) 이용할수 있습니다.


AWS 기본 시리즈

  1. AWS01 - 12개월간 무료로 클라우드 연결된 서버를 돌려보자 (EC2).

  2. AWS02 - 클라우드에 DBMS를 연결 (AWS RDS)

  3. AWS03 - 앞단의 클라우드 서버를 N대로 늘려보자.

  4. AWS04 - 클라우드 서버들을 묶어 Load Balancing하자.

  5. AWS05 - 클라우드 서버가 부하에 따라 자동으로 추가/삭제 (auto scaling)


(이글에 나오는 AWS관련 지식은 Amazon Web Services Korea 테크에반젤리스트 윤석찬 <channy@creation.net> 님에게 배운 것입니다.)

저작자 표시 비영리 변경 금지
신고
트랙백이 없고 댓글이 없습니다.
2015.07.02 08:31

AWS03 - 앞단의 클라우드 서버를 N대로 늘려보자.

앞단의 서버랑 뒷쪽 DB까지 분리해보았는데 이번에는 앞단의 EC2 서버를 늘려 봅시다.

“AWS와 함께 확장성 높은 천만 사용자 웹 서비스 만들기, http://www.slideshare.net/awskorea/your-first-10-million-users-channy” 23 페이지에 나오는 이런 형식입니다.


AWS01 - 12개월간 무료로 클라우드 연결된 서버를 돌려보자 (EC2)AWS02 - 클라우드에 DBMS를 연결 (AWS RDS) 를 통해 아래와 같이 시스템이 구성되어 있다고 가정합니다.



이미지 만들기


새로운 instance에 LAMP를 비롯하여 새로 설치와 설정을 하면 되지만 이 작업은 번거럽기 때문에 바로 이미지를 만들어 옮기는 것이 좋습니다. 기존의 instance를 선택한다음 Actions/Image/Create Image를 선택합니다.


이미지의 이름을 정하고 나머지는 기본으로 하여 이미지를 만듭니다.


성공적으로 이미지가 만들어 졌습니다.

이미지로 인스턴스 만들기  

EC2 Dashboard에 가서 Images 밑 AIMs 를 선택합니다.  



여기 메뉴 Actions/Launch 를 선택하여 이 이미지를 가지고 새로운 instance를 만듭니다.


그러면 바로 instance를 설정하는 메뉴로 가게 됩니다.

바로 Review and Launch로 이동합니다. 여기서 Security group만 기존의 EC2가 사용하고 있는 것으로 지정을 하고 나머지는 기본값으로 설정합니다.



한가지더, 어떻게 서버로 접속할것 인지 물어 봅니다. 이전에 서버를 위해 만들고 다운 받아 두었던 키를 그대로 사용합니다.


그러면 성공적으로 새로운 instance가 생겼습니다.


3. [새 인스턴스 바로 시험]

이미지를 그대로 복사했기 때문에 아마 LAMP를 비롯 우리가 이전에 만들어준 index.php도 있기 때문에 바로 접속해 봅니다. 우선 Public DNS ec2-52-25-8-206.us-west-2.compute.amazonaws.com 를 확인합니다.



예상했던 대로 잘됩니다.

4. [index.php에 호스트 이름 추가]

어떤 호스트가 연결되는지 보기 위해 visitor count 에 추가로 호스트 이름을 보여주도록 해봅니다.



Macintosh-2:website hunkim$ ssh ubuntu@ec2-52-25-8-206.us-west-2.compute.amazonaws.com  -- 같은 key를 사용하여 로그인


--- 서버에 접속

ubuntu@ip-172-31-26-143:~$ vi /var/www/html/index.php

echo "<P>My hostname is " . gethostname();  -- 한줄 넣어 줍니다.



서버가 2개라 다른 서버에도 들어가서 소스를 고쳐야 합니다. (뭔가 이건 아닌듯: http://www.se.or.kr/145 의 git 사용방법 참조) 그러나 예제에서는 그냥 간단하게 고쳐봅니다.



Macintosh-2:~ hunkim$ ssh ubuntu@hunkim.noip.me


ubuntu@ip-172-31-19-88:~$ vi /var/www/html/index.php

echo "<P>My hostname is " . gethostname();  -- 한줄 넣어 줍니다.


예상대로 두개의 서버가 같은 일을 하지만 호스트 이름이 다릅니다.

아래과 같이 구성이 완료 되었습니다.


필요하면 같은 방법으로 서버를 3대, 4대, 더 많이 늘려갈수 있습니다.


AWS 기본 시리즈

  1. AWS01 - 12개월간 무료로 클라우드 연결된 서버를 돌려보자 (EC2).

  2. AWS02 - 클라우드에 DBMS를 연결 (AWS RDS)

  3. AWS03 - 앞단의 클라우드 서버를 N대로 늘려보자.

  4. AWS04 - 클라우드 서버들을 묶어 Load Balancing하자.

  5. AWS05 - 클라우드 서버가 부하에 따라 자동으로 추가/삭제 (auto scaling)


(이글에 나오는 AWS관련 지식은 Amazon Web Services Korea 테크에반젤리스트 윤석찬 <channy@creation.net> 님에게 배운 것입니다.)

저작자 표시 비영리 변경 금지
신고
트랙백이 없고 댓글이 없습니다.
2015.07.01 17:43

AWS02 - 클라우드에 DBMS를 연결 (AWS RDS)


이번에는 AWS의 별도 DB서비스인 RDS를 통해 DB서버를 분리해내는 방법을 알아 봅니다. 더 확장성 있는 서비스가 가능하겠죠? “AWS와 함께 확장성 높은 천만 사용자 웹 서비스 만들기, http://www.slideshare.net/awskorea/your-first-10-million-users-channy” 26 페이지에 나오는 이런 형식입니다.


AWS01 - 12개월간 무료로 클라우드 연결된 서버를 돌려보자 (EC2) 를 통해 아래와 같이 ssh로 서버 접근이 가능하고 간단한 index.php를 만들었다고 가정합니다.


local $ ssh ubuntu@hunkim.noip.me          -- ubuntu 사용자 이름 주의  

The authenticity of host 'hunkim.noip.me (52.27.17.52)' can't be established.

RSA key fingerprint is ce:3b:b5:f6:fb:e4:50:01:78:fe:d0:ac:c3:1e:bc:67.

Are you sure you want to continue connecting (yes/no)?    --- 이 서버가 맞는지 확인. yes 를 입력

ubuntu@ip-172-31-19-88:~$ cd /var/www/html

ubuntu@ip-172-31-19-88:/var/www/html$ sudo vi index.php

ubuntu@ip-172-31-19-88:/var/www/html$ cat index.php

<html>

<head>

 <title>PHP Test</title>

</head>

<body>

<?php echo '<p>Hello World</p>'; ?>

</body>

</html>



아래와 같이 Hello World를 보셔야 합니다.


로컬 DB돌리기


이전에 설치한 LAMP에 포함된 Local MySQL을 사용해봅니다. 간단한 예제로 DB를 사용하여 visitor count를 보여주는 프로그램을 PHP로 만들어 보겠습니다. (http://www.webexpertlabs.com/visitor-counter-using-php-mysql/)


  1. [DB 설정]

간단하게 mysql 에 root로 로그인 하고 (LAMP설치할때 비번 기억) database와 table을 만들고 사용자 (dbuser) 를 하나 만들어 이 database에 권한을 주도록 해봅니다. 이 사용자 아이디를 php에서 사용하도록 합니다. (root는 소중하니까.)


Macintosh-2:~ hunkim$ ssh ubuntu@hunkim.noip.me    -- 일단 서버로 ssh


---  이제부터 서버에서 돌아 갑니다.


ubuntu@ip-172-31-19-88:~$ mysql -u root -p  Enter password: ****

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 44

Server version: 5.5.43-0ubuntu0.14.04.1 (Ubuntu)

[...]

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.


mysql> create DATABASE phpdb;

Query OK, 1 row affected (0.00 sec)


mysql> use phpdb;

Database changed


--- 아래 Table을 만들어 줍니다. (http://www.webexpertlabs.com/visitor-counter-using-php-mysql/)


mysql> CREATE TABLE `tb_counter` (

   -> `counter` INT( 11 ) NOT NULL AUTO_INCREMENT ,

   -> PRIMARY KEY ( `counter` )

   -> ) ENGINE = MYISAM ;

Query OK, 0 rows affected (0.01 sec)


mysql> CREATE USER 'dbuser'@'%' IDENTIFIED BY '*****';    --- dbuser 아이디를 생성

Query OK, 0 rows affected (0.00 sec)                                          --- ***** 부분이 비밀번호


mysql> GRANT ALL PRIVILEGES ON phpdb.* TO 'dbuser'@'%' WITH GRANT OPTION;

Query OK, 0 rows affected (0.00 sec)                  --- dbuser에게 phpdb 의 모든 table 권한을 줌


그런 다음 dbuser로 접속해서 잘 되는지 시험해봅니다.


ubuntu@ip-172-31-19-88:~$ mysql -u dbuser -p

Enter password: ***

Welcome to the MySQL monitor.  Commands end with ; or \g.

[...]

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.


mysql> use phpdb;


Database changed


mysql> show tables;

+-----------------+

| Tables_in_phpdb |

+-----------------+

| tb_counter      |

+-----------------+

1 row in set (0.00 sec)


mysql> select * from tb_counter;

Empty set (0.00 sec)


잘 되는듯 합니다.


2. [PHP 프로그래밍] 간단한 counting (http://www.webexpertlabs.com/visitor-counter-using-php-mysql/)



ubuntu@ip-172-31-19-88:/var/www/html$ vi index.php

<?php

/* define your data connection here*/

define("hostname","YOUR HOST NAME HERE");

define("username","YOUR DATABASE USERNAME HERE");

define("password","YOUR DATABASE PASSWORD HERE");

define("database","YOUR DATABASE NAME HERE");

//syntax used for mysql connection

mysql_connect(hostname,username,password) or die(mysql_error());

//syntax used for selecting database

mysql_select_db(database)or die(mysql_error());


$counter='';//initilize counter

$sql="SELECT counter FROM tb_counter";

$result=mysql_query($sql);

$rows=mysql_fetch_assoc($result);

$counter=$rows['counter'];


// if count is empty

if(empty($counter)){

$counter=1;

$insertCounter="INSERT INTO tb_counter set counter='".$counter."'";

$result1=mysql_query($insertCounter);

}


echo "You are visitor num=>". $counter;


// increment visitor count

$increasecounter=$counter+1;

$sql2="update tb_counter set counter='".$increasecounter."'";

$result2=mysql_query($sql2);

?>



(참고: 위 db 접속 정보부분은 다른 파일, 즉 config.php등으로 분리하신 다음 /var/www/html 바깥에 두어 웹으로 이 파일이 직접 접근이 안되게 한다음 index.php에서 include 하시는 것이 보안상 좋습니다. 이글의 예제에서는 간단하게 하기 위해 그냥 index.php에 포함.) db 접속 정보를 이런 형식으로 고쳐 줍니다.


3. [웹 브라우징] 이제 웹브라우즈로 접속해 봅니다. refresh를 여러번 눌렀더니 3번이나 방문한 것으로...

DBMS도 당연 update 되었겠지만 한번더 확인해 봅니다.


mysql> select * from tb_counter;

+---------+

| counter |

+---------+

|       4 |

+---------+

1 row in set (0.00 sec)


모든것이 잘 되었군요.

AWS RDS로 DB 분리해보기

이제 DB 서버를 따로 분리해보록 합니다. (주의: 지금부터는 별도의 AWS 서버를 사용하므로 일부 과금이 될수 있습니다.) http://aws.amazon.com/ko/free/ 참고: “Amazon RDS 단일 AZ 마이크로 DB 인스턴스 750시간 무료 사용.” 즉 한대의 RDS를 계속 돌릴경우 한달간 무료로 사용가능합니다.


위 그림처럼 한대의 EC2에 다 들어 있는 것에서 확장성을 위해 DB 서버를 분리하는 것입니다.


  1. [RDS] 만들기 - AWS 콘솔에 들어간다음 Database 섹션에 있는 RDS를 선택



아래와 같이 빨리 시작해보라는 화면이 나옵니다.



우선 DB engine으로는 MySQL을 선택하고 (또는 본인의 기호에 맞는 엔진 선택)



이 RDS를 production에 사용할것인지를 물어 봅니다. 이 옵션에는 두가지가 있는데 Multi-AZ deployment는 아마존이 가지고 있는 각각의 데이터 센터에 DBMS의 복사본을 두어서 접속 속도를 빠르게 한다는 것입니다. 추가로 IOPS라는 빠른 속도의 디스크를 사용합니다.


우린 EC2가 하나 (한지역)에 있기때문에 그냥 No를 선택합니다.




다음은 DB서버의 사양과 zone, 데이터의 용량을 선택합니다. 대략 아래와 같이



추가로 DB instance의 이름과 관리자 아이디/비번을 설정합니다.


마지막으로 넷트웍과 보안관련 설정인데 Security group을 만들고 어느 컴퓨터에서 이 DBMS로 접속이 가능할지를 설정해야 합니다. 중요!


추가로 백업 주기와 MySQL의 업데이트를 자동으로 할것인지 선택.

그런다음 Launch를 누르시면 됩니다. (선택사항 많네요.)


그럼 초록색으로 잘 되었음을 알리고 우리의 DB instance를 보실수 있습니다.



아래처럼 인스턴스를 볼수 있는데 이때 중요한거 2가지. Endpoint: DB 서버 주소 와 security group: 접속 보안 설정



우선 Security Group의 rds….어쩌구를 click하여 Inbound를 설정해봅니다.




모든 곳에서 접속되도록 완전 열어도 되고, 우리 같은 경우 EC2에서만 사용할 예정이므로 EC2의 private IP를 사용해서 이곳에서만 접속 되도록 해도 됩니다. (반드시 private ip 사용, public ip는 서버를 재가동시키면 바뀝니다.)



EC2의 dashboard에서 private IP를 찾아 볼수 있습니다. 추후 EC2 instance가 많아 지면 각각에 대해 룰을 여러개 추가 하면 됩니다.



다른 더 좋은 방법으로는 같은 Security groups를 사용하는 모든 서버에서 접속 가능하게 할수 있는데 EC2 서버들이 많고 이들이 같은 Security group을 사용한다면 매우 유용한 설정 방법입니다. 다시 한번 EC2 Dashboard에서 우리 instance를 보도록 합시다. Security groups에 ssh+http 를 사용하는데 이를 Inbound rule에 넣을수 있습니다.



설정을 위해 RDS의 Security group 으로 간다음



Inbound를 Edit 합니다. (또는 Rule추가) 여기에 EC2가 사용하는 Security group 이름을 입력하면 이렇게 선택할수 기존 security group의 이름이 보여져 쉽게 입력 가능하도록 도와 줍니다. 이렇게 하면 DB 서버를 ssh+http Security group을 사용하는 모든 EC2 서버에서 접속 가능합니다. 멋진 세팅이죠?



2. [RDS] DB연결 - 이제 RDS에 있는 Endpoint 의 주소로 접속이 가능합니다. (이주소도 엄청 길어요.)


길지만 접속을 시도...

Macintosh-2:~ hunkim$ mysql -h rds1.cqs7vyyg9qag.us-west-2.rds.amazonaws.com -uroot -p

Enter password: ****

ERROR 2003 (HY000): Can't connect to MySQL server on 'rds1.cqs7vyyg9qag.us-west-2.rds.amazonaws.com' (110)


그러나 이상하게 연결이 안됩니다. 왜 그럴까요? 역시 Inbound 설정이 잘 되었습니다. 오직 저의 EC2 서버에서만 접속 가능하게 설정이 되었으니까요. 일단 EC2 서버로 ssh한다음 DB연결해봅니다. 이제는 잘 되는 군요.


Macintosh-2:~ hunkim$ ssh ubuntu@hunkim.noip.me


-- ssh로 서버로 접속후

ubuntu@ip-172-31-19-88:~$ mysql -h rds1.cqs7vyyg9qag.us-west-2.rds.amazonaws.com -uroot -p

Enter password:

Welcome to the MySQL monitor.  Commands end with ; or \g.

[...]


Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.


mysql>



3. [MySQL Dump and Restore] 그럼 local의 데이타를 RDS 서버로 옮겨봅니다.


ubuntu@ip-172-31-19-88:~$ mysqldump -hlocalhost -uroot -p phpdb > /tmp/phpdb-database.sql                       -- phpdb를 dump


ubuntu@ip-172-31-19-88:~$ echo "create database phpdb" | mysql -hrds1.cqs7vyyg9qag.us-west-2.rds.amazonaws.com -uroot -p   -- phpdb 생성


ubuntu@ip-172-31-19-88:~$ mysql -hrds1.cqs7vyyg9qag.us-west-2.rds.amazonaws.com -uroot -p phpdb < /tmp/phpdb-database.sql   -- dump 된 sql load


--- 이전과 마찬 가지로 dbuser 아이디를 만들고 권한을 줌

mysql -hrds1.cqs7vyyg9qag.us-west-2.rds.amazonaws.com -uroot -p phpdb


mysql> CREATE USER 'dbuser'@'%' IDENTIFIED BY '*****';

Query OK, 0 rows affected (0.00 sec)


mysql> GRANT ALL PRIVILEGES ON phpdb.* TO 'dbuser'@'%' WITH GRANT OPTION;

Query OK, 0 rows affected (0.01 sec)


귀찮지만 마지막으로 dbuser로 로그인해 시험 해봄


ubuntu@ip-172-31-19-88:~$ mysql -hrds1.cqs7vyyg9qag.us-west-2.rds.amazonaws.com -udbuser -p phpdb

Enter password:

[...]


mysql> show tables;

+-----------------+

| Tables_in_phpdb |

+-----------------+

| tb_counter      |

+-----------------+

1 row in set (0.01 sec)

mysql> select * from tb_counter;

+---------+

| counter |

+---------+

|       4 |

+---------+

1 row in set (0.00 sec)


4. [PHP DB설정 고치기] 마지막으로 PHP가 RDS DB를 사용하도록 수정해줌.



5. [웹 브라우징] 마지막으로 웹으로 접속. 우선 확실히 하기 위해 local mysql을 중지시킨다.


ubuntu@ip-172-31-19-88:~$ sudo service mysql status

mysql start/running, process 8288


ubuntu@ip-172-31-19-88:~$ sudo service mysql stop

mysql stop/waiting


ubuntu@ip-172-31-19-88:~$ mysql -hlocalhost -udbuser -p

Enter password:

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)


그런다음 웹으로 마지막 확인. visitor count가 증가 된다. 7번이나 방문!

AWS 기본 시리즈

  1. AWS01 - 12개월간 무료로 클라우드 연결된 서버를 돌려보자 (EC2).

  2. AWS02 - 클라우드에 DBMS를 연결 (AWS RDS)

  3. AWS03 - 앞단의 클라우드 서버를 N대로 늘려보자.

  4. AWS04 - 클라우드 서버들을 묶어 Load Balancing하자.

  5. AWS05 - 클라우드 서버가 부하에 따라 자동으로 추가/삭제 (auto scaling)


(
이글에 나오는 AWS관련 지식은 Amazon Web Services Korea 테크에반젤리스트 윤석찬 <channy@creation.net> 님에게 배운 것입니다.)


저작자 표시 비영리 변경 금지
신고
트랙백이 없고 댓글이 없습니다.
2015.06.30 22:04

AWS01 - 12개월간 무료로 클라우드 연결된 서버를 돌려보자 (EC2)

“인터넷에 연결되지 않은 컴퓨터는 컴퓨터도 아니다.”


제가 막 인터넷을 접하기 시작했던 1995년 전후로 나왔던 이야기 인데 그때도 그랬지만 지금은 정말 더 공감됩니다. 인터넷 없는 컴퓨터로 무엇을 할수 있었을까요?


(조금 늦은감이 있지만) 이제

“클라우드에 연결되지 않은 서버는 서버도 아니다.”


라고 말할때가 된것 같습니다. 본인이 하드웨어나 소프트웨어 업데이트등 직접 관리하지 않아도 되는 그냥 서버에서 내가 하고 싶은 일에만 집중할수 있게 해주는, 그리고 필요하거나 사용자가 많을때 자동으로 늘어나서 서버 느리다는 소리 듣지 않아도 되는 그런 서버 말입니다.


제가 "깨비메일"이라는 서비스를 운영할때 가장 많은 시간을 투자한것이 서버 추가 구입과 설정이였습니다. 그러나 늘어가는 사용자들의 부하를 감당하지 못했고 한꺼번에 많은 서버를 구매할 비용이 없어서 (워낙 큰 투자라) 과감하게 늘리지 못한것이 "깨비메일"이 더 큰 성공을 하는 걸림돌이였습니다.


http://www.slideshare.net/awskorea/your-first-10-million-users-channy 


를 보니 매우 훌륭하더군요.

그때 이런 AWS같은 서비스가 있었다면 하는 생각을 할때가 있습니다.


서론이 길어졌는데 이런 시대에 클라우드에 연결된 서버를 한번 가져보는 것은 매우 의미 있는 일입니다. 클라우드에 연결된 서버를 가지고 여기에 흔하게 하는 LAMP (Linux, Apache, MySQL, and PHP) 한번 가져 봅시다. “AWS와 함께 확장성 높은 천만 사용자 웹 서비스 만들기” 21 페이지에 나오는 이런 형식입니다.


(AWS와 함께 확장성 높은 천만 사용자 웹 서비스 만들기 21 page)



12개월 무료로 서버하나를 돌릴수 있는 AWS로 바로 시작해봅니다.


...

계속 진행하여 가입을 합니다. 신용카드는 본인 확인용이므로 하나 입력. 사용한 만큼만 요금이 부과되고 우리는 12개월 무료 서버를 사용할 예정이므로 아마존에서 우리 돈을 꺼내가지는 않습니다.



성공하셨으리라 생각하고 이제 로그인 가능하다고 가정합니다.



항상 본인 이름 메뉴에 있는 금전관련 메뉴를 선택해 보는 습관을 가지는 것이 좋습니다. 이렇게 저처럼 0이 많을 수록 좋습니다. (첫 $1이 청구될때 alert을 받도록 설정도 가능하니 메뉴를 찾아 보세요.)



1부 서버 instance  만들기


로그인을 하면 상당히 많은 선택이 있지만 우리는 여기서 EC2에만 집중합니다.


대략 이런것이 보일텐데 “Launch Instance”를 눌러줍니다.



총 7단계가 있는데 ...


  1. 우선 처음 무슨 OS를 선택할것인가 물어 봅니다. 전 Ubuntu로 선택. (각자 기호에 따라 선택).



2. 다음은 사용할 서버의 사양을 물어 봅니다. 망설이지 말고 일단은 무료 (Free)를 선택해 줍니다.



3. 이 과정 설정은 너무 많고 어렵네요. 그냥 모두 기본값으로.


4. 하드디스크! 30G까지는 무료라고 하니 기분좋게 30G로 주욱~ 올립니다.



5. 인스턴스에 테그를 주는것 같은데 나중에 이것으로 관리 하려고 하는것 같지만 우리는 일단 하나니까 그냥 pass.


6. 가장 중요한 부분입니다. 이 서버를 어떻게 어디에서 접속가능하게 할것인가 설정합니다. 서버입장의 firewall을 설정한다 보면 됩니다.


Security group name에 의미 있는 이름을 주시고, “Add Rule”을 눌러 http를 아래와 같이 추가해줍니다. 0000이면 아무곳에서나 접속 가능. 나중에 이 서버에 다른 서비스를 추가 하려면 반드시 이 security group에 와서 Rule을 추가해야 합니다. 아니면 서버는 실행이 되지만 외부에서 연결이 되지 않습니다.



7. 마지막으로 한번더 설정을 보여 주고 확인 합니다.


여기 큰 박스로 ssh와 http로 외부에서 접속 가능한데 정말 괜찮겠냐고 물어 봅니다. ssh같은 경우 본인의 학교 서버나 집에서만 접속이 가능하도록 설정하는 것도 도움이 되겠습니다. http는 다 열어두어야 겠지요?


마지막으로 “Launch” 버턴을 눌러줍니다. 짜잔~~ 이라고 하려고 했는데 하나를 더 물어 봅니다.


8. 매우 중요! 이 서버 접속 어떻게 할래? 어떤 키를 사용할래? 아니면 새로운 키를 만들까?


여기에 의미 있는 키의 이름 (키 파일 이름)을 적고 키를 다운로드 합니다. 다운 받은 key (pem)는 이렇게 생겼습니다. (이 예제는 일부만 보여줌)



이 키는 정말 정말 잘 보관하여야 합니다. 다른 사람에게 보여주거나, 이메일로 보내거나, (실수로) github 같은데 올리면 큰일 납니다. 이 키만 있으면 비밀번호 없어 서버에 마음대로 들어 갈수 있으니 이 키를 잘 다운 받아 놓고 파일 이름 기억.


파일 다운로드가 끝나면 더디어 인스턴스를 시작할수 있습니다. 아래 “Launch Instances” 버턴을 한번더 눌러 줍니다.


그럼 성공을 암시하는 녹색 글이 많이 보이고 아래 참고할 문서들의 링크를 덤뿍 걸어 줍니다. (읽을 것이 너무 많네요.)

그럼 다시 EC2 데시보드로 가봅니다. 이전에는 0이던 것이 이제 1개씩 뭔가 돌고 있습니다.



Instances 메뉴를 선택해봅니다.


잘 돌고 있습니다. Instance ID의 번호를 선택해서 이 instance를 자세히 봅니다.


여기서 중요한 것은 Public DNS: ec2-52-27-17-52.us-west-2.compute.amazonaws.com

이름은 정말 길군요. 여기 어떻게 접속하지? 위에 있는 Connect란 버턴을 눌러 봅니다.



뭐 복잡하게 설명합니다.

한마디로 이전에 받은 키로 ubuntu 아이디로 그 서버에 접속하라는 것입니다. 이제 서버 준비 완료!


2부 서버 설정 시작


  1. [DNS] 우선 이 복잡한 이름좀 어떻게 해보죠.

ec2-52-27-17-52.us-west-2.compute.amazonaws.com

이건 암기나 타이핑 불가능! 여러분이 DNS를 가지고 있다면 CNAME 같은것으로 처리해줍니다. 아니면 간략한 호스트 이름을 주는 noip.com 같은 것을 이용해 짧은 이름을 지어 줍니다. (Public IP는 부팅시 바뀌기 때문에 반드시 이 이름을 사용.)


설정후 이제 hunkim.noip.me 로 EC2 서버 사용가능합니다.


2. [ssh-add] 키를 제 로컬 컴퓨터에 추가해봅니다.

ssh를 이용해 서버에 접속하면 되는데, 이때 위에서 다운 받은 키파일을 이용합니다. local$ 은 본인이 사용하고 있는 리눅스나 Mac이라 생각하시면 됩니다.


local $ chmod 400 hunkim-key.pem    -- 본인만 읽을수 있도록 권한 설정

local $ ssh-add hunkim-key.pem

Identity added: /Users/hunkim/Downloads/hunkim-key.pem (/Users/hunkim/Downloads/hunkim-key.pem)      


3. [server] 이제부터 서버에 접속해서 작업


local $ ssh ubuntu@hunkim.noip.me          -- ubuntu 사용자 이름 주의  

The authenticity of host 'hunkim.noip.me (52.27.17.52)' can't be established.

RSA key fingerprint is ce:3b:b5:f6:fb:e4:50:01:78:fe:d0:ac:c3:1e:bc:67.

Are you sure you want to continue connecting (yes/no)?    --- 이 서버가 맞는지 확인. yes 를 입력

ubuntu@ip-172-31-19-88:~$



4. [LAMP 설치] 하나의 명령으로 설치해봅니다.


ubuntu@ip-172-31-19-88:~$ sudo apt-get update   -- 우선 전반적으로 필요한 업데이트를 해줍니다.

ubuntu@ip-172-31-19-88:~$ sudo apt-get install lamp-server^    -- ^를 잊지마세요.


중간에 MySQL의 root 비밀번호를 설정합니다.   


그러면 놀랍게도 LAMP 설치가 완료 되었습니다.


5. [index.php] 그럼 index.php를 하나 만들어 봅시다. 웹 디렉토리는 /var/www/html 입니다.


ubuntu@ip-172-31-19-88:/var/www/html$ sudo vi index.php

ubuntu@ip-172-31-19-88:/var/www/html$ cat index.php

<html>

<head>

 <title>PHP Test</title>

</head>

<body>

<?php echo '<p>Hello World</p>'; ?>

</body>

</html>


6. [웹접속] 좋아 하는 브라우즈로 접속해 봅니다. 아래와 같이 Hello World가 뚜렷이 보인다면 성공!


AWS 기본 시리즈

  1. AWS01 - 12개월간 무료로 클라우드 연결된 서버를 돌려보자 (EC2).

  2. AWS02 - 클라우드에 DBMS를 연결 (AWS RDS)

  3. AWS03 - 앞단의 클라우드 서버를 N대로 늘려보자.

  4. AWS04 - 클라우드 서버들을 묶어 Load Balancing하자.

  5. AWS05 - 클라우드 서버가 부하에 따라 자동으로 추가/삭제 (auto scaling)


(
이글에 나오는 AWS관련 지식은 Amazon Web Services Korea 테크에반젤리스트 윤석찬 <channy@creation.net> 님에게 배운 것입니다.)

저작자 표시 비영리 변경 금지
신고
트랙백이 없고 댓글이 없습니다.


티스토리 툴바