AWS Chef ตอน 1 : เริ่มต้นกับ Amazon EC2 (สร้าง instance)

ผมได้เขียนบทความเกี่ยวกับการเริ่มสร้าง instance ไปแล้ว แต่ก็ค้างไว้ไม่ได้เขียนต่อจนจบ มาคราวนี้ ขอเริ่มใหม่อีกครั้ง แต่ด้วยอีกวิธีนึง ที่กำลังฮอตฮิตขึ้นมามากๆ ในช่วงนี้ ก็คือ การใช้ Automation Platform อย่างเช่น Chef มาช่วยในการติดตั้ง ตัว instance ของคุณ

แล้วการใช้ Chef มันดียังไง??? อย่างที่ชื่อมันก็บอกอยู่แล้วก็คือ Aumation Platform ซึ่งจะช่วยให้คุณ​ Automate ตัว instance ของคุณได้ด้วยในพริบตาเดียว (หลังจากเขียนโค้ด automate ตามใจคุณเองเสร็จ) จากเดิมที่คุณจะต้องนั่งรัน apt-get install นู่นนี่ (ลง apache, ruby, tomcat, etc..) แล้วต้องทำการสร้าง account, กำหนด config,​ และอื่นๆอีกมากมาย จะกลายไปเป็น Code ใน Chef Repository แค่อันเดียว ซึ่งคุณสามารถนำไปใช้กับกี่ instance กี่ครั้งก็ได้ instance ออกมาเหมือนเดิมเด๊ะๆ ไม่ต้องมาปวดหัวว่า ไอ้นั้นลืมเซต เอ้ย! ทำไมอันนี้ใช้ไม่ได้ (ลืม install บางอย่าง) นั้นเอง

ถ้าเข้าใจแล้ว ก็ ลองมาดูกันครับง่ายๆครับ ว่าเราจะสามารถสร้าง instance ได้อย่างไรด้วย Chef! ( ผมอ้างอิงจากเวบหลักของ Chef แต่พยายามมาแปลและเขียนให้เข้าใจง่ายกว่าครับ)

Requirements

  1. สมัคร AWS Account
  2. Prepare  Chef Workstation (ทำตามลิงค์เลยนะครับ จบแค่ขึ้น workstation setup ทำตามแบบ advanced นะครับ)
  3. สม้คร Hosted Chef Account
  4. มี github account (เราจะใช้เป็นตัวเก็บ code ของเรา)

