Elastic Beanstalk 定制平台(已退役) - AWS Elastic Beanstalk

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

Elastic Beanstalk 定制平台(已退役)

注意

2022 年 7 月 18 日,Elastic Beanstalk 將基於 Amazon LinuxAMI()AL1的所有平台分支的狀態設置為已退休。這包括自訂平台。Elastic Beanstalk 不支援自訂平台。有關彈性豆莖退休 Amazon Linux 的更多信息AMI,請參閱。平台淘汰常見問答集

本主題仍保留在本文件中,供任何在 Elastic Beanstalk 自訂平台功能淘汰前使用該功能的客戶做參考。在過去,Elastic Beanstalk 自定義平台支持AMI從 Amazon LinuxAMI,RHEL7,RHEL6,或 Ubuntu 16.04 基地構建一個。AMIsElastic Beanstalk 不再支援這些作業系統。若要閱讀更多關於不再支援的自訂平台功能的資訊,請展開以下主題。

相較於自訂映像,自訂平台在多方面都是較為進階的自訂方式。自訂平台可讓您從頭開發完整的全新平台,您可自訂 Elastic Beanstalk 於平台執行個體上執行的作業系統、其他軟體和指令碼。若 Elastic Beanstalk 未針對使用的語言或基礎設施軟體的應用程式提供受管平台,此等靈活性可讓您自行建置一個。將其與自訂映像相比,您可以在其中修改 Amazon 機器映像 (AMI) 以與現有的彈性 Beanstalk 平台搭配使用,而 Elastic Beanstalk 仍然提供平台指令碼和控制平台的軟體堆疊。此外,透過自訂平台,您可以自動化、指令碼的方式建立您的自訂過程並加以維護,若是透過自訂映像,運作中執行個體的變更必須手動進行。

若要建立自訂平台,請AMI從其中一個受支援的作業系統 (Ubuntu 或 Amazon Linux) 建置 (如需確切版本號碼RHEL,請參閱中Platform.yaml 檔案格式flavor項目),並新增其他自訂項目。您可以使用 Packer 創建自己的 Elastic Beanstalk 平台,Packer 是一種開放源代碼工具,用於為許多平台創建機器映像,包括AMIs與 Amazon 彈性運算雲(Amazon)一起使用。EC2Elastic Beanstalk 平台包含一個設AMI定為執行一組支援應用程式的軟體,以及可包含自訂組態選項和預設組態選項設定的中繼資料。

Elastic Beanstalk 會將 Packer 做為個別的內建平台進行管理,您無須擔心 Packer 組態及版本。

您可以透過提供 Elastic Beanstalk 與封裝程式範本,以及範本叫用來建置的指令碼和檔案來建立平台。AMI這些元件會以平台定義檔 (指定範本和中繼資料) 封裝至ZIP歸檔中 (稱為平台定義歸檔)。

建立自訂平台時,不需要執行 Packer 的彈性 IP,即可啟動單一執行個體環境。Packer 隨後會啟動另一個執行個體來建置映像。您可重複使用此環境供多個平台或各個平台的多種版本使用。

注意

自定義平台是特定於 AWS 區域的。若您在多個區域使用 Elastic Beanstalk,務必在每個區域各自建立您的平台。

在某些情況下,不會清除 Packer 啟動的執行個體,必須手動將其終止。若要了解如何手動清除這些執行個體,請參閱Packer 執行個體清除

您帳戶中的使用者可以在建立環境ARN期間指定平台,以使用您的自訂台。這ARNs些會由您用來建立自訂平台的eb platform create指令傳回。

每次建置自訂平台時,Elastic Beanstalk 會建立新的平台版本。使用者可指定平台名稱,取得平台的最新版本,或納入版本編號以取得該版本。

例如,若要使用 3.0 版部署最新版本的自訂平台,您的 EB CLI 命令列會如下ARNMyCustomPlatformARN所示:

eb create -p MyCustomPlatformARN

要部署 2.1 版,您的 EB CLI 命令行將如下所示:

eb create -p MyCustomPlatformARN --version 2.1

