在 Linux 伺服器上自訂軟體 - AWS Elastic Beanstalk

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

在 Linux 伺服器上自訂軟體

您可能想要針對您的應用程式相依使用的軟體,來進行自訂和設定。您可以新增要在執行個體佈建期間執行的命令;定義 Linux 使用者和群組;以及在您的環境執行個體上下載或直接建立檔案。這些檔案可能是應用程式所需的相依檔案 (例如由 yum 儲存庫所提供的其他套件),或組態檔案 (例如代理組態檔案的替代檔案,可用來覆寫 Elastic Beanstalk 預設的特定設定)。

本節說明可以在組態檔案中納入的資訊類型,此等組態檔案是用來針對執行 Linux 的 EC2 執行個體,自訂其上的軟體。如需自訂和設定 Elastic Beanstalk 環境的一般資訊,請參閱設定 Elastic Beanstalk 環境。關於針對執行 Windows 的 EC2 執行個體,來自訂其上的軟體,詳細資訊請參閱 在 Windows Server 上自訂軟體

備註
  • 在 Amazon Linux 2 平台上,我們強烈建議您使用 Buildfile,而不要在 .ebextensions 組態檔案中提供檔案和命令。Procfile平台掛鉤會盡可能在執行個體佈建期間,在您的環境執行個體上設定和執行自訂程式碼。如需有關這些機制的詳細資訊,請參閱 擴充 Elastic Beanstalk Linux 平台

  • YAML 憑藉一致的縮排。請在取代範例組態檔中的內容時,讓縮排層級一致,並確認您的文字編輯器使用空格而非定位字元進行縮排。

組態檔案支援下列金鑰,這些金鑰會對執行您應用程式的 Linux 伺服器造成影響。

這些金鑰會以此列的順序處理。

觀看您環境的事件的同時,開發與測試組態檔案。Elastic Beanstalk 忽略組態檔案,其中包含驗證錯誤,例如無效的金鑰,並不處理同一個檔案其他任何金鑰。當發生這種情況,Elastic Beanstalk 會將警告事件新增到事件日誌。

套件

您可以使用 packages 金鑰,來下載和安裝預先整裝好的應用程式與元件。

語法

packages: name of package manager: package name: version ... name of package manager: package name: version ... ...

您可以使用每個套件管理工具的金鑰來指定多個套件。

支援的套件格式

Elastic Beanstalk 目前支援下列的套件軟體管理工具:yum、rubygems、python 和 rpm。套件會以下列順序處理:rpm、yum,然後是 rubygems 和 python。rubygems 和 python 沒有一定的先後順序。在每個套件管理工具內,不保證套件安裝順序。請使用您的作業系統支援的套件軟體管理工具。

注意

Elastic Beanstalk 支援 Python 適用的兩種基本套件軟體管理工具:pip 和 easy_install。不過,在組態檔案的語法中,您必須將套件軟體管理工具的名稱指定為 python。當您使用組態檔案指定 Python 套件管理工具時,Elastic Beanstalk 會使用 Python 2.7。如果您的應用程式倚賴不同版本的 Python,您可以在 requirements.txt 檔案中指定要安裝的套件。如需更多詳細資訊,請參閱 使用 Elastic Beanstalk 上的需求文件指定依賴關係

指定版本

在每個套件管理工具中,系統會以套件名稱和版本清單來指定各個套件。版本可以是字串、版本清單,亦能是空白字串或清單;空白字串或清單代表要安裝最新版本。如果管理工具為 rpm 格式,則系統會以磁碟上的檔案路徑或 URL 來指定版本。不支援相對路徑。

如果您指定套件的版本,則即使在執行個體上已經安裝該套件的較新版本,Elastic Beanstalk 也會試著安裝您指定的版本。如果已經安裝較新的版本,部署作業會失敗。部分套件管理工具支援多個版本,有些則不支援。如需詳細資訊,請參閱套件管理工具的文件。如果您並未指定版本,而且套件已經安裝某版本,則 Elastic Beanstalk 不會安裝新版本,因為 Elastic Beanstalk 假設您想要保留和使用現有的版本。