Step

  1. ผมขอ assume ว่า เรามี AWS Account แล้ว และก็ได้ install chef workstation บนเครื่องของเราเสร็จแล้วนะครับ แต่จะอธิบายนิดนึงเกี่ยวกับ Hosted Chef และ หลักการคร่าวของ Chef
    หลักในการทำงานของ Chef นั้น จะประกอบด้วย 3 สิ่ง คือ

    1. Chef-Workstation ซึ่งในที่นี้คือเครื่องเราเอง ซึ่ง install knife tool (ซึ่งเป็น tool ที่ใช้ในการติดต่อ Chef-Server) และเป็น Workstation สำหรับใช้เขียน code และ execute สำหรับ chef
    2. Chef-Server เราสามารถตั้งของเราเองได้ แต่เพื่อความง่าย เราใช้ Hosted Chef ซึ่ง Opscode ให้ใช้ฟรี สำหรับขึ้น 5 nodes หรือ 5 clients แรก
    3. Chef-Client คือ node เป้าหมายที่เราต้องการจะรันตัวโค้ดของเรา
  2. เราต้อง Install Knife-EC2 Plugin นะครับ ตัว Knife คือ Commind Line Tool ของ Chef ที่ช่วยทำการติดต่อกับ Server ที่เก็บดาต้าของ Client หรือ node เป้าหมายของเรา และในขั้น Setup Chef Workstation เราจะได้ Knife มาเสร็จสรรพ แต่เนื่องจากเราจะใช้ Chef กับ AWS เราจึงต้อง install knife-ec2 plugin เพิ่มอีกนิดหน่อย ทำตามนี้ฮะ
    sudo gem install knife-ec2 --no-rdoc --no-ri
  3. Fork  chef-repo ของ opscode แล้ว clone ลง local machine ของเรา อย่างเช่น
    # Make chef workspace folder
    mkdir ~/Workspace
    cd Workspace
    # clone the forked repo
    git clone https://github.com/<your user>/chef-repo
    
  4. หลังจากนั้น เราจะเข้าไปที่ hosted chef เพื่อเอา settting ของ knife.rb เพื่อ access hosted chef account ของเรา มาใส่ใน folder .chef ใน repo ของเรา
    1. เริ่มจาก เข้าไปใน hosted chef  แล้วก็สร้าง organization แล้วเอา validation key (validation file .pem) และ​ knife config (knife.rb) มาเก็บไว้ ตัว validation key จะเป็นตัว key สำหรับ access hosted chef และ knife.rb คือ setting สำหรับ knife tool
    2. แล้วก็เอาตัวไฟล์ private key .pem ซึ่งเอาได้จากหน้า Profile–>Change password
    3. จากนั้นเอาไฟล์ทั้งสาม ใส่ลงไปใน .chef โฟลเดอร์ใน local repo ของเรา
      mkdir -p ~/Workspace/chef-repo/.chef
      mv <[organization validation key].pem file> ~/Workspace/chef-repo/.chef
      mv <knife.rb file> ~/Workspace/chef-repo/.chef
      mv <[private key].pem file> ~/Workspace/chef-repo/.chef
      
    4. check client_key กับ validation_client_name ใน knife.rb เป็นชื่อเดียวกับ [organization validation key] และ [private key] ที่เราเพิ่งได้มา
  5. แล้วก็เข้าไปเอา Access Keys สำหรับ access aws ด้วยใน Security Credentails ใน account ของเราเอง คลิ๊กไปที่ Access Keys แล้วสร้างอันใหม่แล้วจำ access key Id และ secret access key ไปใส่ใน knife.rb ดังนี้ พร้อมทั้งใส่ region และ availability ของ node ที่เราจะสร้างด้วย ของผม ap-northeast-1 คือ data center ใน Japan ถ้าใช้ใน US ก็จะเป็นชื่ออื่น
    vim ~/Workspace/chef-repo/.chef/knife.rb
    ######## Add following line to knife.rb #########
    knife[:region] = 'ap-northeast-1'
    knife[:availability_zone] = 'ap-northeast-1c'
    knife[:aws_access_key_id] = "Your AWS Access Key"
    knife[:aws_secret_access_key] = "Your AWS Secret Access Key"
    #################################################
    
  6. สุดท้าย สร้าง keypairs ซึ่งเป็นตัวที่ใช้ในการ access เข้า instance ของเรา บน aws
    1. เข้าไปที่ aws -> ec2 -> Key Pairs
    2. แล้วเลือก Create New Pair
    3. จากนั้น download .pem ไปใส่ไว้ใน ~/.ssh
    4. คอนเฟิร์มว่า ssh-agent บนเครื่องรันอยู่โดย
       exec ssh-agent $(which bash) 
    5. จากนั้นเปลี่ยน permission ของ keypairs ให้กลายเป็น readonly
       chmod 400 ~/.ssh/KEY_PAIR_NAME.pem
    6. จากนั้นใส่เข้าไปใน list ssh
       ssh-add ~/.ssh/KEY_PAIR_NAME.pem
    7. เพิ่มข้อมูลเข้าไปใน knife.rb (ไม่ต้องใส่ .pem เอาแค่ชื่อไฟล์เท่านั้น ดังตัวอย่างข้างล่าง)
      vim ~/Workspace/chef-repo/.chef/knife.rb
      ######## Add following line to knife.rb #########
      knife[:aws_ssh_key_id] = 'KEY_PAIR_NAME'
      #################################################
      
  7. จากนั้นก็เข้าไปใน AWS Management Console –> EC2 –> Security Groups เราจะเลือกใช้ default group ที่มีมาอยู่แล้ว (สามารถสร้างใหม่ได้ แต่ต้อง ไปกำหนดใน knife command เพิ่มตอนหลัง ด้วย -G option )
    define ssh inbound in aws

    1. คลิ๊กที่ default
    2. เลือก inbound tab
    3. แล้ว เลือก ssh และ source: เป็น 0.0.0.0/0 คือ ให้สามารถเปิดรับ ip จากทุกที่มา access ได้
    4. คลิ๊ก Add Rule แล้วก็ Apply Rule Change
  8. สุดท้าย เริ่ม bootstrap ec2 instance เริ่มสร้าง node ขึ้นมาเลย โดยเราสามารถเลือกได้ว่า จะเอา OS อะไรบ้าง โดย ไปเลือก ​ami id ใน aws website ควรพยายามเลือกอันนี้อัพเดทมากที่สุดของแต่ละ OS
    Screen Shot 2013-08-18 at 1.18.56 AMส่วนตัวผม ผมเลือก Ubuntu 12.10 พร้อมทั้งอยากใช้ instance ขนาดเล็กสุด t1.micro ของ aws ก็รัน command ดังนี้

     knife ec2 server create -I ami-137beb12 -x ubuntu -f t1.micro
  9. หลังจากรัน command ข้างต้น chef ก็จะเริ่มทำการสร้าง instance บน aws พร้อมกัน install ruby and chef-client ลงไป
  10. เราสามารถเชคได้ ว่าทุกอย่างเสร็จสมบูรณ์โดยดูเรียก ดฺู instance บน aws
     knife ec2 server list 

    Instance ID      Public IP        Private IP       Flavor           Image            SSH Key          Security Groups  State              

    i-XXXXXXXX       XXX.XXX.XXX.XXX    XXX.XXX.XXX.XXX   m1.small         ami-XXXXXXXX     KEY_PAIR_NAME     default          running
  11. และ เรียกดูว่า node ตัวนี้ ได้ register เข้าไปใน hosted chef แล้ว โดย
     knife node list 