您可以在建立和編輯現有自訂平台版本的標籤時,將標籤套用至自訂平台版本。如需詳細資訊,請參閱 標記自訂平台版本

建立自訂平台

欲建立自訂平台,您的應用程式根目錄必須納入平台定義檔案 platform.yaml,此會定義用於建立自訂平台的建置器類型。此檔案的格式如 Platform.yaml 檔案格式 中所述。您可從頭建立您的自訂平台,或使用其中一個範例自訂平台著手。

使用範例自訂平台

著手建立自訂平台的另一個方法是,使用其中一個平台定義封存範例來啟動載入您的自訂平台。在使用它們之前,您必須在樣本中配置的唯一項目是源AMI和區域。

注意

請不要於生產中使用未修改的範例自訂平台。範例是為了說明自訂平台可用的部分功能,但尚未經過強化供生產使用。

NodePlatform_Ubuntu.zip

此自訂平台以 Ubuntu 16.04 為基礎,並支援 Node.js 4.4.4。我們於本章節中使用此自訂平台做為範例。

NodePlatform_RHEL. 拉鍊

這個自訂平台是以 RHEL7.2 為基礎,並且支援 Node.js 4.4.4

NodePlatform_AmazonLinux. 拉鍊

此自訂平台以 Amazon Linux 2016.09.1 為基礎,並支援 Node.js 4.4.4

TomcatPlatform_Ubuntu.zip

此自訂平台以 Ubuntu 16.04 為基礎,並支援 Tomcat 7/Java 8

CustomPlatform_NodeSampleApp. 拉鍊

使用 expressejs 來顯示靜態網頁的 Node.js 範例。

CustomPlatform_TomcatSampleApp. 拉鍊

部署時會顯示靜態網頁的 Tomcat 範例。

下載範例平台定義封存:NodePlatform_Ubuntu.zip。此檔案內含平台定義檔案、Packer 範本、Packer 於映像建立期間執行的指令碼,以及 Packer 於平台建立期間將複製至建置器執行個體的指令碼和組態檔案。

範例 NodePlatform_Ubuntu.zip
|-- builder Contains files used by Packer to create the custom platform |-- custom_platform.json Packer template |-- platform.yaml Platform definition file |-- ReadMe.txt Briefly describes the sample

平台定義檔案 platform.yaml 會讓 Elastic Beanstalk 知道 Packer 範本 custom_platform.json 的名稱。

version: "1.0" provisioner: type: packer template: custom_platform.json flavor: ubuntu1604

封裝程式範本會告訴封裝程式如何AMIs為平台建置,並使用 Ubuntu AMI 做為HVM執行個體類型的平台映像檔的基礎。provisioners 區段則通知 Packer 將封存檔內 builder 資料夾的所有檔案,複製至執行個體,並於執行個體上執行 builder.sh 指令碼。指令碼完成時,Packer 會從已修改的執行個體建立映像。

Elastic Beanstalk 創建三個可用於在打包器AMIs中標記的環境變量:

AWS_ _ PLATFORM ARN

自訂平台ARN的。

AWS_ _ PLATFORM NAME

自訂平台的名稱。

AWS_ _ PLATFORM VERSION

自訂平台的版本。

範例 custom_platform.json 檔案使用這些變數來定義下列用於指令碼的值:

  • platform_name,由 platform.yaml 設定

  • platform_version,由 platform.yaml 設定

  • platform_arn,由範例 builder.sh 檔案結尾顯示的主要建置指令碼 custom_platform.json 所設定

custom_platform.json 檔案包含兩個您必須提供屬性的值:source_amiregion。如需有關選擇正確值AMI和區域值的詳細資訊,請參閱更新eb-custom-platforms-samples GitHub 儲存庫中的封裝程式範本

範例 custom_platform.json
{ "variables": { "platform_name": "{{env `AWS_EB_PLATFORM_NAME`}}", "platform_version": "{{env `AWS_EB_PLATFORM_VERSION`}}", "platform_arn": "{{env `AWS_EB_PLATFORM_ARN`}}" }, "builders": [ { ... "region": "", "source_ami": "", ... } ], "provisioners": [ {...}, { "type": "shell", "execute_command": "chmod +x {{ .Path }}; {{ .Vars }} sudo {{ .Path }}", "scripts": [ "builder/builder.sh" ] } ] }