範例程式碼片段

下列的程式碼片段針對 rpm 指定了版本 URL、要求 yum 的最新版本,以及 rubygems 的 chef 0.10.2 版。

packages: yum: libmemcached: [] ruby-devel: [] gcc: [] rpm: epel: http://download.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm rubygems: chef: '0.10.2'

群組

您可以使用 groups 金鑰來建立 Linux/UNIX 群組和指派群組 ID。若要建立群組,請新增一組新的索引鍵/值組,此對組會將新的群組名稱對應至選用的群組 ID。groups 金鑰可以包含一個或多個群組名稱。下表會列出可用的金鑰。

語法

groups: name of group: {} name of group: gid: "group id"

選項

gid

群組 ID 編號。

如果指定了群組 ID,而該群組的名稱已存在,則群組建立作業會失敗;如果另一個群組已具有指定的 ID,作業系統可能會拒絕群組的建立。

範例程式碼片段

下列程式碼片段指定了名為 groupOne 的群組 (未指派群組 ID),以及名為 groupTwo 的群組 (指定群組 ID 值 45)。

groups: groupOne: {} groupTwo: gid: "45"

使用者

您可以使用 users 金鑰,在 EC2 執行個體上建立 Linux/UNIX 使用者。

語法

users: name of user: groups: - name of group uid: "id of the user" homeDir: "user's home directory"

選項

uid

使用者 ID。如果使用者名稱具有不同的使用者 ID,則建立程序會失敗。如果該使用者 ID 已指派給現有的使用者,作業系統可能會拒絕建立要求。

groups

群組名稱清單。使用者會新增到清單中的各群組。

homeDir

使用者的主目錄。

會使用 /sbin/nologin 的 shell,來將使用者建立為非互動式系統的使用者。這是設計本身所致,無法修改。

範例程式碼片段

users: myuser: groups: - group1 - group2 uid: "50" homeDir: "/tmp"

來源

您可以使用 sources 金鑰,從公開的 URL 下載封存檔案,然後將檔案解壓縮至 EC2 執行個體上的目標目錄。

語法

sources: target directory: location of archive file

支援的格式

