AWS Copilot 介紹 實際上手 教學

yysu
12 min readApr 30, 2021

--

AWS Copilot a.k.a. 一行指令幫您搞定容器運行所需基礎設施的神器

ECS
AWS ECS

開始介紹 AWS Copilot 以前,先介紹 AWS ECS 這個服務,ECS 是全受管的容器服務,可以讓你專注在集群上執行 Docker 應用程式而不需要去在意底層的基礎設施。若您想對 ECS 有近一步的了解,可以參考部署 Docker 容器 [1],這個五分鐘的教學來了解更多,或是參考將巨型應用程式分解成微型服務 [2]。

若您已經了解 ECS 是怎樣的服務的話,那太好了,我們可以接續下面的 AWS Copilot 說明,但若是您還不清楚 ECS 是什麼東西的話,強烈建議你快速地看下面這個影片來了解:

AWS Copilot [3]

AWS Copilot is an open source command line interface that makes it easy for developers to build, release, and operate production ready containerized applications on Amazon ECS and AWS Fargate.

AWS Copilot 是一個開源的CLI,可以讓開發者很簡單的建置、部署、操作容器應用程式於 AWS ECS上,也就是說,你不止能夠快速的建立測試用的 ECS 環境,還內建數種不同的 production-ready 環境的應用場景,例如: Load Balanced Web Service, Backend Service, Scheduled Job,讓你能夠專心在商業邏輯上面而不用花多餘的時間構建環境。

概念

想要簡化開發、維運者,在使用 AWS ECS 容器服務時所需的步驟,能夠更快速的複製、搭建環境,其中包括下列幾項主軸:

  • Applications (應用程式): 服務與環境的集合。開始使用Copilot時,首先會被要求做的是選擇一個應用程式的名稱,裡面可以有多個服務 (ex. Fronted、BackendAPI、DB) 以及環境 (ex. Prod、Staging、Testing)。
  • Environments (環境):在 Copilot 中,我們可以有多個環境 (ex. Prod、Staging、Testing),其目的是為了能夠在正式將你的應用環境部署到生產環境之前,能夠有不同的環境做測試、穩定的環境等等。每個環境上面都能夠有自己運行的服務。更重要的是每個環境都是獨立互不影響的。
  • Services (服務):服務是您的程式以及其所在 AWS 上啟動和運行所需的所有基礎設施(ex. 你的程式需要與RDS MySQL溝通,並且需要 ALB 做流量負載均衡,這些個別就是一個服務 )。Copilot 會詢問您要創建哪種類型的服務,選擇的類型會決定創建哪些AWS基礎設施來運行你的程式(ex. 如果您想讓應用程式接受 Internet 的流量,Copilot 可以自動創建 AWS Fargate、Application Load Balancer 和 Amazon ECS 服務,並組合起來)。在 Copilot 選擇要構建哪種類型的服務後,Copilot 會負責基於 Dockerfile 構建 Image 並將 Image 安全地存儲在 Amazon ECR 存儲庫中,Copilot 還將創建一個名為manifest的文件,其中包含服務配置,這包括服務的每個副本分配多少記憶體和CPU,要運行的服務副本的數量等。
  • Jobs (工作):Event driven 的臨時Amazon ECS任務。 該工作完成後,任務就終止。 像服務一樣,Copilot 會詢問您所有必要的訊息,以快速開始在AWS上執行排成任務(scheduled task)。
  • Pipelines (管道):Copilot 可以建立一個 Release pipeline ,這個Release pipeline 在你每次推送到git存儲庫時,幫助部署您的服務。(目前支持 GitHub、Bitbucket 和 CodeCommit),檢測到推送後,您的管道將構建您的服務,將映像推送到ECR,然後部署到您的環境。一種常見使用模式是為特定服務設置管道,該管道將部署到測試環境,運行自動測試,然後部署到生產環境。

安裝

Mac 的話,可以透過 Homebrew 安裝:

$ brew install aws/tap/copilot-cli

Linux x86 (64-bit)

$ curl -Lo copilot https://github.com/aws/copilot-cli/releases/latest/download/copilot-linux && chmod +x copilot && sudo mv copilot /usr/local/bin/copilot && copilot --help

Linux (ARM)

curl -Lo copilot https://github.com/aws/copilot-cli/releases/latest/download/copilot-linux-arm64 && chmod +x copilot && sudo mv copilot /usr/local/bin/copilot && copilot --help

Windows (If you encounter permissions issues, ensure that you are running your terminal as an administrator.)

Invoke-WebRequest -OutFile 'C:\Program Files\copilot.exe' https://github.com/aws/copilot-cli/releases/latest/download/copilot-windows.exe

實際操作