您納入平台定義封存的指令碼和其他檔案,視您欲在執行個體上進行的修改有極大差異。範例平台包含下列指令碼:

  • 00-sync-apt.sh – 已標示為註解:apt -y update。我們將此命令變更為註解,因為其會要求使用者輸入訊息,中斷自動化套件更新。這可能是 Ubuntu 的問題。然而,最佳作法仍建議執行 apt -y update。因此,我們的範例指令碼留下此命令做為參考。

  • 01-install-nginx.sh – 安裝 nginx。

  • 02-setup-platform.sh – 安裝 wgettreegit。將掛勾和記錄組態複製至執行個體,並建立下列目錄:

    • /etc/SampleNodePlatform – 部署期間容器組態檔案的上傳位置。

    • /opt/elasticbeanstalk/deploy/appsource/ – 部署期間 00-unzip.sh 指令碼上傳應用程式原始碼的位置 (如需此指令碼的資訊,請參閱適用於 Elastic Beanstalk 環境的平台腳本工具章節)。

    • /var/app/staging/ – 部署期間處理應用程式原始碼的位置。

    • /var/app/current/ – 應用程式原始碼處理後執行的位置。

    • /var/log/nginx/healthd/增強型運作狀態代理程式寫入日誌的位置。

    • /var/nodejs – 部署期間 Node.js 檔案上傳的位置。

使用 EB CLI 建立具有範例平台定義歸檔的第一個自訂平台。

欲建立自訂平台
  1. 安裝 EB CLI

  2. 建立您將擷取範例自訂平台的目錄。

    ~$ mkdir ~/custom-platform
  3. 擷取 NodePlatform_Ubuntu.zip 到目錄,然後變更到解壓縮目錄。

    ~$ cd ~/custom-platform ~/custom-platform$ unzip ~/NodePlatform_Ubuntu.zip ~/custom-platform$ cd NodePlatform_Ubuntu
  4. 編輯 custom_platform.json 檔案,並且為 source_amiregion 屬性提供值。如需詳細資訊,請參閱更新 Packer 範本

  5. 執行 eb platform init 並依提示初始化平台儲存庫。

    您可將 eb platform 縮短為 ebp

    注意

    視窗 PowerShell 使用ebp做為指令別名。如果您CLI在 Windows 中執行 EB PowerShell,請使用以下命令的長形式:eb platform

    ~/custom-platform$ eb platform init

    此命令亦於目前目錄內建立目錄 .elasticbeanstalk,並將組態檔案 config.yml 新增至該目錄。請勿變更或刪除此檔案,因為 Elastic Beanstalk 建立自訂平台時需要此檔案。

    eb platform init 預設會使用目前資料夾的名稱做為自訂平台的名稱,在此範例中為 custom-platform

  6. 執行eb platform create以啟動封裝程式環境並取ARN得自訂平台。您稍後在此自訂平台建立環境時,將需要此值。

    ~/custom-platform$ eb platform create ...

    依預設,Elastic Beanstalk 會建立自訂平台的執行個體描述檔 aws-elasticbeanstalk-custom-platform-ec2-role。若您想要使用現有的執行個體描述檔,請將選項 -ip INSTANCE_PROFILE 新增至 eb platform create 命令。

    注意

    如果您使用 Elastic Beanstalk 預設執行個體描述檔 aws-elasticbeanstalk-ec2-role,Packer 將無法建立自訂平台。

    EB CLI 會顯示封裝程式環境的事件輸出,直到建置完成為止。您可按 Ctrl+C 退出事件檢視。

  7. 您可使用 eb platform logs 命令來檢查日誌是否有錯誤。

    ~/custom-platform$ eb platform logs ...
  8. 您稍後可透過 eb platform events 來檢查程序。

    ~/custom-platform$ eb platform events ...
  9. 透過 eb platform status 來檢查您平台的狀態。

    ~/custom-platform$ eb platform status ...

操作完成時,您將具備可用於啟動 Elastic Beanstalk 環境的平台。

