1. 程式人生 > >用無伺服器應用模型部署無伺服器應用 (二)使用無伺服器應用模型的持續整合

用無伺服器應用模型部署無伺服器應用 (二)使用無伺服器應用模型的持續整合

作者:薛峰

上一篇文章中我們介紹了AWS 無伺服器應用模型和SAM模板的基本功能和特性,並帶領大家用一個例項體驗了通過CloudFormation部署SAM模板。在這一篇中,我們仍然結合例項講解,為大家繼續介紹使用AWS CodeBuild 構建 Lambda函式以及使用AWS CodePipeline實現自動化持續整合。

部署配置AWS CodeBuild

如果我們的Lambda函式使用了依賴庫時,我們可以通過AWS CodeBuild來把依賴庫編譯進Lambda函式的部署包裡。

AWS CodeBuild  是一個完全託管的構建服務,可用於編寫原始碼、執行測試並生成可立即部署的軟體包。CodeBuild基於AWS管理的容器,從而實現使用者無需配置、管理和擴充套件自己的構建伺服器。CodeBuild 可持續縮放和並行處理多個生成任務,因此構建任務不必在佇列中等待。使用CodeBuild,我們只需要按構建時使用計算資源的分鐘數付費,從而無需為預置的構建伺服器的空閒時間付費。

除了常見的Java之類的程式原始碼的構建,CodeBuild還可用於Lambda函式部署前的構建。下面我們用一個例子來具體說明。

請先從以下git庫下載原始碼。

這個例子中的Lambda函式需要Node.js 依賴庫 time,我們使用CodeBuild在構建時安裝這個這個time庫,把它加入到 Lambda 函式的包中。

index.js 檔案中以下這行,表示需要依賴庫 time。

var time = require('time');

buildspec.yml 中

install:

    commands:

      - npm install time

表示在構建的安裝步驟把 time 庫安裝進來。

  build:

    commands:

      - aws cloudformation package --template-file codebuild.yaml --s3-bucket <bucket-name> --output-template-file output_codebuild.yaml

這段其實就是使用在上一章節我們介紹過的aws cloudformation package 打包。

上傳原始檔

把buildspec.yml檔案中的 <bucket-name> 等變數值替換成你的具體的值。

在當前目錄下除了 md 檔案的其它檔案打包成 codebuild.zip,然後把這個 zip 檔案上傳你自己的 S3桶中。

配置 CodeBuild 專案

開啟 CodeBuild 控制檯

點選 Create project。

在 Configure your project 頁

Project name 輸入 serverlessCodebuild

Source provider 選擇 Amazon S3

Bucket 欄選擇我們的剛才上傳 zip 檔案的 S3 桶名稱

S3 object key 輸入 codebuild.zip。

Environment image 保持選擇 Use an image managed by AWS CodeBuild

Operating system 選擇 Ubuntu

Runtime 選 Node.js

Version 選擇 aws/codebuild/nodejs:4.3.2

Artifacts type 選 Amazon S3

Bucket name 還選擇我們的剛才上傳 zip 檔案的 S3 桶名稱

確認 Create a service role in your account 已選中

Role name 輸入 serverlessCodebuild

點選右下角 Continue 按鈕

在 Review 頁點選右下方的 Save and build 按鈕。

建立成功後前進到 Build projects 列表頁,此時剛剛新建的專案應該是選中的狀態。點選左上角 Start build 按鈕。

在 Start new build 頁,直接點選右下角 Start build 按鈕。

在 Build 頁可以檢視構建進行的進度資訊。注意看 Phase details 下面的輸出內容。 構建成功完成以後,可以到我們的 S3 桶中檢視結果,可以看到創建出一個 serverlessCodebuild 目錄,裡面就是構建的成果—— output_codebuild.yaml 檔案。我們把它下載到本地,就可以用它再執行 CloudFormation 部署。

使用 CloudFormation 部署

執行以下命令