我們將採用官網的例子,這個範例會透過將裡面的 Dockerfile 建置成 Docker image、推送至 ECR 儲存庫、建立一個 ECS Fargate集群,運行該 Image 成 ECS 服務,並搭配 ALB 將流量送至該服務。

簡單來說就是會部署一個網站。

先爆個雷,前面你看到這些所有複雜的東西,只要一個指令就能搞定。

  1. 我們要先確認 AWS CLI、Docker、AWS Credential、Copilot 是否都安裝、配置完成:
# 確認 AWS CLI 已經安裝
$ aws --version
aws-cli/1.19.3 Python/2.7.16 Darwin/19.6.0 botocore/1.20.3
# 確認 Docker 已經安裝
$ docker version
Client: Docker Engine - Community
Cloud integration: 1.0.12
Version: 20.10.5
API version: 1.41
Go version: go1.13.15
Git commit: 55c4c88
Built: Tue Mar 2 20:13:00 2021
OS/Arch: darwin/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.5
API version: 1.41 (minimum version 1.12)
Go version: go1.13.15
Git commit: 363e9a8
Built: Tue Mar 2 20:15:47 2021
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.4.4
GitCommit: 05f951a3781f4f2c1911b05e61c160e9c30eaa8e
runc:
Version: 1.0.0-rc93
GitCommit: 12644e614e25b05da6fd08a38ffa0cfe1903fdec
docker-init:
Version: 0.19.0
GitCommit: de40ad0
# 確認 AWS Credential 已經配置
$ aws sts get-caller-identity
{
"Account": "62XXXXXXXXXX",
"UserId": "AIDAZCZQRXXXXXXXXXXXX",
"Arn": "arn:aws:iam::62XXXXXXXXXX:user/yenyun-admin"
}
# 確認 AWS Copilot 已經安裝
$ copilot version
version: v1.4.0, built for darwin

2. 使用 $ git clone https://github.com/aws-samples/aws-copilot-sample-service example 範例

$ git clone https://github.com/aws-samples/aws-copilot-sample-service example 
$ cd example

3. 使用 $copilot init 指令,這個指令將會自動幫您建置前面提到的相關基礎設施環境、部署服務 (這個指令執行會需要一些時間,可以去泡杯咖啡享受人生)

$ copilot init --app demo \
--name front-end \
--type "Load Balanced Web Service" \
--dockerfile "./Dockerfile" \
--deploy

這時 Copilot 會創建所需要的資源,包括:

  • A VPC
  • Subnets/Security Groups
  • Application Load Balancer
  • Amazon ECR Repositories
  • ECS Cluster & Service running on AWS Fargate

建置完上述 AWS 服務後,根據 Dockerfile 建置 image、推送至 ECR 倉庫,並且建立ECS 服務。

完成之後,由上圖,最後的結果你可以看到一串url :

Deployed front-end, you can access it at http://demo-Publi-1SQUFT7G6WTEQ-25621942.us-east-1.elb.amazonaws.com.

透過瀏覽器訪問這串網址,可以成功看到 Copilot 的 Logo ,就代表都建置完成了。

整體創建出來的架構會像這樣:

AWS Copilot — Load Balance Web Service type

AWS Copilot 背後是用 CloudFormation Stack來創建對應的資源

若你想要進一步查看究竟建置了哪些資源,你也可以進到 AWS CloudFormation主控台查看名稱為 demo-test-front-end 的 Stack 內的Resources。

清除上面所建資源

只要一行指令:

$ copilot app delete

若是不需要用到這些資源的話,請記得測試完成之後,透過上述指令刪除,不然會被收費的!!!!

由上述結果中,可以看到不論是建置還是刪除,在 AWS Copilot 內只需要一行指令搭配一些定義好的選項,就能幫您建立、刪除一個現成的環境,而不需要自己去搭建,是不是真的超級方便!

其他更多 Copilot 指令可以參考:

關於 AWS Copilot ,我們還有很多可以探討的,關於下面幾點,我可以改天再寫個文章整理一下:

  • 架構、Addons
  • 持續部署
  • 維運

2021–05–01 更新,新文章出爐 🎉🎉🎉

AWS Copilot 深入淺出

https://yysu.medium.com/aws-copilot-%E6%B7%B1%E5%85%A5%E6%B7%BA%E5%87%BA-%E6%95%99%E5%AD%B8-32609824939c

強烈建議想了解更多可以參考:

如果有什麼漏掉或是我誤會的地方,也歡迎你留言來補充、糾正我,能夠互相學是一件很棒的事,如果你覺得這篇文章對你有幫助,也希望你可以不吝於幫我點個讚,點50個讚也可以,謝謝你的觀看🙂

--

--

yysu

AWS Certified All-5 | CKA & CKAD | Ex - Cloud Engineer @ AWS