透過主控台建立環境時,可使用自訂平台。請參閱 建立新的環境精靈

欲在您的自訂平台上啟動環境
  1. 為您的應用程式建立目錄。

    ~$ mkdir custom-platform-app ~$ cd ~/custom-platform-app
  2. 初始化應用程式儲存庫。

    ~/custom-platform-app$ eb init ...
  3. 下載範例應用程式 NodeSampleApp.zip。

  4. 擷取範例應用程式。

    ~/custom-platform-app$ unzip ~/NodeSampleApp.zip
  5. eb create -p CUSTOM-PLATFORM-ARN,在哪裡 CUSTOM-PLATFORM-ARN 是指eb platform create令ARN傳回的,以啟動執行您自訂平台的環境。

    ~/custom-platform-app$ eb create -p CUSTOM-PLATFORM-ARN ...

平台定義存檔內容

平台定義封存為相當於應用程式原始碼套件的平台。平台定義歸檔是一個ZIP檔案,其中包含平台定義檔案、封裝程式範本,以及 Packer 範本用來建立您的平台的指令碼和檔案。

注意

當您使用 EB CLI 建立自訂平台時,EB CLI 會從平台儲存庫中的檔案和資料夾建立平台定義歸檔,因此您不需要手動建立歸檔。

平台定義檔是一個YAML格式化的檔案,必須命名platform.yaml並位於平台定義歸檔的根目錄中。如需平台定義檔案支援的必要和選用金鑰清單,請參閱建立自訂平台

您無須以特定方式來命名 Packer 範本,但該檔案名稱必須與平台定義檔案中指定的佈建範本相符。如需建立 Packer 範本的說明,請參閱官方 Packer 文件

平台定義歸檔中的其他檔案是範本用來在建立執行個體之前自訂執行個體的指令碼和檔案AMI。

自訂平台掛勾

Elastic Beanstalk 使用標準化目錄結構在自訂平台上進行掛接。這些是生命週期事件期間及回應管理操作所執行的指令碼,如您環境中的執行個體啟動時,或使用者啟動部署或使用重新啟動應用程式伺服器功能時。

您需要將指令碼掛接在 /opt/elasticbeanstalk/hooks/ 資料夾的其中一個子資料夾。

警告

不支援在受管平台上使用自訂平台掛勾。自訂平台掛勾是專為自訂平台所設計。在 Elastic Beanstalk 受管平台上,它們的運作方式可能不同或有些問題,跨平台的行為可能有所不同。在 Amazon Linux AMI 平台上(在 Amazon Linux 2 之前),在某些情況下,它們可能仍然以有用的方式工作;請謹慎使用它們。

自訂平台掛鉤是 Amazon Linux 平AMI台上存在的傳統功能。在 Amazon Linux 2 平台,/opt/elasticbeanstalk/hooks/ 資料夾中的自訂平台掛勾會完全停止使用。Elastic Beanstalk 不會讀取或執行這些掛勾。Amazon Linux 2 平台支援一種新的平台掛勾,專門設計用於擴展 Elastic Beanstalk 受管平台。您可以將自訂指令碼和程式直接新增到應用程式原始碼套件中的掛勾目錄。Elastic Beanstalk 會在各個執行個體佈建階段期間執行這些項目。如需詳細資訊,請展開擴充 Elastic Beanstalk Linux 平台中的平台掛勾一節。

掛勾會整理成下列資料夾:

  • appdeploy – 應用程式部署期間執行的指令碼。當新的執行個體啟動時,或用戶端啟動新版本的部署時,Elastic Beanstalk 會執行應用程式部署。

  • configdeploy – 用戶端在執行會影響執行個體上軟體組態的組態更新時,所執行的指令碼,例如,設定環境屬性或啟用日誌輪換至 Amazon S3。

  • restartappserver – 用戶端執行重新啟動應用程式伺服器操作所執行的指令碼。

  • preinit – 執行個體啟動載入作業期間所執行的指令碼。

  • postinit – 執行個體啟動載入作業之後所執行的指令碼。

