本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
叢集和 EMR Notebooks 的標籤型存取的 IAM 政策
您可以在身分類型政策中使用條件,來根據標籤控制對叢集和 EMR 筆記本的存取。
如需將標籤新增至叢集的詳細資訊,請參閱標記 EMR 叢集。
下列範例示範以 Amazon EMR 條件金鑰使用條件運算子的不同情況和方式。這些 IAM 政策陳述式僅作示範用途,不應用於生產環境。有多種方法可以結合政策陳述式,以根據您的需求授予和拒絕許可。如需有關規劃與測試 IAM 政策的詳細資訊,請參閱 IAM 使用者指南。
標記動作的明確拒絕許可是項重要的考量條件。這可防止使用者標記資源並將您無意授予的許可授予給他們。如果未拒絕資源的標記動作,使用者可以修改標籤並規避標籤型政策的意圖。
叢集的身分型政策陳述式範例
下列範例示範身分型許可政策,這些政策用於控制允許與 EMR 叢集搭配使用的動作。
僅允許對具有特定標籤值的叢集執行動作
下列範例示範一個政策,可讓使用者根據具有 dev
值的叢集標籤 department
執行動作,也可讓使用者使用相同標籤標記叢集。最後一個政策範例示範如何在標記 EMR 叢集時,對該相同標籤以外的標籤拒絕權限。
在以下政策範例中,StringEquals
條件運算子嘗試以 dev
標籤的值符合 department
。若 department
標籤尚未新增到叢集,或不包含 dev
值,政策將無法套用,此政策也不允許動作。如果沒有其他政策陳述式允許動作,使用者只能使用具有此值標籤的叢集。
- JSON
-
-
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt12345678901234",
"Effect": "Allow",
"Action": [
"elasticmapreduce:DescribeCluster",
"elasticmapreduce:ListSteps",
"elasticmapreduce:TerminateJobFlows",
"elasticmapreduce:SetTerminationProtection",
"elasticmapreduce:ListInstances",
"elasticmapreduce:ListInstanceGroups",
"elasticmapreduce:ListBootstrapActions",
"elasticmapreduce:DescribeStep"
],
"Resource": [
"*"
],
"Condition": {
"StringEquals": {
"elasticmapreduce:ResourceTag/department": "dev"
}
}
}
]
}
您也可以使用條件運算子來指定多個標籤值。例如,若要在 department
標籤包含 dev
或 test
值的叢集上允許所有動作,您可以用下列內容取代先前範例中的條件區塊。
"Condition": {
"StringEquals": {
"elasticmapreduce:ResourceTag/department":["dev", "test"]
}
}
建立叢集時需要標記叢集
如同在前例中,下列政策範例也尋找同樣相符的標籤:department
標籤的 dev
值。但在此範例中,RequestTag
條件金鑰會指定此政策在標籤建立期間套用。因此,您必須建立具有與指定值相符的標籤的叢集。
若要建立具有標籤的叢集,您還必須具有 elasticmapredue:AddTags
動作的許可。對於此陳述式,elasticmapreduce:ResourceTag
條件金鑰可確保 IAM 僅授予對 department
標籤上值為 dev
的標籤資源的存取權。Resource
元素用於將此許可限制為叢集資源。
對於 PassRole
資源,您必須提供 AWS 帳戶 ID 或別名、PassRoleForEMR
陳述式中的服務角色名稱,以及PassRoleForEC2
陳述式中的執行個體描述檔名稱。如需有關 IAM ARN 格式的詳細資訊,請參閱《IAM 使用者指南》中的 IAM ARN。
如需有關相符標籤金鑰值的詳細資訊,請參閱《IAM 使用者指南》中的 aws:RequestTag/tag-key
。
- JSON
-
-
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "RunJobFlowExplicitlyWithTag",
"Effect": "Allow",
"Action": [
"elasticmapreduce:RunJobFlow"
],
"Resource": [
"*"
],
"Condition": {
"StringEquals": {
"aws:RequestTag/department": "dev"
}
}
},
{
"Sid": "AddTagsForDevClusters",
"Effect": "Allow",
"Action": [
"elasticmapreduce:AddTags"
],
"Resource": [
"arn:aws:elasticmapreduce:*:*:cluster/*"
],
"Condition": {
"StringEquals": {
"elasticmapreduce:ResourceTag/department": "dev"
}
}
},
{
"Sid": "PassRoleForEMR",
"Effect": "Allow",
"Action": [
"iam:PassRole"
],
"Resource": [
"arn:aws:iam::123456789012:role/Role-Name-With-Path"
],
"Condition": {
"StringLike": {
"iam:PassedToService": "elasticmapreduce.amazonaws.com*"
}
}
},
{
"Sid": "PassRoleForEC2",
"Effect": "Allow",
"Action": [
"iam:PassRole"
],
"Resource": [
"arn:aws:iam::123456789012:role/Role-Name-With-Path"
],
"Condition": {
"StringLike": {
"iam:PassedToService": "ec2.amazonaws.com*"
}
}
}
]
}
不論標籤值為何,允許對具有特定標籤的叢集執行動作
您也可以只在具有特定標籤的叢集上允許動作,無論標籤的值為何。若要執行此操作,您可以使用 Null
運算子。如需詳細資訊,請參閱《IAM 使用者指南》中的用於檢查條件金鑰是否存在的條件運算子。例如,若只在具有 department
標籤的 EMR 叢集上允許動作,無論其包含的值為何,您可以用以下內容取代先前範例中的條件區塊。Null
運算子會在 EMR 叢集上尋找 department
標籤的存在。如果標籤存在,Null
陳述式會判斷為 false,符合此政策陳述式中指定的條件,並允許適當的動作。
"Condition": {
"Null": {
"elasticmapreduce:ResourceTag/department":"false"
}
}
以下政策陳述式可讓使用者只在叢集具有可以包含任何值的 department
標籤時,才能建立 EMR 叢集。針對 PassRole
資源,您需要提供 AWS 帳戶 ID 或別名,以及服務角色名稱。如需有關 IAM ARN 格式的詳細資訊,請參閱《IAM 使用者指南》中的 IAM ARN。
如需有關指定 null ("false") 條件運算子的詳細資訊,請參閱《IAM 使用者指南》中的用於檢查條件金鑰是否存在的條件運算子。
- JSON
-
-
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "CreateClusterTagNullCondition",
"Effect": "Allow",
"Action": [
"elasticmapreduce:RunJobFlow"
],
"Resource": [
"*"
],
"Condition": {
"Null": {
"aws:RequestTag/department": "false"
}
}
},
{
"Sid": "AddTagsNullCondition",
"Effect": "Allow",
"Action": [
"elasticmapreduce:AddTags"
],
"Resource": [
"arn:aws:elasticmapreduce:*:*:cluster/*"
],
"Condition": {
"Null": {
"elasticmapreduce:ResourceTag/department": "false"
}
}
},
{
"Sid": "PassRoleForElasticMapReduce",
"Effect": "Allow",
"Action": [
"iam:PassRole"
],
"Resource": [
"arn:aws:iam::123456789012:role/Role-Name-With-Path"
],
"Condition": {
"StringLike": {
"iam:PassedToService": "elasticmapreduce.amazonaws.com*"
}
}
},
{
"Sid": "PassRoleForEC2",
"Effect": "Allow",
"Action": [
"iam:PassRole"
],
"Resource": [
"arn:aws:iam::123456789012:role/Role-Name-With-Path"
],
"Condition": {
"StringLike": {
"iam:PassedToService": "ec2.amazonaws.com*"
}
}
}
]
}
本章節中的 IAM 政策陳述式範例示範了常見的案例,利用金鑰來限制使用 EMR Notebooks 時的允許動作。只要沒有其他的政策和允許動作的委託人 (使用者) 具有關聯,條件上下文索引鍵就會如範例所示,限制允許的動作。
範例
– 僅允許存取使用者根據標記建立的 EMR Notebooks下列政策陳述式範例在附接至角色或使用者時,會允許使用者只使用自己已經建立的筆記本。此政策陳述式會使用在筆記本建立時套用的預設標籤。
在此範例中,StringEquals
條件運算子嘗試將表示目前使用者的使用者 ID ({aws:userId}
) 的變數與標籤 creatorUserID
的值進行比對。如果 creatorUserID
標籤尚未新增到筆記本,或是未包含目前使用者 ID 的值,政策將無法套用,此政策也不允許動作。如果沒有其他政策陳述式允許這些動作,則使用者只能使用具有此標籤和此值的筆記本。
- JSON
-
-
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"elasticmapreduce:DescribeEditor",
"elasticmapreduce:StartEditor",
"elasticmapreduce:StopEditor",
"elasticmapreduce:DeleteEditor",
"elasticmapreduce:OpenEditorInConsole"
],
"Effect": "Allow",
"Resource": [
"*"
],
"Condition": {
"StringEquals": {
"elasticmapreduce:ResourceTag/creatorUserId": "${aws:userId}"
}
},
"Sid": "AllowELASTICMAPREDUCEDescribeeditor"
}
]
}
範例 – 在筆記本建立時需要標記筆記本
在此範例中使用了 RequestTag
上下文索引鍵。只有在使用者未變更或刪除預設新增的 creatorUserID
標籤時,才會允許 CreateEditor
動作。變數 ${aws:userId} 會指定目前有效使用者的使用者 ID,這是標籤的預設值。
此政策陳述式可用來協助確保使用者不會移除 createUserId
標籤或變更其值。
- JSON
-
-
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"elasticmapreduce:CreateEditor"
],
"Effect": "Allow",
"Resource": [
"*"
],
"Condition": {
"StringEquals": {
"elasticmapreduce:RequestTag/creatorUserId": "${aws:userid}"
}
},
"Sid": "AllowELASTICMAPREDUCECreateeditor"
}
]
}
此範例要求使用者建立叢集,此叢集的標籤包含索引鍵字串 dept
,而且其值設定為下列其中一項:datascience
、analytics
、operations
。
- JSON
-
-
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"elasticmapreduce:CreateEditor"
],
"Effect": "Allow",
"Resource": [
"*"
],
"Condition": {
"StringEquals": {
"elasticmapreduce:RequestTag/dept": [
"datascience",
"analytics",
"operations"
]
}
},
"Sid": "AllowELASTICMAPREDUCECreateeditor"
}
]
}
範例 – 限制只有加上標籤的叢集才能建立筆記本,而且需要筆記本標籤
只有當筆記本在建立時使用標籤,而此標籤包含索引鍵字串 owner
,且設定為其中一個指定值時,此範例才會允許建立筆記本。此外,只有叢集的標籤包含索引鍵字串 department
,且設定為其中一個指定值時,才可以建立筆記本。
- JSON
-
-
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"elasticmapreduce:CreateEditor"
],
"Effect": "Allow",
"Resource": [
"*"
],
"Condition": {
"StringEquals": {
"elasticmapreduce:RequestTag/owner": [
"owner1",
"owner2",
"owner3"
],
"elasticmapreduce:ResourceTag/department": [
"dep1",
"dep3"
]
}
},
"Sid": "AllowELASTICMAPREDUCECreateeditor"
}
]
}
範例 – 根據標籤來限制啟動筆記本的能力
此範例會設下限制,只有當筆記本的標籤包含索引鍵字串 owner
,且設定為其中一個指定值時,才會讓這些筆記本擁有啟動筆記本的能力。由於 Resource
元素只用來指定 editor
,因此條件不適用於叢集,而且不需要加上標籤。
- JSON
-
-
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"elasticmapreduce:StartEditor"
],
"Effect": "Allow",
"Resource": [
"arn:aws:elasticmapreduce:*:123456789012:editor/*"
],
"Condition": {
"StringEquals": {
"elasticmapreduce:ResourceTag/owner": [
"owner1",
"owner2"
]
}
},
"Sid": "AllowELASTICMAPREDUCEStarteditor"
}
]
}
此範例與上述的範例類似。不過,限制僅適用於加上標籤的叢集,而不適用於筆記本。
- JSON
-
-
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"elasticmapreduce:StartEditor"
],
"Effect": "Allow",
"Resource": [
"arn:aws:elasticmapreduce:*:123456789012:cluster/*"
],
"Condition": {
"StringEquals": {
"elasticmapreduce:ResourceTag/department": [
"dep1",
"dep3"
]
}
},
"Sid": "AllowELASTICMAPREDUCEStarteditor"
}
]
}
此範例使用不同的一組筆記本和叢集標籤。只有在下列的情況中,此範例才會允許筆記本啟動:
- JSON
-
-
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"elasticmapreduce:StartEditor"
],
"Effect": "Allow",
"Resource": [
"arn:aws:elasticmapreduce:*:123456789012:editor/*"
],
"Condition": {
"StringEquals": {
"elasticmapreduce:ResourceTag/owner": [
"user1",
"user2"
]
}
},
"Sid": "AllowELASTICMAPREDUCEStarteditorByOwner"
},
{
"Action": [
"elasticmapreduce:StartEditor"
],
"Effect": "Allow",
"Resource": [
"arn:aws:elasticmapreduce:*:123456789012:cluster/*"
],
"Condition": {
"StringEquals": {
"elasticmapreduce:ResourceTag/department": [
"datascience",
"analytics"
]
}
},
"Sid": "AllowELASTICMAPREDUCEStarteditorByDepartment"
}
]
}
範例 – 根據標籤來限制開啟筆記本編輯器的能力
只有在下列的情況中,此範例才會允許開啟筆記本編輯器:
- JSON
-
-
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"elasticmapreduce:OpenEditorInConsole"
],
"Effect": "Allow",
"Resource": [
"arn:aws:elasticmapreduce:*:123456789012:editor/*"
],
"Condition": {
"StringEquals": {
"elasticmapreduce:ResourceTag/owner": [
"user1",
"user2"
]
}
},
"Sid": "AllowELASTICMAPREDUCEOpeneditorconsoleByOwner"
},
{
"Action": [
"elasticmapreduce:OpenEditorInConsole"
],
"Effect": "Allow",
"Resource": [
"arn:aws:elasticmapreduce:*:123456789012:cluster/*"
],
"Condition": {
"StringEquals": {
"elasticmapreduce:ResourceTag/department": [
"datascience",
"analytics"
]
}
},
"Sid": "AllowELASTICMAPREDUCEOpeneditorconsoleByDepartment"
}
]
}