เสร็จกันซักทีครับ กับการสร้าง Instance บน aws ด้วย chef ตอนต่อไปจะเป็นของจริง เราจะใช้ chef ในการติดตั้ง application, configuration หรือ setting อื่นๆที่เราต้องการกันครับ

Advertisements

4 responses to “AWS Chef ตอน 1 : เริ่มต้นกับ Amazon EC2 (สร้าง instance)

  1. ชอบ series นี้มากๆ ที่ผ่านมาเคยใช้แต่ chef-solo ถ้าต้องใช้ chef กับหลายเครื่องเมื่อไหร่ จะมาทำตาม blog นี้แหละ

    เพิ่มเติมนิดนึงจากต้นเรื่อง

    จุดเด่นของ tool อย่าง Puppet และ Chef ที่ทำให้แตกต่างจาก bash script ทั่วไปและ tool อย่าง capistrano และ fabric คือ มันมีการตรวจเช็ค state ก่อนทำงานแต่ละขั้น

    ตัวอย่าง เช่น สมมติเราบอกให้ chef ติดตั้ง ruby ถ้าระบบมี apache อยู่แล้ว มันก็จะไม่เสียเวลาติดตั้งซ้ำ แต่ถ้าเป็น bash หรือ capistrano,fabric มันจะไป compile ruby แล้วติดตั้งใหม่ทุกรอบที่เรารัน script

  2. แท้งกิ๊ว Tap 🙂
    เรื่องของ idempotence เราเข้าใจว่าก็ต้องขึ้นอยู่กับ cookbook และ resource ที่เขียนขึ้นด้วย ซึ่งใน chef ส่วนใหญ่จะ support เป็นพื้นฐานอยู่แล้ว แต่ Tool อื่นๆก็ทำได้ แต่ทำได้ยากกว่า
    ถ้าเทียบกับ bash ก็ชนะเห็น เพราะ มัน scalable กว่ามากๆ
    ถ้าเทียบกับ fabric, capistrano ก็เหมือนเป็น subset ของ chef กับ puppet เพราะ chef กับ puppet ทำอะไรได้เยอะกว่ามากๆ

    แล้วตอนนี้ใช้ chef-solo ทำไรหรอ น่าสนใจ ;p

    • เรื่อง idempotence นี้เราว่ามันเป็นสิ่งที่ cookbook ทุกอันจำเป็นต้องทำนะ เพราะปกติการทำงานของ chef server มันคือคอยรันเป็นระยะๆ เพื่อเช็ค state ของลูกๆ ป่ะ ถ้าเช็คที compile lib ทีก็ไม่ไหวอะ
      (เพิ่งเห็นว่าตัวอย่างที่ comment ไป ยกตัวอย่างปน Ruby กะ apache เหอะๆ มึนๆ)

      ตอนนี้ไม่ได้ใช้ chef-solo อะ แต่เคยใช้ช่วย setup server ใช้เองธรรมดาแหละ

      • อยากให้เป็น idempotence ให้หมดเหมือนกันนะ แต่บางอย่างมันก็ทำไม่ได้นะ ตอนนี้นึก case ไม่ออกเหมือนกัน แต่ก็เคยเจอปัญหาอยู่ แล้วก็การทำงานเป็นระยะๆเพื่อเชค state ลูก ไม่ใช่เป็นเรื่องปกติของ chef-server นะ เป็น option เสริมที่ใส่อีก cookbook ให้รัน update ด้วย sudo chef-client เป็นระยะๆ คิดว่าคงแอดลง cron มั้งนะ

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s