appdeployconfigdeployrestartappserver 資料夾包含 preenactpost 子資料夾。在操作的各個階段,會以字母順序執行 pre 資料夾內的所有指令碼,之後則依序為 enact 資料夾和 post 資料夾中的指令碼。

執行個體啟動時,Elastic Beanstalk 會依序執行 preinitappdeploypostinit。後續在運作中執行個體上進行部署時,Elastic Beanstalk 會執行 appdeploy 掛勾。當使用者更新執行個體軟體組態設定時,會執行 configdeploy 掛勾。使用者啟動應用程式伺服器重新啟動,僅在此時才會執行 restartappserver 掛勾。

當您的指令碼出現錯誤,能夠以非零狀態退出並寫入 stderr,來讓操作失敗。寫入 stderr 的訊息會出現在操作失敗所輸出的事件。Elastic Beanstalk 也會在日誌檔案 /var/log/eb-activity.log 中擷取此資訊。若您不希望操作失敗,請回傳 0 (零)。寫入 stderrstdout 的訊息會顯示於部署日誌,但不會顯示於事件串流,除非操作失敗。

Packer 執行個體清除

部分情況下 (例如在 Packer 建置器程序完成前將其刪除),Packer 啟動的執行個體不會被清除。這些執行個體不屬於 Elastic Beanstalk 環境,只能使用 Amazon EC2 服務來檢視和終止。

欲手動清除這些執行個體
  1. 打開 Amazon EC2 控制台

  2. 請確定您位於使用 Packer 建立執行個體的相同 AWS 區域。

  3. 資源下,選擇 N 執行中的執行個體 N 表示執行中執行個體的數目。

  4. 按一下查詢文字方塊。

  5. 選取 Name (名稱) 標記。

  6. 輸入 packer

    查詢應類似:tag:Name: packer

  7. 選取符合查詢的執行個體。

  8. Instance State (執行個體狀態)running (運作中),請依序選擇 Actions (動作)Instance State (執行個體狀態)Stop (停止),然後再選取 Actions (動作)Instance State (執行個體狀態)Terminate (終止)

Platform.yaml 檔案格式

platform.yaml 檔案的格式如下。

version: "version-number" provisioner: type: provisioner-type template: provisioner-template flavor: provisioner-flavor metadata: maintainer: metadata-maintainer description: metadata-description operating_system_name: metadata-operating_system_name operating_system_version: metadata-operating_system_version programming_language_name: metadata-programming_language_name programming_language_version: metadata-programming_language_version framework_name: metadata-framework_name framework_version: metadata-framework_version option_definitions: - namespace: option-def-namespace option_name: option-def-option_name description: option-def-description default_value: option-def-default_value option_settings: - namespace: "option-setting-namespace" option_name: "option-setting-option_name" value: "option-setting-value"

以這些值取代預留位置:

version-number

必要。YAML定義的版本。必須為 1.0

provisioner-type

必要。用於建立自訂平台的建置器類型。必須為 packer

provisioner-template

必要。包含設定的JSON檔案 provisioner-type.

provisioner-flavor

選用。用於的基本作業系統AMI。下列其中一項:

amazon (預設)

Amazon Linux。若未指定,則是平台建立時的 Amazon Linux 最新版本。

Amazon Linux 2 不是支援的作業系統類別。

ubuntu1604

Ubuntu LTS

rhel7

RHEL7

rhel6

RHEL6

metadata-maintainer

選用。平台擁有人的聯絡資訊 (100 個字元)。

metadata-description

選用。平台的描述 (2000 個字元)。

metadata-operating_system_name

選用。平台作業系統的名稱 (50 個字元)。篩選的輸出時,可以使用此值ListPlatformVersionsAPI。

metadata-operating_system_version

選用。平台作業系統的版本 (20 個字元)。

metadata-programming_language_name

選用。平台支援的程式設計語言 (50 個字元)。

metadata-programming_language_version

選用。平台語言的版本 (20 個字元)。

metadata-framework_name

選用。平台使用之 Web 架構的名稱 (50 個字元)。

metadata-framework_version

選用。平台 Web 架構的版本 (20 個字元)。

option-def-namespace

選用。aws:elasticbeanstalk:container:custom 底下的命名空間 (100 個字元)。

