Basic


  • Beanstalk 是 PAAS 服務,可以透過 Config (.ebextensions) 設定去建立環境,例如基本的 Three Tire Architecture : Client -> Server -> DB,而我們只需要專注在 Application 上的開發
  • Beanstalk 本身是免費的,只需要付原本底下的資源費用 例如 EC2, ELB 等等
  • 支援多個 Programming Language ,也支援 Docker
  • 有 Deployment 策略 和 Rollback 策略
  • 可以備份現在的設定 (Save Configuration)
  • 環境設定的順序 高到低
    • 直接環境設定
    • Save Configuration
    • .ebextensions 設定
    • Default Value
  • 可以設定 Management Updated
    • 可以排成固定時間去做 patch
    • 可以選擇是直接更新舊的,還是先建立一台新的機器安裝好去取代
  • Swap URL ,透過此功能做到 Blue/Green Deployment ,底層是更改 Router53 Record
  • Multi-Container 底層是用ECS 做到

Basic Of Components


  • Application
  • Application Version
    • Deploy Code 放在 S3,指向特定 S3 Object Version
    • Version 有上限,可以透過 Application Life Cycle Policy 去刪除舊的 Version
      • 可以設定上限多少 Version
      • 要存和保留多少天
      • 也可以設定 Source 是否要保留在 S3
  • Environment Tire
    • Web Server:
    • Worker: 在上面執行一些程式,例如可以是SQS 的 Puller ,將 Queue 裡面資料拉下來處理。有 Auto Scaling Group 可以根據 SQS Queen Number 去做 Auto Scaling
  • Environment Types
    • 單一 Instance Environment
    • Load-balancing, Autoscaling Environment: for web server
      • Autoscaling Only : for worker Tire

. ebextensions


建立 Resource

  • 注意 Resource 如果透過 Beanstalk 一起建立的話,砍掉環境時也會跟著一起砍掉,所以 Storage 的部分最好分開建立,例如 RDS。
 1Resources:
 2  DynamoDBTable:
 3    Type: AWS::DynamoDB::Table
 4    Properties:
 5      KeySchema:
 6         HashKeyElement:
 7           AttributeName: id
 8           AttributeType: S
 9      # create a table with the least available rd and wr throughput
10      ProvisionedThroughput:
11         ReadCapacityUnits: 1
12         WriteCapacityUnits: 1
13
14  NotificationTopic:
15    Type: AWS::SNS::Topic
16
17Outputs:
18  NotificationTopicArn:
19    Description: Notification topic ARN
20    Value: { "Ref" : "NotificationTopic" }
21
22option_settings:
23  aws:elasticbeanstalk:application:environment:
24    # these are assigned dynamically during a deployment
25    NOTIFICATION_TOPIC: '`{"Ref" : "NotificationTopic"}`'
26    DYNAMODB_TABLE: '`{"Ref" : "DynamoDBTable"}`'
27    AWS_REGION: '`{"Ref" : "AWS::Region"}`'

Command v.s Container Command


  • commands : 是在 Ec2 Instance 上執行,並且在 Application Code unpacked之前,按照英文名字順序執行
  • container_commands : 是在 Application code unpacked 之後,但在部署之前,可以用來修改 source code
    • leader_only : 由 Beanstalk 決定單一 instance 當 Leader 執行,並且會比其他沒有 leader_only 的 command 早執行,主要用在只能或只需要執行一次的 Command。
1  create_hello_world_file:
2    command: touch hello-world.txt
3    cwd: /home/ec2-user
4    
5container_commands:
6  modify_index_html:
7    command: 'echo " - modified content" >> index.html'

Deployment Policy


Policy描述推失敗影響推機速度推幾時是否有 Downtime是否需要修改 DNS RecordRollback 方式
All at once一次全部機器直接推機Downtime最快需重新推舊的Version
Rolling一次下掉幾台線上機器,裝好新的code 在重新上線。只有正在推的那幾台會壞掉,線上有可能會部分機器是新的 Code ,部分機器是舊的 Code比 All at once 慢需重新推舊的Version
Rolling with an additional batch跟 Rolling 差不多,差別在於是先建立全新的機器推完機以後,在取代線上的除了一開始推壞沒上線已外,其他跟 Rolling Policy 一樣比 Rolling 慢需重新推舊的Version
Immutable建立全新的 Auto Scaling Group,然後將流量轉到新的 Auto Scaling Group比較沒有,因為可以先測試全新的 Auto Scaling Group 才切換切回流量到舊的 Auto Scaling Group
Traffic Splitting根據權重慢慢的將流量切到新的機器上取決於流量的權重將權重切回到舊的
Blue/Green透過 DNS Record 切換流量比較小,因為是全新的一組機器 Ready 才切重新設定 DNS Record 指向舊的機器