支援的格式包括 tar、tar+gzip、tar+bz2 和 zip。只要 URL 是可公開存取,您就可以參照 Amazon Simple Storage Service (Amazon S3) 等外部位置 (例如,https://mybucket.s3.amazonaws.com/myobject)。

範例程式碼片段

下列範例從 Amazon S3 儲存貯體下載了公有的 .zip 檔案,並將該檔案解壓縮至 /etc/myapp

sources: /etc/myapp: https://mybucket.s3.amazonaws.com/myobject
注意

多項擷取不應重複使用相同的目標路徑。擷取另一個相同目標路徑的來源,將會取代而不是附加資料到內容。

檔案

透過 files 金鑰,即可在 EC2 執行個體上建立檔案。此內容可以內嵌於組態檔案,或是從 URL 取得。檔案會依詞典編纂順序寫入磁碟。

您可以提供授權用的執行個體描述檔,以使用 files 金鑰來從 Amazon S3 下載私有檔案。

如果您指定的檔案路徑已經存在於例證上,則會保留現有檔案,並將副檔名 .bak 附加至其名稱。

語法

files: "target file location on disk": mode: "six-digit octal value" owner: name of owning user for file group: name of owning group for file source: URL authentication: authentication name: "target file location on disk": mode: "six-digit octal value" owner: name of owning user for file group: name of owning group for file content: | # this is my # file content encoding: encoding format authentication: authentication name:

選項

content

要新增到檔案的字串內容。請指定 contentsource 其中之一。

source

要下載檔案的 URL。請指定 contentsource 其中之一。

encoding

使用 content 選項所指定字串的編碼格式。

有效值:plain | base64

group

擁有檔案的 Linux 群組。

owner

擁有檔案的 Linux 使用者。

mode

六位數的 8 進制值,代表此檔案的模式;Windows 系統不支援此金鑰。請使用前三位數來建立符號連結,並採用後三位數來設定許可。若要建立符號連結,請指定 120xxx,其中 xxx 定義目標檔案的許可。若要指定檔案的許可,請使用三個數字,例如 000644

authentication

所要使用 AWS CloudFormation 身分驗證方法的名稱。您可以利用 Resources (資源) 金鑰,在 Auto Scaling 群組的中繼資料中新增身分驗證方法。如需範例,請參閱下列內容。

範例程式碼片段

files: "/home/ec2-user/myfile" : mode: "000755" owner: root group: root source: http://foo.bar/myfile "/home/ec2-user/myfile2" : mode: "000755" owner: root group: root content: | this is my file content

使用符號連結的範例。這會建立一個 /tmp/myfile2.txt 連結,指向現有檔案 /tmp/myfile1.txt

files: "/tmp/myfile2.txt" : mode: "120400" content: "/tmp/myfile1.txt"

下列範例使用了 Resources (資源) 金鑰來新增名為 S3Auth 的身分驗證方法,並使用此方法,從 Amazon S3 儲存貯體下載私有檔案。

Resources: AWSEBAutoScalingGroup: Metadata: AWS::CloudFormation::Authentication: S3Auth: type: "s3" buckets: ["elasticbeanstalk-us-west-2-123456789012"] roleName: "Fn::GetOptionSetting": Namespace: "aws:autoscaling:launchconfiguration" OptionName: "IamInstanceProfile" DefaultValue: "aws-elasticbeanstalk-ec2-role" files: "/tmp/data.json" : mode: "000755" owner: root group: root authentication: "S3Auth" source: https://elasticbeanstalk-us-west-2-123456789012.s3-us-west-2.amazonaws.com/data.json

命令

您可以使用 commands 金鑰來執行 EC2 執行個體上的指令。在設定應用程式和 Web 伺服器和解壓縮應用程式版本的檔案之前執行命令。

以根使用者身分執行指定的命令,並依照名稱的字母順序處理。根據預設,指令會在根目錄中執行。若要從其他目錄來執行指令,請使用 cwd 選項。

若要對命令的問題進行疑難排解,您可以在執行個體日誌中尋找命令的輸出。

語法

commands: command name: command: command to run cwd: working directory env: variable name: variable value test: conditions for command ignoreErrors: true

選項

command

指定要執行命令的陣列 (YAML 語法的區塊序列集合) 或字串。部分重要說明:

  • 如果使用字串,您不需要將整個字串括在引號中。如果使用引號,請逸出出現的相同類型引號常值。

  • 如果使用陣列,則不需跳脫空格字元或用引號括起指令參數。每個陣列元素是單一命令引數。不使用陣列指定多個命令。

以下範例都是同等的:

commands: command1: command: git commit -m "This is a comment." command2: command: "git commit -m \"This is a comment.\"" command3: command: 'git commit -m "This is a comment."' command4: command: - git - commit - -m - This is a comment.

若要指定多個命令,請使用常值區塊純量,如下所示。

commands: command block: command: | git commit -m "This is a comment." git push
env

(選用) 設定命令用的環境變數。此屬性會進行覆寫,而非附加至現有的環境。

cwd

(選用) 工作目錄。若未指定,指令會從根目錄 (/) 執行。

test

(選用) 此指令必須傳回 true 值 (結束代碼 0),Elastic Beanstalk 才能處理 command 金鑰中包含的指令 (例如 shell 指令碼)。

ignoreErrors

(選用) 一個布林值,在 command 金鑰中所包含的指令失敗時 (傳回非零的值),可用來判定其他的指令是否應該執行。如果即使命令失敗,也想繼續執行命令,請將此值設定為 true。如果要在命令失敗時停止執行命令,請將此值設定為 false。預設值為 false

範例程式碼片段

下列的範例片段執行了 Python 指令碼。

commands: python_install: command: myscript.py cwd: /home/ec2-user env: myvarname: myvarvalue test: "[ -x /usr/bin/python ]"

服務

您可以使用 services 金鑰,來定義執行個體啟動時應啟動或停止的服務。services 金鑰也可讓您指定來源、套件與檔案的相依關係,因此如果安裝中的檔案需要重新啟動,則 Elastic Beanstalk 會負責重新啟動服務。

語法

services: sysvinit: name of service: enabled: "true" ensureRunning: "true" files: - "file name" sources: - "directory" packages: name of package manager: "package name[: version]" commands: - "name of command"

選項

ensureRunning

設定為 true,以確保服務會在 Elastic Beanstalk 完成後執行。

設定為 false,以確保服務不會在 Elastic Beanstalk 完成後執行。

如果略過此金鑰,將不會改變服務狀態。

enabled

設定為 true,來確保服務會在開機時自動啟動。

設定為 false,來確保服務不會在開機時自動啟動。

如果略過此金鑰,將不會改變此屬性。

files

檔案清單。如果 Elastic Beanstalk 透過檔案區塊直接變更檔案,服務會重新啟動。

sources

目錄清單。如果 Elastic Beanstalk 將封存解壓縮至這些目錄的其中之一,服務會重新啟動。

packages

套件軟體管理工具與套件名稱清單的對應圖。如果 Elastic Beanstalk 安裝或更新這些套件的其中之一,服務會重新啟動。

commands

命令名稱清單。如果 Elastic Beanstalk 執行指定的命令,服務會重新啟動。

範例程式碼片段

下列是範例程式碼片段:

services: sysvinit: myservice: enabled: true ensureRunning: true

容器命令

您可以使用 container_commands 金鑰,來執行會影響您應用程式原始碼的指令。容器命令的執行會在應用程式和 Web 伺服器設定完成及應用程式版本封存檔解壓縮之後,但是在應用程式版本安裝之前。非容器的命令及其他自訂操作,則會在應用程式的原始碼解壓縮之前執行。

以根使用者身分執行指定的命令,並依照名稱的字母順序處理。容器命令會從暫存目錄執行,您的原始碼會在部署到應用程式伺服器之前,先解壓縮到該目錄。當原始碼部署到最終的位置時,您使用容器命令對暫存目錄中原始碼所進行的變更,也會納入部署。

注意

容器命令的輸出會記錄在 cfn-init-cmd.log 執行個體日誌中。如需擷取和檢視執行個體日誌的詳細資訊,請參閱從 Amazon EC2 執行個體檢視日誌

如果只要在單一執行個體上執行指令,您可以使用 leader_only 選項;或者,請將 test 設定為只在測試指令得出的評估值為 true 時,才執行指令。僅限領導者的容器命令,只會在環境建立與部署時執行;其他的命令與伺服器自訂操作,則會在每次佈建或更新執行個體時執行。僅限領導者的容器命令會因為啟動組態變更 (例如變更 AMI ID 或執行個體類型) 而不執行。

語法

container_commands: name of container_command: command: "command to run" leader_only: true name of container_command: command: "command to run"

選項

command

要執行的字串或字串陣列。

env

(選用) 在執行命令前先設定環境變數,覆寫掉任何現有的值。

cwd

(選用) 工作目錄。根據預設,這是已經解壓縮應用程式的暫存目錄。

leader_only

(選用) 只在 Elastic Beanstalk 所選擇的單一執行個體上執行指令。僅限領導者的容器命令會先於其他容器命令執行。命令可以是只限領導者或具有 test,但只能是其中一種 (leader_only 會具有優先性)。

test

(選用) 執行測試命令,此命令必須傳回 true 才能執行容器命令。命令可以是只限領導者或具有 test,但只能是其中一種 (leader_only 會具有優先性)。

ignoreErrors

(選用) 如果容器命令傳回 0 以外的值 (成功),則請勿讓部署失敗。設定為 true 以啟用。

範例程式碼片段

下列是範例程式碼片段。

container_commands: collectstatic: command: "django-admin.py collectstatic --noinput" 01syncdb: command: "django-admin.py syncdb --noinput" leader_only: true 02migrate: command: "django-admin.py migrate" leader_only: true 99customize: command: "scripts/customize.sh"