2015.07.30 09:29

홍콩과기대에서 full support 받으며 6개월간 연구하기

제가 일하는 홍콩과기대는 국제적인 연구 교류를 장려하기 위해 외국학생들을 방문 연구원으로 3개월에서 6개월간 초청하는 프로그램이 있습니다. 방문 기간동안 대략 매달 9000~12000HKD (135만원에서 180만원)을 지원하여 홍콩에서의 숙소비용과 생활비를 지원합니다. 


대부분의 홍콩 (컴퓨터공학)연구실에는 과제가 없기 때문에 방문하시는 기간동안 본인이 하고 싶은 연구에 올인할수 있도록 도와줍니다.


홍콩의 가을/겨울 날씨는 정말 좋기 (18도 정도의 기온) 때문에 방문하신다면 가급적 10월 부터 2월 정도가 좋습니다. (지금이 방문을 신청하기 적절한 시기 입니다.)


대상은 현재 학부 4학년이나 또는 대학원 학생이며, 지원 방법은 관심이 있는 연구실 교수에게 직접 이메일을 보내시면 됩니다. 소프트웨어분야 관심이 있으신 분들은 김성훈 <hunkim@gmail.com> 으로 연락 주시면 됩니다.


멋진 연구환경 외에도 바닷가가 보이는 조깅 트랙, 50M 야외 수영장, 그리고 산과 바다로 둘러쌓인 학교에서 새로운 추억을 만드실수 있을 것입니다. 많은 지원을 부탁드립니다. 



저작자 표시 비영리 변경 금지
신고
트랙백이 없고 댓글이 하나 달렸습니다
  1. simonk 2016.12.18 18:37 신고 address edit & del reply

    홍콩과기대에서 빅데이타를 이용하여
    연구프로젝트 진행가능한지 궁금합니다 김교수님 저는 컴퓨터공학전공은 아니지만~ 경영학 박사과정 휴학중입니다

2015.07.26 08:35

9년이 지난후 Defect prediction 2.0

2006년 Adaptive Bug Prediction By Analyzing Software History 이라는 이름으로 박사논문 발표를 했었는데, 9년이 지난 2015년, 저희 연구실 남재창 박사가 Defect prediction 연구를 한수준 끌어 올리며 박사 defence 를 했습니다. Defect prediction 2.0 이라 불러 줄만 합니다. 그동안 관련 연구를 하면서 소프트웨어 공학 최고 수준인 FSE에 3개, ICSE 2개, ASE에 하나 논문을 발표하고 졸업을 합니다. SIGSOFT 논문상을 1회 수상했고, 한번은 후보에 들어 이 연구들이 얼마나 멋진 것인지 보여 줍니다.


  1. Micro Interaction Metrics for Defect Prediction@FSE`11, Taek Lee, Jaechang Nam, Donggyun Han, Sunghun Kim and Hoh Peter In
  2. Transfer Defect Learning@ICSE`13, Jaechang Nam, Sinno Jialin Pan and Sunghun Kim, Nominee, ACM SIGSOFT Distinguished Paper Award
  3. Heterogeneous Defect Prediction@FSE`15, Jaechang Nam ann Sunghun Kim
  4. REMI: Defect Prediction for Efficient API Testing@FSE`15, Mijung Kim, Jaechang Nam, Jaehyuk Yeon, Soonhwang Choi, and Sunghun Kim, Industrial Track
  5. CLAMI: Defect Prediction on Unlabeled Datasets@ASE`15, Jaechang Nam and Sunghun Kim
  6. Automatic Patch Generation Learned from Human-written Patches@ICSE`13, Dongsun Kim, Jaechang Nam, Jaewoo Song and Sunghun Kim, ACM SIGSOFT Distinguished Paper Award Winner

남재창 박사는 캐나다 최고 연구 대학인 워털루에서, 떠오르는 별인 Lin Tan교수님과 함께 포닥으로 몇년 연구하고, 곧 멋진 교수님이 될 예정입니다. 


아래 남재창 박사의 슬라이드 입니다.



제가 발표한 2006년 발표한 박사 연구 결과에 비해 한단계 높은 수준임을 보실수 있습니다.



혹시 소프트웨어 공학연구에 관심이 있으시면서 defect prediction 3.0의 연구를 주도하실분있으시면 김성훈 <hunkim@gmail.com>으로 연락해 보시기 바랍니다.

저작자 표시 비영리 변경 금지
신고
트랙백이 없고 Comment 2
  1. 2015.08.18 01:59 address edit & del reply

    비밀댓글입니다

    • HannaKim 2015.08.19 16:06 신고 address edit & del

      오타 알려 주셔서 감사합니다. 수정하였습니다.

2015.07.19 18:50

버그 추측 (Defect Prediction) 실무에서 도움이 될까요?

Defect Prediction은 소프트웨에 공학 분야에서 많이 연구 되고 있는 분야이며 요즈음 기계학습이나 Big data를 기반으로 하는 많은 분석 기법이 나오고 이를 응용하여 매우 정확도가 높게 버그를 추측할수 있습니다. 


다만 통계적인 기법에 기반을 두다 보니 정확히 어디 줄에 버그가 있는지, 또 왜 버그인지를 설명하기 어려운 부분이 있습니다. 그래서 많은 연구자들은 "Defect prediction is a good research topic, but maybe not practical in practice." 한마디로 이쪽 분야 연구자들에게는 좀 김 빠지는 이야기입니다.


그런데 이번 저의 연구실과 삼성소프트웨어 연구실이 공동으로 작업하여 defect prediction이 실제 개발에서도 도움이 된다는 것을 보여준것입니다. 이 예측된 버그의 결과를 이용하여 어떤 API를 더 테스트 해야 할것인가의 우선 순위를 정했는데 아주 효과적으로 API에 있는 버그를 찾아낸 것입니다.


아래 간략하게 저희들이 제안한 것을 보여 줍니다.




더 자세한 것은 http://hunkim.cse.ust.hk/papers/kim-REMI(industry)-fse2015.pdf 에서 보실수 있으시며 저희 연구실의 최신 연구결과는 http://hunkim.cse.ust.hk/ 에서 많이 보실수 있습니다.


또 함께 이런 연구를 할 좋은 분들을 계속 초빙하고 있습니다.

저작자 표시 비영리 변경 금지
신고
트랙백이 없고 댓글이 없습니다.
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> 님에게 배운 것입니다.)

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


티스토리 툴바