ELB 和 Auto Scaling 是構建高用性和可擴充套件性應用程式的核心服務。

ELB自動分配傳入的應用流量到多個目標,如EC2例項,可以跨多個可用區執行,提高應用程式的容錯能力。

Auto Scaling則可以根據需求自動調整EC2例項的數量,確保始終有適當數量的例項來處理應用程式負載。

這兩個服務結合使用時,可以實作真正的彈性架構:

  • 在流量增加時自動增加更多EC2例項
  • 在流量減少時自動移除多餘例項
  • 透過健康檢查自動替換故障例項
  • 跨多可用區分配流量,提高用性

這種自動擴充套件架構的實作,讓我的應用程式能夠平穩處理流量波動,同時最佳化營運成本。

Ansible與AWS:自動化的完美結合

雖然AWS提供了豐富的服務和強大的管理控制檯,但手動設定和管理這些服務仍然是一個挑戰,特別是在大規模佈署時。這就是Ansible發揮作用的地方。

Ansible是一個簡單但功能強大的自動化工具,它使用YAML語法描述自動化任務,不需要在被管理的系統上安裝任何代理。結合AWS,Ansible可以自動化從基礎設施設定到應用程式佈署的整個過程。

為什麼選擇Ansible而非其他自動化工具?

在眾多自動化工具中,我選擇Ansible的原因主要有:

  1. 簡單性:使用YAML語法,學習曲線相對平緩
  2. 無代理:不需要在被管理的系統上安裝任何代理
  3. 冪等性:可以重複執行同一任務而不產生副作用
  4. 豐富的AWS模組:提供了全面的AWS服務支援
  5. 活躍的社群:大量的檔案、外掛和社群支援

特別是在處理AWS資源時,Ansible的AWS模組提供了一種宣告式的方式來定義所需的狀態,而不必擔心如何達到這種狀態。

Ansible與AWS整合的基本概念

要使用Ansible自動化AWS,首先需要理解幾個關鍵概念:

動態清單

傳統上,Ansible使用靜態清單檔案來定義要管理的主機。但在AWS環境中,主機可能會動態建立和銷毀。Ansible的動態清單功能允許直接從AWS查詢主機訊息,確保清單始終是最新的。

AWS模組

Ansible提供了豐富的AWS模組,涵蓋幾乎所有AWS服務。例如:

  • ec2:用於管理EC2例項
  • ec2_vpc:用於建立和管理VPC
  • rds:用於管理RDS資料函式庫 s3:用於操作S3儲存桶

這些模組讓我們可以用一種一致的方式操作不同的AWS服務。

角色和可重用性

Ansible角色允許將相關的任務、變數和處理程式組織成一個可重用的單元。在AWS自動化中,我們可以建立專門的角色來處理特定類別的AWS資源,然後在不同的Playbook中重用這些角色。

實作:使用Ansible自動化AWS基礎設施

接下來,我將分享一些實際的例子,展示如何使用Ansible自動化AWS基礎設施的各個方面。

環境準備

在開始使用Ansible自動化AWS之前,需要進行一些準備工作:

  1. 安裝Ansible和必要的Python套件
  2. 設定AWS憑證
  3. 設定動態清單

安裝Ansible和AWS相關套件

# 安裝Ansible
sudo apt-get update
sudo apt-get install ansible

# 安裝AWS相關Python套件
pip install boto boto3 botocore

設定AWS憑證

有幾種方法可以提供AWS憑證給Ansible:

方法一:使用環境變數

export AWS_ACCESS_KEY_ID='your-access-key'
export AWS_SECRET_ACCESS_KEY='your-secret-key'
export AWS_REGION='ap-northeast-1'

方法二:使用AWS憑證檔案

# ~/.aws/credentials
[default]
aws_access_key_id = your-access-key
aws_secret_access_key = your-secret-key
region = ap-northeast-1

設定動態清單

建立一個名為ec2.py的動態清單指令碼和一個設定檔案ec2.ini

# 下載動態清單指令碼
wget https://raw.githubusercontent.com/ansible/ansible/devel/contrib/inventory/ec2.py
wget https://raw.githubusercontent.com/ansible/ansible/devel/contrib/inventory/ec2.ini
chmod +x ec2.py

測試動態清單:

./ec2.py --list

這將列出你AWS帳戶中的所有EC2例項。

自動化EC2例項管理

以下是一個基本的Playbook,用於建立EC2例項:

---
- name: 建立EC2例項
  hosts: localhost
  connection: local
  gather_facts: False
  vars:
    instance_type: t2.micro
    security_group: my-security-group
    image: ami-0c3fd0f5d33134a76  # Amazon Linux 2 AMI in Tokyo region
    region: ap-northeast-1
    key_name: my-key

  tasks:
    - name: 建立EC2例項
      ec2:
        key_name: "{{ key_name }}"
        group: "{{ security_group }}"
        instance_type: "{{ instance_type }}"
        image: "{{ image }}"
        wait: yes
        region: "{{ region }}"
        count: 1
        instance_tags:
          Name: "web-server"
          Environment: "development"
      register: ec2

    - name: 將新例項增加到主機組
      add_host:
        hostname: "{{ item.public_ip }}"
        groupname: launched
      with_items: "{{ ec2.instances }}"

    - name: 等待SSH可用
      wait_for:
        host: "{{ item.public_ip }}"
        port: 22
        delay: 10
        timeout: 320
        state: started
      with_items: "{{ ec2.instances }}"

這個Playbook執行了三個主要任務:

  1. 首先,使用ec2模組建立一個新的EC2例項,指定了例項類別、安全組、AMI映像和區域等引數。register: ec2將建立結果儲存到變數中,以便後續任務使用。

  2. 接著,使用add_host模組將新建立的EC2例項增加到一個名為"launched"的臨時主機組。這樣我們就可以在同一個Playbook中對這些新例項執行進一步的操作。

  3. 最後,使用wait_for模組等待SSH服務在新例項上可用,這確保我們可以立即連線到新建立的例項進行設定。