aws cloudformation deploy \

   --template-file output_codebuild.yaml \

   --stack-name serverlessCodebuild \

   --capabilities CAPABILITY_IAM

順利地話,會看到逐漸輸出的返回結果

Waiting for changeset to be created..


Waiting for stack create/update to complete

Successfully created/updated stack - serverlessCodebuild

這時到 CloudFormation 的控制檯已經創建出一個 serverlessCodebuild ,整個過程大約持續 1 到 2 分鐘。

然後到 API Gateway 控制檯,可以看到創建出的 serverlessCodebuild 的 API,點選其 Stages 下的 Prod 連結,可以看到形如下面的呼叫 URL: Invoke URL: https://xxxxxxxxx.execute-api.my-region.amazonaws.com/Prod

點選它,開啟一個新視窗,顯示

“The time in Los Angeles is Mon Aug 07 2017 03:32:42 GMT-0700 (PDT)”
表示已經部署成功。

部署配置AWS CodePipeline

每次都要手工執行aws cloudformation deploy命令來部署仍然有些繁瑣,而且手工部署難免會有人工的失誤。下面我們使用AWS CodePipeline來最終實現完全自動化的部署。

AWS CodePipeline 是一個託管的持續整合與持續交付服務,可以實現快速而可靠的應用程式和基礎設施更新。每次更改程式碼時,CodePipeline 都會根據我們定義的釋出流程模型構建、測試和部署程式碼,就像管道一樣逐個步驟的執行流程中的每一步操作,還支援可選的人工稽核步驟。和CodeBuild一樣, CodePipeline也是隻按實際使用量付費,同樣無需為預置的資源空閒付費。

我們下面這個例子,Lambda函式還是使用了time依賴庫,仍然使用CodeBuild安裝依賴庫、CloudFormation進行部署,這次我們配置CodePipeline來完成構建和部署的全部流程,實現持續整合。

總的操作流程主要是以下幾步:

  1. 在 github 上建立一個庫存放原始檔。
  2. 建立一個 CodeBuild 專案,用於構建無伺服器應用。
  3. 建立一個 IAM 角色,用於 CloudFormation 部署無伺服器應用。
  4. 建立一個 CodePipeline 專案,把上述若干步驟和資源組建成管道。

在 github 上建立一個庫存放原始檔

請在你自己的github新建一個儲存庫,名為 serverlessCodepipepline。

從以下git庫下載原始碼。

放在我們自已的 serverlessCodepipepline 庫的根目錄下。

把 buildspec.yml 中的 <bucket> 更新成自己的桶名稱,再 commit 到 git 庫中。

配置 CodeBuild 專案

  • 開啟 CodeBuild 控制檯,點選 Create project。

在 Configure your project 頁

Project name 輸入 serverlessCodepipeline

Source provider 選擇 Github

Repository 選擇 Use a repository in my account

Repository URL 輸入我們自己的庫的路徑,比如 https://github.com/xfsnow/serverlessCodepipepline

  • Environment image 保持選擇 Use an image managed by AWS CodeBuild

Operating system 選擇 Ubuntu

Runtime 選 Node.js

Version 選擇 aws/codebuild/nodejs:4.3.2

Build specification 保持選中 Use the buildspec.yml in the source code root directory

Artifacts type 選 Amazon S3

Bucket name 還選擇我們在 buildspec.yml 中指定的 S3 桶名稱

確認 Create a service role in your account 已選中

Role name 輸入 serverlessCodebuild,點選右下角 Continue 按鈕。

  • 在 Review 頁點選右下方的 Save and build 按鈕。

建立成功後前進到 Build projects 列表頁,此時剛剛新建的專案應該是選中的狀態。點選左上角 Start build 按鈕。

在 Start new build 頁,直接點選右下角 Start build 按鈕。

  • 在 Build 頁可以檢視構建進行的進度資訊。注意看 Phase details 下面的輸出內容。

