背景
資源編排服務(Resource Orchestration Service, 簡稱ROS)是阿裡雲提供的一項簡化雲計算資源管理的服務。您可以遵循ROS定義的模闆規範編寫資源棧模闆,在模闆中定義所需的雲計算資源(例如ECS執行個體、RDS資料庫執行個體)、資源間的依賴關系等。ROS的編排引擎将根據模闆自動完成所有資源的建立和配置,實作自動化部署及運維。
在建立資源棧時,允許對所有資源執行所有更新操作。預設情況下,具有資源棧更新權限的任何人均可更新資源棧中的所有資源。在更新期間,一些資源可能需要中斷。使用資源棧政策可以防止資源棧資源在資源棧更新過程中被意外更新或删除。資源棧政策是一個 JSON/YAML 文檔,該文檔定義可對指定資源執行的更新操作。
設定資源棧政策後,預設情況下将保護資源棧中的所有資源。要允許對特定資源進行更新,您可在資源棧政策中為這些資源指定明确的 Allow 語句。您隻能為每個資源棧定義一個資源棧政策,但在一個政策中可以保護多個資源。資源棧政策适用于所有嘗試更新資源棧的 ROS 使用者。您不能将不同的資源棧政策與不同的使用者關聯。
資源棧政策僅在資源棧更新過程中适用。與 RAM 政策不同,它不提供通路控制。僅将資源棧政策用作故障保護功能來防止意外更新特定資源棧資源。
關于資源棧政策的更多功能,可以參考
這裡。
功能介紹
簡單示例
我們先看一個簡單示例。下面的示例資源棧政策阻止更新
WebServers
資源:
{
"Statement" : [
{
"Effect" : "Allow",
"Action" : "Update:*",
"Principal": "*",
"Resource" : "*"
},
{
"Effect" : "Deny",
"Action" : "Update:*",
"Principal": "*",
"Resource" : "LogicalResourceId/WebServers"
}
]
}
當您設定資源棧政策時,将預設保護所有資源。為了允許對所有資源進行更新,我們添加了一個
Allow
語句來允許對所有資源執行的所有操作。雖然
Allow
語句指定所有資源,但顯式
Deny
語句将為具有
WebServers
邏輯 ID 的資源覆寫前者。此
Deny
語句阻止對
WebServers
資源進行的所有更新操作。
如何定義資源棧政策
定義資源棧政策 在建立資源棧時,未設定資源棧政策,是以允許對所有資源執行所有更新操作。要阻止對資源棧資源執行更新操作,可定義一個資源棧政策,然後對資源棧設定該政策。資源棧政策是一個 JSON/YAML 文檔,它定義 ROS 使用者可以執行的 ROS 資源棧更新操作以及這些操作應用到的資源。在建立資源棧時,可通過指定一個包含資源棧政策的文本檔案或鍵入該政策來設定資源棧政策。在資源棧上設定資源棧政策時,預設情況下會拒絕未顯式允許的任何更新。
您可定義一個帶 5 個元素的資源棧政策:
Effect
、
Action
Principal
Resource
和
Condition
。下面的僞代碼顯示了資源棧政策文法。
{
"Statement" : [
{
"Effect" : "Deny_or_Allow",
"Action" : "update_actions",
"Principal" : "*",
"Resource" : "LogicalResourceId/resource_logical_ID",
"Condition" : {
"StringEquals_or_StringLike" : {
"ResourceType" : [resource_type, ...]
}
}
}
]
}
-
Effect
确定是拒絕還是允許對指定資源執行指定的操作。您隻能指定
或Deny
,例如:Allow
說明 如果資源棧政策包含重疊語句 (同時允許和拒絕對資源進行更新),則"Effect" : "Deny"
語句始終将覆寫Deny
語句。要確定某一資源受到保護,請對該資源使用Allow
語句。Deny
-
Action
指定拒絕或允許的更新操作:
-
Update:Modify
指定在對資源應用更改期間不會中斷或有某些中斷的更新操作。
-
Update:Delete
指定删除資源的更新操作。從資源棧模闆中完全删除資源的更新都需要此操作。
-
Update:*
指定所有更新操作。星号是通配符,代表所有更新操作。
還可以指定Action
Update:Replace
作為保留功能。但替換功能,目前尚未支援。
以下示例說明如何隻指定修改和删除操作:
要允許除某個更新操作之外的所有更新操作,請使用"Action" : ["Update:Modify", "Update:Delete"]
。例如,要允許除NotAction
之外的所有更新操作,請使用Update:Delete
,如本示例中所示:NotAction
{ "Statement" : [ { "Effect" : "Allow", "NotAction" : "Update:Delete", "Principal": "*", "Resource" : "*" } ] }
-
-
Principal
指定政策應用于的實體。需要此元素,但僅支援通配符 (*),這意味着政策應用于所有主體。
-
Resource
指定将應用政策的資源的邏輯 ID。要指定資源類型,請使用
Condition
元素。
要指定一個資源,請使用其邏輯 ID。例如:
您可以對邏輯 ID 使用通配符。例如,如果您對所有相關資源使用一個通用邏輯 ID 字首,則可使用通配符指定所有資源:"Resource" : ["LogicalResourceId/myECS"]
您還可以對資源使用 Not 元素。例如,要允許對所有資源執行除某個更新之外的所有更新,請使用"Resource" : ["LogicalResourceId/Prefix*"]
元素保護該資源:NotResource
設定資源棧政策時,會拒絕未顯式允許的任何更新。通過允許更新{ "Statement" : [ { "Effect" : "Allow", "Action" : "Update:*", "Principal": "*", "NotResource" : "LogicalResourceId/WebServers" } ] }
資源之外的所有資源,會拒絕更新WebServers
資源。WebServers
-
Condition
指定應用政策的資源類型。要指定特定資源的邏輯 ID,請使用
您可以指定資源類型(如所有 ECS 和 RDS 資料庫執行個體),如以下示例所示:Resource
{ "Statement" : [ { "Effect" : "Deny", "Principal" : "*", "Action" : "Update:*", "Resource" : "*", "Condition" : { "StringEquals" : { "ResourceType" : ["ALIYUN::ECS::Instance", "ALIYUN::RDS::DBInstance"] } } }, { "Effect" : "Allow", "Principal" : "*", "Action" : "Update:*", "Resource" : "*" } ] }
語句授予對所有資源的更新權限,而Allow
語句拒絕對 ECS 和 RDS 資料庫執行個體的更新。Deny
Deny
語句始終覆寫允許操作。
您可以對資源類型使用通配符。例如,您可以使用通配符拒絕所有 ALIYUN ECS 資源(如執行個體、安全組和子網)的更新權限,如以下示例所示:
使用通配符時,必須使用 StringLike 條件。"Condition" : { "StringLike" : { "ResourceType" : ["ALIYUN::ECS::*"] } }
更多示例
以下示例政策說明如何阻止對所有資源棧資源和特定資源進行更新,并阻止特定類型的更新。
阻止對所有資源棧資源的更新
要阻止對所有資源棧資源的更新,以下政策為所有資源的所有更新操作指定
Deny
語句。
{
"Statement" : [
{
"Effect" : "Deny",
"Action" : "Update:*",
"Principal": "*",
"Resource" : "*"
}
]
}
阻止對單個資源的更新
以下政策拒絕對帶
WebServers
邏輯 ID 的虛拟機執行的所有更新操作。它使用
Allow
語句允許對所有其他資源棧資源進行全部更新操作。
Allow
語句不應用于
WebServers
資源,因為
Deny
語句始終覆寫允許操作。
{
"Statement" : [
{
"Effect" : "Deny",
"Action" : "Update:*",
"Principal": "*",
"Resource" : "LogicalResourceId/WebServers"
},
{
"Effect" : "Allow",
"Action" : "Update:*",
"Principal": "*",
"Resource" : "*"
}
]
}
您可以使用預設拒絕來獲得與上一示例相同的結果。設定資源棧政策時,ROS 會拒絕未顯式允許的任何更新。以下政策允許對除
WebServers
資源 (預設情況下,拒絕更新此資源) 之外的所有資源進行的更新。
{
"Statement" : [
{
"Effect" : "Allow",
"Action" : "Update:*",
"Principal": "*",
"NotResource" : "LogicalResourceId/WebServers"
}
]
}
說明 使用預設拒絕存在風險。如果您政策中的其他位置具有
Allow
語句 (例如,使用通配符的
Allow
語句),則可能意外授予 (原本不打算授予) 對資源的更新權限。由于顯式拒絕将覆寫任何允許操作,是以可以使用
Deny
語句確定保護資源。
阻止對資源類型的所有執行個體進行更新
以下政策拒絕針對 RDS 資料庫執行個體資源類型的所有更新操作。它使用
Allow
Allow
語句不應用于 RDS 資料庫執行個體資源,因為
Deny
{
"Statement" : [
{
"Effect" : "Deny",
"Action" : "Update:*",
"Principal": "*",
"Resource" : "*",
"Condition" : {
"StringEquals" : {
"ResourceType" : ["ALIYUN::RDS::DBInstance"]
}
}
},
{
"Effect" : "Allow",
"Action" : "Update:*",
"Principal": "*",
"Resource" : "*"
}
]
}
阻止對嵌套資源棧進行更新
以下政策拒絕針對 ROS 資源棧資源類型 (嵌套資源棧) 的所有更新操作。它使用
Allow
Allow
語句不會應用于 ROS 資源棧資源,因為
Deny
語句始終覆寫
Allow
操作。
{
"Statement" : [
{
"Effect" : "Deny",
"Action" : "Update:*",
"Principal": "*",
"Resource" : "*",
"Condition" : {
"StringEquals" : {
"ResourceType" : ["ALIYUN::ROS::Stack"]
}
}
},
{
"Effect" : "Allow",
"Action" : "Update:*",
"Principal": "*",
"Resource" : "*"
}
]
}
測試驗證
1. 在ROS控制台使用如下模闆建立一個資源棧。這個模闆包含一個名為WaitConditionHandle的資源,用于示例。
ROSTemplateFormatVersion: '2015-09-01'
Parameters:
UpdateVersion:
Type: Number
Resources:
WaitConditionHandle:
Type: ALIYUN::ROS::WaitConditionHandle
Properties:
UpdateVersion:
Ref: UpdateVersion
Outputs:
CurlCli:
Value:
Fn::GetAtt:
- WaitConditionHandle
- CurlCli
資源棧配置如下:

資源棧政策配置如下:
資源棧政策内容如下:
{
"Statement" : [
{
"Effect" : "Deny",
"Action" : "Update:*",
"Principal": "*",
"Resource" : "LogicalResourceId/WaitConditionHandle"
},
{
"Effect" : "Allow",
"Action" : "Update:*",
"Principal": "*",
"Resource" : "*"
}
]
}
2. 嘗試更新資源棧。
發現更新失敗復原。失敗原因是資源棧政策不允許更新WaitConditionHandle資源。
3.使用臨時資源棧政策更新資源棧。
該政策允許所有更新。
{
"Statement" : [
{
"Effect" : "Allow",
"Action" : "Update:*",
"Principal": "*",
"Resource" : "*"
}
]
}
發現資源棧更新成功。