option-def-option_name

選用。選項的名稱 (100 個字元)。您至多可定義 50 個由平台向使用者提供的自訂組態選項。

option-def-description

選用。選項的描述 (1024 個字元)。

option-def-default_value

選用。使用者未指定時應使用的預設值。

下列範例會建立選項 NPM_START

options_definitions: - namespace: "aws:elasticbeanstalk:container:custom:application" option_name: "NPM_START" description: "Default application startup command" default_value: "node application.js"
option-setting-namespace

選用。選項的命名空間。

option-setting-option_name

選用。選項的名稱。您可以指定最多 50 個 Elastic Beanstalk 提供的選項

option-setting-value

選用。使用者未指定時應使用的值。

下列範例會建立選項 TEST

option_settings: - namespace: "aws:elasticbeanstalk:application:environment" option_name: "TEST" value: "This is a test"

標記自訂平台版本

您可以將標籤套用至自 AWS Elastic Beanstalk 訂平台版本。標籤是與 AWS 資源相關聯的索引鍵值配對。如需 Elastic Beanstalk 資源標記、使用案例、標籤索引鍵和值限制條件的相關資訊,以及支援的資源類型,請參閱標記 Elastic Beanstalk 應用程式資源

您可以在建立自訂平台版本時指定標籤。您可以在現有的自訂平台版本中新增或移除標籤,以及更新現有標籤的值。您最多可以為每個自訂平台版本新增 50 個標籤。

在自訂平台版本建立期間新增標籤

如果您使用 EB 建立CLI自訂平台版本,請使用與新增標籤eb platform create--tags選項。

~/workspace/my-app$ eb platform create --tags mytag1=value1,mytag2=value2

對於 AWS CLI 或其他API基礎的用戶端,請使用create-platform-version命令上的--tags參數來新增標籤。

$ aws elasticbeanstalk create-platform-version \ --tags Key=mytag1,Value=value1 Key=mytag2,Value=value2 \ --platform-name my-platform --platform-version 1.0.0 --platform-definition-bundle S3Bucket=amzn-s3-demo-bucket,S3Key=sample.zip

管理現有自訂平台版本的標籤

您可以新增、更新和刪除現有 Elastic Beanstalk 自訂平台版本中的標籤。

如果您使用 EB CLI 更新自訂平台版本,請使用新eb tags增、更新、刪除或列出標籤。

例如,以下命令會列出自訂平台版本中的標籤。

~/workspace/my-app$ eb tags --list --resource "arn:aws:elasticbeanstalk:us-east-2:my-account-id:platform/my-platform/1.0.0"

下列命令會更新標籤 mytag1 並刪除標籤 mytag2

~/workspace/my-app$ eb tags --update mytag1=newvalue --delete mytag2 \ --resource "arn:aws:elasticbeanstalk:us-east-2:my-account-id:platform/my-platform/1.0.0"

如需完整選項清單和更多範例,請參閱 eb tags

對於 AWS CLI 或其他API基於用戶端,請使用list-tags-for-resource命令列出自訂平台版本的標籤。

$ aws elasticbeanstalk list-tags-for-resource --resource-arn "arn:aws:elasticbeanstalk:us-east-2:my-account-id:platform/my-platform/1.0.0"

使用 update-tags-for-resource 命令新增、更新或刪除自訂平台版本中的標籤。

$ aws elasticbeanstalk update-tags-for-resource \ --tags-to-add Key=mytag1,Value=newvalue --tags-to-remove mytag2 \ --resource-arn "arn:aws:elasticbeanstalk:us-east-2:my-account-id:platform/my-platform/1.0.0"

--tags-to-addupdate-tags-for-resource 參數中,同時指定欲新增和欲更新的標籤。如此將新增不存在的標籤,並更新現有標籤的值。

注意

若要將某些 EB CLI 和 AWS CLI 指令與 Elastic Beanstalk 自訂平台版本搭配使用,您需要自訂平台版本。ARN您可以使用ARN下列命令擷取。

$ aws elasticbeanstalk list-platform-versions

使用 --filters 選項來篩選輸出以縮減到您的自訂平台名稱。