構建成功完成以後,可以到我們的 S3 桶中檢視結果,可以看到創建出一個 serverlessCodepipeline 目錄,裡面就是構建的成果—— output-codepipeline.yaml 檔案。

我們可以把它下載到本地看一下,後續我們繼續配置 CodePipeline 就是用它來做無伺服器資源的部署。

配置 IAM 角色

登入 AWS 管理控制檯。點選左側導航連結中的 Roles,點選 Create new role 按鈕。

  • 在 Select role type 頁選擇 AWS Service Role,找到 AWS Cloudformation Role 點選其右邊的 Select 按鈕。
  • 在 Attach Policy 頁,選擇 AWSLambdaExecute。點選 Next Step 按鈕。
  • 在 Set role name and review 頁, Role name 輸入 cloudformation-lambda-execution,然後點選 Create role 按鈕。
  • 開啟剛才建立的角色,在 Permissions 選項卡下,點選 Inline Policies 展開之,然後選擇 click here 連結。

選擇 Custom Policy,然後選擇 Select。

在 Policy Name 中,輸入 cloudformation-deploy-lambda ,然後將以下內容中的 region account_id 替換成你自己的值,貼上到 Policy Document 欄位中:

{

    "Statement": [

        {

            "Action": [

                "s3:GetObject",

                "s3:GetObjectVersion",

                "s3:GetBucketVersioning"

            ],

            "Resource": "*",

            "Effect": "Allow"

        },

        {

            "Action": [

                "s3:PutObject"

            ],

            "Resource": [

                "arn:aws:s3:::codepipeline*"

            ],

            "Effect": "Allow"

        },

        {

            "Action": [

                "lambda:*"

            ],

            "Resource": [

                "arn:aws:lambda:region:account-id:function:*"

            ],

            "Effect": "Allow"

        },

        {

            "Action": [

                "apigateway:*"

            ],

            "Resource": [

                "arn:aws:apigateway:region::*"

            ],

            "Effect": "Allow"

        },

        {

            "Action": [

                "iam:GetRole",

                "iam:CreateRole",

                "iam:DeleteRole"

            ],

            "Resource": [

                "arn:aws:iam::account-id:role/*"

            ],

            "Effect": "Allow"

        },

        {

            "Action": [

                "iam:AttachRolePolicy",

                "iam:DetachRolePolicy"

            ],

            "Resource": [

                "arn:aws:iam::account-id:role/*"

            ],

            "Effect": "Allow"

        },

        {

            "Action": [

                "iam:PassRole"

            ],

            "Resource": [

                "*"

            ],

            "Effect": "Allow"

        },

        {

            "Action": [

                "cloudformation:CreateChangeSet"

            ],

            "Resource": [

                "arn:aws:cloudformation:region:aws:transform/Serverless-2016-10-31"

            ],

            "Effect": "Allow"

        }

    ],

    "Version": "2012-10-17"

}    

點選 Validate Policy,然後點選 Apply Policy。

配置 CodePipeline 專案
開啟 CodePipeline 控制檯,點選 Create project。

  • 在 Step 1: Name 頁

Project name 輸入 serverlessCodepipeline,點選“Next Step” 按鈕。

  • 在 Step 2: Source 頁

Source provider 選擇 Github,然後點選 Connect to GitHub 按鈕,關聯 GitHub 賬號。按提示完成關聯操作。

回到 AWS 頁面後,Repository 選擇前述我們自己建立的儲存庫。

Branch 選擇 master ,點選“Next Step” 按鈕。

  • 在 Step 3: Build 頁

Build provider 選擇 AWS CodeBuild

Configure your project 保持選中 Select an existing build project。

Project name 在下拉列表中選擇我們前面建立的 serverlessCodepipeline 專案。

  •  在 Step 4: Deploy 頁

Deployment provider 選擇 AWS CloudFormation。

Action mode 選擇 Create or replace a change set。

Stack name 輸入 serverlessCodepipeline。

