本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在 Linux 伺服器上自訂軟體
本節說明可以在組態檔案中納入的資訊類型,此等組態檔案是用來針對執行 Linux 的 EC2 執行個體,自訂其上的軟體。如需自訂和設定 Elastic Beanstalk 環境的一般資訊,請參閱設定 Elastic Beanstalk 環境。關於針對執行 Windows 的 EC2 執行個體,來自訂其上的軟體,詳細資訊請參閱 在 Windows Server 上自訂軟體。
您可能想要針對您的應用程式相依使用的軟體,來進行自訂和設定。您可以新增要在執行個體佈建期間執行的命令;定義 Linux 使用者和群組;以及在您的環境執行個體上下載或直接建立檔案。這些檔案可能是應用程式所需的相依檔案 (例如由 yum 儲存庫所提供的其他套件),或組態檔案 (例如代理組態檔案的替代檔案,可用來覆寫 Elastic Beanstalk 預設的特定設定)。
備註
-
在 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://amzn-s3-demo-bucket.s3.amazonaws.com/myobject
)。
範例程式碼片段
下列範例從 Amazon S3 儲存貯體下載了公有的 .zip 檔案,並將該檔案解壓縮至 /etc/myapp
:
sources:
/etc/myapp: https://amzn-s3-demo-bucket.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
-
要新增到檔案的字串內容。請指定
content
或source
其中之一。 source
-
要下載檔案的 URL。請指定
content
或source
其中之一。 encoding
-
使用
content
選項所指定字串的編碼格式。有效值:
plain
|base64
group
-
擁有檔案的 Linux 群組。
owner
-
擁有檔案的 Linux 使用者。
mode
-
六位數的 8 進制值,代表此檔案的模式;Windows 系統不支援此金鑰。請使用前三位數來建立符號連結,並採用後三位數來設定許可。若要建立符號連結,請指定
120
,其中xxx
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: ["amzn-s3-demo-bucket2
"]
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"