Change set name 輸入 serverlessCodepipelineChangeSet。

Template file 輸入 buildspec.yml 中指定的構建結果檔名 output-codepipeline.yaml。

Capabilities 選擇 CAPABILITY_IAM。

Role name 選擇我們前面建立的 IAM 角色 cloudformation-lambda-execution。 點選 Next Step 按鈕。

  • 在 Step 5: Service Role 頁

點選 Create Role 按鈕,在彈出的 IAM AWS CodePipeline is requesting permission to use resources in your account 頁面,直接點選右下角 Allow 按鈕,返回後點擊 Next Step 按鈕。

  • 在 Step 6: Review 頁面,直接點選右下角 點選右下角的 Create Pipeline 按鈕。最後來到 serverlessCodepipeline 專案詳情頁。
  • 增加測試部署階段 在 serverlessCodepipeline 詳情頁點選 Edit 按鈕。

在 Staging 階段下面點選 +Stage 連結。

在 Stage name 欄輸入 Beta,然後點選其下面的 +Action 按鈕。

在 Action category 中,選擇Deploy。

在 Action name 中,輸入 executeChangeSet。

在 Deployment provider 中,選擇 AWS CloudFormation。

在 Action mode: 中,選擇 execute a changeset。前一步我們已經建立了 ChangeSet,將 SAM 模板轉換為完整的 AWS CloudFormation 格式,現在我們要使用 deployChangeSet 部署 AWS CloudFormation 模板了。

在 Stack name:中,輸入 serverlessCodepipeline。

在 Change set name:中,輸入 serverlessCodepipelineChangeSet。

選擇 Add Action。

回到頁面頂部點選 Save pipeline changes。

選擇 Save and continue。

檢視結果

我們在 serverlessCodepipeline 專案詳情頁稍等10秒左右,Pipeline 會自動開始第一次部署。可以隨時檢視到各個步驟的執行情況,比如:

Source
GitHub
Succeeded 2 min ago
d24ff81
最後等到 Beta 步驟也完成,這時到 CloudFormation 的控制檯檢視已經創建出一個 serverlessCodepipeline ,整個過程大約持續 3到5 分鐘。

然後到 API Gateway 控制檯,可以看到創建出的 serverlessCodepipeline 的 API,點選其 Stages 下的 Prod 連結,可以看到形如下面的呼叫 URL: Invoke URL: https://xxxxxxxxx.execute-api.my-region.amazonaws.com/Prod

複製此 URL,開啟一個新視窗,貼上進位址列,然後在後面再輸入 /time,組成形如

的連結再訪問之,顯示

“The time in Los Angeles is Mon Aug 07 2017 03:31:39 GMT-0700 (PDT)”
表示已經部署成功。

然後我們模擬程式碼更新,把你自己的 github 儲存庫中的 README.md 檔案編輯一下,然後 git commit 到 github 上去。 然後再回到 serverlessCodepipeline 詳情頁,稍等一會我們會看到從 Source 開始整個管道會再次執行一遍。

執行到每一步時,我們都可以點選 Detail 連結到相關服務的詳情頁檢視具體進度。比如 CloudFormation 會創建出一個新的 serverlessCodepipelineChangeSet 來執行變更。

最後到 API Gateway 的 serverlessCodepipeline API,選擇一個 Stage ,再點選 Deployment History 可以看到 Deployment date時間更新了。

小結

今天我們繼續結合例項,為大家講解了使用AWS CodeBuild 構建 Lambda函式以及使用AWS CodePipeline實現自動化持續整合。這些也是基於AWS 無伺服器應用模型和SAM模板,再與其它AWS運維的服務整合,共同實現無伺服器應用的自動化運維。

相關資源連結

無伺服器服務官網:

運維相關的服務:

作者介紹:

薛峰,亞馬遜AWS解決方案架構師,AWS的雲端計算方案架構的諮詢和設計,同時致力於AWS雲服務在國內和全球的應用和推廣,在大規模併發應用架構、移動應用以及無伺服器架構等方面有豐富的實踐經驗。在加入AWS之前曾長期從事網際網路應用開發,先後在新浪、唯品會等公司擔任架構師、技術總監等職位。對跨平臺多終端的網際網路應用架構和方案有深入的研究。

相關推薦

手把手教你nginx開發自己的伺服器------利用nginx開發一個helloWorld程式

現在我們正式開始編寫nginx的helloWorld功能,該從哪下手呢?別急,我們在上一篇文章中提到了事件驅動對吧。nginx是怎麼樣事件驅動的呢?我們來看看ngx_worker_process_cycle()這個函式的一部分for ( ;; ) { if

win10通過SecureCRT在Linux伺服器部署及使用Fuseki

上一節介紹了基本工具,下面開始具體的操作流程 三、具體步驟 1.部署SecureCRT,通過ip和密碼連線Linux系統,具體怎麼連線就不多說了,不會的可以百度,很多教程。 2將下載好的Fuseki.tar檔案傳送到Linux系統上。 在SecureCRT上點選File——》C

linux-搭建web伺服器系列--安裝部署多個tomcat

當然,第一步當然是下載tomcat,不廢話,直接上圖 到此時,tomcat已經下載好,我們利用FZ上傳到linux伺服器上去 使用以下命令解壓tomcat壓縮包: tar -zxvf apach

Linux伺服器使用Gitblit搭建Git伺服器之使用war包部署在Tomcat下

上次介紹了使用安裝的方式使用GitBilit搭建git伺服器,這次介紹一個更簡單的方式:使用gitblit 的war包 1、安裝git這裡不是重點,請自行baidu。 4、部署war包,想必大家應該不陌生吧,這裡就不做贅述了(還是說一句吧,把wa

在亞馬遜雲伺服器部署阿里資料庫Otter

   mkdir manager    cd  manager    wget https://github.com/alibaba/otter/releases/download/otter-x.y.z/manager.deployer-x.y.z.tar.gz    tar zxvf manager.de

Oracle 資料庫 體系結構 伺服器結構

目錄 前言 Oracle 記憶體結構 Oracle 程序結構 文章總結 前言 上一篇文章體現了 Oracle 資料庫的一些基本結構和儲存結構,這篇文章將會講到Oracle的伺服器結構,實際上就是主要講例項的結構。需要把這些底層的結構瞭解,在生產環境

tarjan演算法入門——向圖的雙連通分量未完成

一.雙連通分量. 無向圖的雙連通分量分為兩種,一種是點雙連通分量,簡稱v-DCC;一種是邊雙連通分量,簡稱e-DCC. 一個v-DCC的概念即為一張沒有割點的圖,一個e-DCC的概念即為一張沒有割邊的圖. 一張極大雙連通分量子圖的是指沒有一張雙連通分量子圖完全包含這張子圖的所有點且點

CASCAS伺服器動態驗證,CAS使用MySQL資料庫驗證

環境要求 JDK 8+ CAS 5.2 tomcat 8+ 步驟 一、搭建CAS伺服器  --> CAS(一)搭建CAS - server伺服器   二、修改application.properties 靜態驗證的

Servlet入門Tomcat伺服器

前言       本章學習tomcat伺服器的相關知識,瞭解伺服器的基本概念 方法 1.伺服器的概念和作用 我們知道,我們學習Java的時候都是手動執行的Java程式碼,通過前面的學習我們知道,使用者每發一次請求我們都需要伺服器在後臺執行程式碼返回給

NFS筆記NFS伺服器配置例項

一、NFS伺服器配置例項 實驗拓撲 二、實驗要求及環境 2.1實驗環境 NFS伺服器 IP:192.168.8.5 環境: [[email protected] ~]# uname -a Linux server7.ctos.zu 3.10.0-514.el7.

Java Web—— Tomcat伺服器使用技巧

一、搭建JavaWeb應用開發環境——Tomcat伺服器 1.1、WEB伺服器的作用   在本地計算機上隨便建立一個web頁面,使用者是無法訪問到的,但是如果啟動tomcat伺服器,把web頁面放在tomcat伺服器中,使用者就可以訪問了。  1、不管什麼web資源,想被遠端計算機訪問,都必須有

阿里雲伺服器的web專案釋出之路:伺服器tomcat及JDK的安裝

雲伺服器tomcat及JDK的安裝(步驟詳細,要軟體的留言喲) **準備工作:**遠端連線工具(xshell或者putty),tomcat和JDK壓縮包 首先購買的伺服器你需要知道你伺服器的使用者名稱(root)和密碼(自己設定) 密碼設定的位置: 下載相關的伺服器遠端連線軟體(xsh

JSON伺服器端和客戶端的JSON處理

    上面介紹瞭如何用 JSON表示資料,接下來,我們還要解決如何在伺服器端生成 JSON 格式的資料以便傳送到客戶端,以及客戶端如何使用 JavaScript 處理 JSON 格式的資料。     先來看看伺服器如何輸出JSON格式的資料吧。     以 Java 為例,我們將演示將一個Java 物件編

JavaWeb學習———Tomcat伺服器學習和使用(一)

一、Tomcat伺服器埠的配置   Tomcat的所有配置都放在conf資料夾之中,裡面的server.xml檔案是配置的核心檔案。   如果想修改Tomcat伺服器的啟動埠,則可以在server.xml配置檔案中的Connector節點進行的埠修改 例如:將Tomcat伺服器的啟

Java NIO介紹————堵塞io和Selector簡單介紹

無堵塞IO介紹 既然NIO相比於原來的IO在讀取速度上其實並沒有太大區別(因為NIO出來後,IO的低層已經以NIO為基礎重新實現了),那麼NIO的優點是什麼呢? NIO是一種同步非阻塞的I/O模型,也是I/O多路複用的基礎,而且已經被越來越多地應用到大型應用伺服器,成為解決

C# 之 FTP伺服器中檔案上傳與下載

        通過上一篇部落格《C# 之 FTP伺服器中檔案上傳與下載(一)》,我們已經建立好了一個FTP伺服器,並且該伺服器需要使用者名稱和密碼的驗證。今天我們來實現檔案的上傳。 首先,我們前臺需要一個FileUpload控制元件和一個Button控制元件 <

C++應用程序性能優化——C++對象模型

struct string 棧和堆 銷毀對象 getcount oca 函數參數 運行機制 控制 C++應用程序性能優化(二)——C++對象模型 一、C++對象模型與性能優化 對象模型是面向對象程序設計語言的重要方面,會直接影響面向對象語言編寫程序的運行機制以及對內存的使用

雪飲者 決策樹系列決策樹應用

ssi 字符串長度 mes pla 選擇 font com vector nac   本篇以信息增益最大作為最優化策略來詳細介紹決策樹的決策流程。   首先給定數據集,見下圖    註:本數據來源於網絡 本篇將以這些數據作為訓練數據(雖然少,但足以介紹清楚原理!),下圖是決

javascript 面向對象制作坦克大戰

初始化 common data- 插入 div 理解 span 們的 ava 2. 完善地圖 我們的地圖中有空地,墻,鋼,草叢,水,總部等障礙物。 我們可以把這些全部設計為對象。 2.1 創建障礙物對象群 對象群保存各種地圖上的對象,我們通過對象的屬

Spring Boot 實現電商系統 Web API 創建多模塊項目

ble jin play 正常 ota autowired ips 功能 bind 大型項目,需要將代碼按不同功能,分成不同模塊,這樣比較好管理和閱讀代碼,也有助於多人協作。 一、項目結構 1.1 模塊說明 項目分成5個模塊,分別如下: 模塊名稱 說明 webapi