本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在 中建立管道 CodePipeline ,該管道使用來自另一個 AWS 帳戶的資源
您可能希望建立一個管道,該管道使用由另一個 AWS 帳戶建立或管理的資源。例如,您可能想要將一個帳戶用於管道,將另一個帳戶用於 CodeDeploy 資源。
注意
使用來自多個帳戶的動作建立管道時,您必須設定帳戶,讓它們在跨帳戶管道的限制內仍可存取成品。以下限制適用於跨帳戶動作:
-
通常,若為下列情況,動作只能取用一個成品:
-
動作與管道帳戶 OR 位於同一帳戶
-
已在道管帳戶中為另一個帳戶 OR 中的動作建立成品
-
與此動作位於同一帳戶的前一動作已產生成品
換言之,您無法將成品從一個帳戶傳遞至另一個帳戶,如果任一帳戶都不是管道帳戶的話。
-
-
以下動作類型不支援跨帳戶動作:
-
Jenkins 建置動作
-
在此範例中,您必須建立要使用的 AWS Key Management Service (AWS KMS) 金鑰、將金鑰新增至管道,以及設定帳戶政策和角色以啟用跨帳戶存取。對於金鑰 AWS KMS,您可以使用金鑰 ID、金鑰 ARN或別名 ARN。
注意
只有建立KMS金鑰的帳戶才能識別別名。對於跨帳戶動作,您只能使用金鑰 ID 或金鑰ARN來識別金鑰。跨帳戶動作涉及使用來自其他帳戶 (AccountB) 的角色,因此指定金鑰 ID 將使用其他帳戶 (AccountB) 中的金鑰。
在此演練及其範例中,AccountA
是最初用來建立管道的帳戶。它可以存取用於存放管道成品的 Amazon S3 儲存貯體,以及 所使用的服務角色 AWS CodePipeline。AccountB
是 最初用來建立 CodeDeploy 應用程式、部署群組和服務角色的帳戶 CodeDeploy。
用於 AccountA
編輯管道以使用 建立 CodeDeploy 的應用程式 AccountB
, AccountA
必須:
-
請求 的 ARN或 帳戶 ID
AccountB
(在此演練中,AccountB
ID 為012ID_ACCOUNT_B
). -
在 區域的管道中建立或使用 AWS KMS 客戶受管金鑰,並授予許可以使用該金鑰給服務角色 (
CodePipeline_Service_Role
) 和AccountB
. -
建立授予 Amazon S3 儲存貯體政策
AccountB
存取 Amazon S3 儲存貯體 (例如,codepipeline-us-east-2-1234567890
). -
建立允許 的政策
AccountA
擔任由 設定的角色AccountB
,並將該政策連接至服務角色 (CodePipeline_Service_Role
). -
編輯管道以使用客戶受管 AWS KMS 金鑰,而非預設金鑰。
用於 AccountB
允許存取在 中建立的管道的資源 AccountA
, AccountB
必須:
-
請求 的 ARN或 帳戶 ID
AccountA
(在此演練中,AccountA
ID 為012ID_ACCOUNT_A
). -
建立套用至為 設定的 Amazon EC2執行個體角色的政策 CodeDeploy ,以允許存取 Amazon S3 儲存貯體 (
codepipeline-us-east-2-1234567890
). -
建立套用至 中設定之 Amazon EC2執行個體角色的政策 CodeDeploy ,允許存取用於加密 中管道成品 AWS KMS 的客戶受管金鑰
AccountA
. -
設定和連接IAM角色 (
CrossAccount_Role
),其信任關係政策允許 中的 CodePipeline 服務角色AccountA
擔任該角色。 -
建立允許存取管道所需部署資源的政策,並將其連接至
CrossAccount_Role
. -
建立允許存取 Amazon S3 儲存貯體 (
codepipeline-us-east-2-1234567890
) 並將其連接至CrossAccount_Role
.
必要條件:建立 AWS KMS 加密金鑰
客戶受管金鑰是區域特有的,所有 AWS KMS 金鑰也是如此。您必須在建立管道的相同區域中建立客戶受管 AWS KMS 金鑰 (例如 us-east-2
)。
若要在 中建立客戶受管金鑰 AWS KMS
-
AWS Management Console 使用 登入
AccountA
並開啟 AWS KMS 主控台。 -
在左側選擇 Customer managed keys (客戶受管金鑰)。
-
選擇建立金鑰。在 Configure key (設定金鑰) 中,保持 Symmetric (對稱) 預設值的選取狀態,然後選擇 Next (下一步)。
-
在別名 中,輸入要用於此金鑰的別名 (例如,
PipelineName-Key
)。 或者,提供此金鑰的描述和標籤,然後選擇下一步。 -
在定義金鑰管理許可 中,選擇您要擔任此金鑰管理員的角色,然後選擇下一個 。
-
在定義金鑰用量許可 中,在此帳戶 下,選取管道的服務角色名稱 (例如 CodePipeline_Service_Role)。在其他 AWS 帳戶 下,選擇新增另一個 AWS 帳戶 。輸入 的帳戶 ID
AccountB
完成 ARN,然後選擇下一步 。 -
在 Review and edit key policy (檢閱和編輯金鑰政策) 中檢閱政策,然後選擇 Finish (完成)。
-
從金鑰清單中,選擇金鑰的別名,然後複製其 ARN(例如,
)。在您編輯管道和設定政策時將需要用到這項資料。arn:aws:kms:us-east-2:012ID_ACCOUNT_A:key/2222222-3333333-4444-556677EXAMPLE
步驟 1:設定帳戶政策與角色
建立 AWS KMS 金鑰後,您必須建立並連接政策,以啟用跨帳戶存取。這需要來自兩者的動作 AccountA
以及 AccountB
.
在帳戶中設定將建立管道的政策和角色 (AccountA
)
若要建立使用與其他 AWS 帳戶相關聯 CodeDeploy 資源的管道,AccountA
必須為用於存放成品的 Amazon S3 儲存貯體和 的服務角色設定政策 CodePipeline。
為授予 AccountB 存取權的 Amazon S3 儲存貯體建立政策 (主控台)
-
AWS Management Console 使用 登入
AccountA
並在 開啟 Amazon S3 主控台https://console.aws.amazon.com/s3/。 -
在 Amazon S3 儲存貯體清單中,選擇儲存管道成品的 Amazon S3 儲存貯體。此儲存貯體名為
codepipeline-
,其中region
-1234567EXAMPLE
region
是您在其中建立管道的 AWS 區域,以及1234567EXAMPLE
是十位數隨機數字,可確保儲存貯體名稱是唯一的 (例如,codepipeline-us-east-2-1234567890
). -
在 Amazon S3 儲存貯體的詳細資訊頁面上,選擇屬性 。
-
在屬性窗格中,展開 Permissions (許可),然後選擇 Add bucket policy (新增儲存貯體政策)。
注意
如果政策已連接至您的 Amazon S3 儲存貯體,請選擇編輯儲存貯體政策 。然後,您可以按以下範例新增陳述式至現有政策。若要新增政策,請選擇連結,然後遵循 AWS 政策產生器中的指示。如需詳細資訊,請參閱IAM政策概觀。
-
在 Bucket Policy Editor (儲存貯體政策編輯器) 視窗中,輸入以下政策。這將允許
AccountB
對管道成品的存取,並將提供AccountB
如果自訂來源或建置動作等動作建立輸出成品,則能夠新增輸出成品。在下列範例中, ARN 適用於
AccountB
是012ID_ACCOUNT_B
。 Amazon S3 儲存貯體ARN的 是codepipeline-us-east-2-1234567890
。 ARNs 將這些項目取代ARN為您想要允許存取的帳戶的 ,以及 Amazon S3 儲存貯體ARN的 :{ "Version": "2012-10-17", "Id": "SSEAndSSLPolicy", "Statement": [ { "Sid": "DenyUnEncryptedObjectUploads", "Effect": "Deny", "Principal": "*", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::
codepipeline-us-east-2-1234567890
/*", "Condition": { "StringNotEquals": { "s3:x-amz-server-side-encryption": "aws:kms" } } }, { "Sid": "DenyInsecureConnections", "Effect": "Deny", "Principal": "*", "Action": "s3:*", "Resource": "arn:aws:s3:::codepipeline-us-east-2-1234567890
/*", "Condition": { "Bool": { "aws:SecureTransport": false } } }, { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::012ID_ACCOUNT_B:root
" }, "Action": [ "s3:Get*", "s3:Put*" ], "Resource": "arn:aws:s3:::codepipeline-us-east-2-1234567890
/*" }, { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::012ID_ACCOUNT_B:root
" }, "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::codepipeline-us-east-2-1234567890
" } ] } -
選擇 Save (儲存),然後關閉政策編輯器。
-
選擇儲存以儲存 Amazon S3 儲存貯體的許可。
為 CodePipeline (主控台) 的服務角色建立政策
-
AWS Management Console 使用 登入
AccountA
並在 開啟IAM主控台https://console.aws.amazon.com/iam/。 -
在導覽窗格中,選擇角色。
-
在角色清單中的角色名稱 下,選擇 的服務角色名稱 CodePipeline。
-
在許可標籤上,選擇新增內嵌政策。
-
選擇 JSON 索引標籤,然後輸入下列政策以允許
AccountB
擔任該角色。在下列範例中,012ID_ACCOUNT_B
是 ARN的AccountB
:{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": [ "arn:aws:iam::
012ID_ACCOUNT_B
:role/*" ] } } -
選擇檢閱政策。
-
在 Name (名稱) 中,輸入此政策的名稱。選擇 建立政策。
在擁有 AWS 資源的 帳戶中設定政策和角色 (AccountB
)
當您在 中建立應用程式、部署和部署群組時 CodeDeploy,您也可以建立 Amazon EC2執行個體角色 。(若您使用執行部署逐步說明精靈,將為您建立此角色,但您也可以手動建立角色。) 對於在 中建立的管道 AccountA
使用在 中建立 CodeDeploy 的資源 AccountB
,您必須:
-
為執行個體角色設定政策,允許其存取儲存管道成品的 Amazon S3 儲存貯體。
-
在 中建立第二個角色
AccountB
已設定為跨帳戶存取。第二個角色不僅可以存取 中的 Amazon S3 儲存貯體
AccountA
,它還必須包含允許存取 CodeDeploy 資源的政策,以及允許 中的 CodePipeline 服務角色的信任關係政策AccountA
擔任該角色。注意
這些政策專門用於設定資源 CodeDeploy ,以便在使用不同 AWS 帳戶建立的管道中使用。其他 AWS 資源將需要針對其資源需求的政策。
為 (主控台) 設定的 Amazon CodeDeploy EC2執行個體角色建立政策
-
AWS Management Console 使用 登入
AccountB
並在 開啟IAM主控台https://console.aws.amazon.com/iam/。 -
在導覽窗格中,選擇角色。
-
在角色清單中的角色名稱 下,選擇用作 CodeDeploy 應用程式 Amazon EC2執行個體角色的服務角色名稱。此角色名稱可能不同,且部署群組可使用一個以上的執行個體角色。如需詳細資訊,請參閱為您的 Amazon IAM Instances 建立EC2執行個體設定檔。
-
在許可標籤上,選擇新增內嵌政策。
-
選擇 JSON 索引標籤,然後輸入下列政策,以授予 所使用的 Amazon S3 儲存貯體存取權
AccountA
儲存管道的成品 (在此範例中,codepipeline-us-east-2-1234567890
):{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:Get*" ], "Resource": [ "arn:aws:s3:::
codepipeline-us-east-2-1234567890
/*" ] }, { "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::codepipeline-us-east-2-1234567890
" ] } ] } -
選擇檢閱政策。
-
在 Name (名稱) 中,輸入此政策的名稱。選擇 建立政策。
-
為 AWS KMS 中建立的客戶受管金鑰ARN的
建立第二個政策arn:aws:kms:us-east-1:012ID_ACCOUNT_A:key/2222222-3333333-4444-556677EXAMPLE
AccountA
並設定為允許AccountB
使用它:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kms:DescribeKey", "kms:GenerateDataKey*", "kms:Encrypt", "kms:ReEncrypt*", "kms:Decrypt" ], "Resource": [ "arn:aws:kms:us-east-1:
012ID_ACCOUNT_A:key/2222222-3333333-4444-556677EXAMPLE
" ] } ] }重要
您必須使用 的帳戶 ID
AccountA
作為ARN AWS KMS 金鑰資源的一部分,如此處所示,否則政策將無法運作。 -
選擇檢閱政策。
-
在 Name (名稱) 中,輸入此政策的名稱。選擇 建立政策。
現在建立用於跨帳戶存取IAM的角色,並加以設定,讓 中的 CodePipeline 服務角色 AccountA
可以擔任 角色。此角色必須包含允許存取 CodeDeploy 資源的政策,以及用於存放成品的 Amazon S3 儲存貯體 AccountA
.
若要在 中設定跨帳戶角色 IAM
-
AWS Management Console 使用 登入
AccountB
並在 https://console.aws.amazon.com/iam開啟IAM主控台。 -
在導覽窗格中,選擇 Roles (角色)。選擇 Create Role (建立角色)。
-
在 Select type of trusted entity (選取信任的實體類型) 下,選擇 Another AWS account (另一個 帳戶)。在指定可使用此角色的帳戶 下,在帳戶 ID 中輸入 AWS 將在 CodePipeline (
AccountA
),然後選擇下一步:許可。重要
此步驟會在 之間建立信任關係政策
AccountB
以及AccountA
。 不過,這將授予帳戶的根層級存取權,並 CodePipeline 建議將其縮小至 中的 CodePipeline 服務角色AccountA
。 請遵循步驟 16 來限制許可。 -
在連接許可政策 下,選擇 AmazonS3ReadOnlyAccess,然後選擇下一步:標籤 。
注意
這並非您將使用的政策。您必須選擇一個政策以完成精靈。
-
選擇下一步:檢閱。在角色名稱中輸入此角色的名稱 (例如,
CrossAccount_Role
)。 只要遵循 中的命名慣例,您就可以將此角色命名為任何您想要的角色IAM。可考慮給予角色清楚說明其用途的名稱。選擇建立角色。 -
從角色清單中,選擇您剛建立的角色 (例如,
CrossAccount_Role
) 開啟該角色的摘要頁面。 -
在許可標籤上,選擇新增內嵌政策。
-
選擇 JSON索引標籤,然後輸入下列政策以允許存取 CodeDeploy 資源:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "codedeploy:CreateDeployment", "codedeploy:GetDeployment", "codedeploy:GetDeploymentConfig", "codedeploy:GetApplicationRevision", "codedeploy:RegisterApplicationRevision" ], "Resource": "*" } ] }
-
選擇檢閱政策。
-
在 Name (名稱) 中,輸入此政策的名稱。選擇 建立政策。
-
在許可標籤上,選擇新增內嵌政策。
-
選擇 JSON索引標籤,然後輸入下列政策,以允許此角色從 Amazon S3 儲存貯體擷取輸入成品,並將輸出成品放入其中
AccountA
:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject*", "s3:PutObject", "s3:PutObjectAcl" ], "Resource": [ "arn:aws:s3:::
codepipeline-us-east-2-1234567890
/*" ] } ] } -
選擇檢閱政策。
-
在 Name (名稱) 中,輸入此政策的名稱。選擇 建立政策。
-
在許可索引標籤上,在政策名稱 下的政策清單中尋找 AmazonS3ReadOnlyAccess,然後選擇政策旁邊的刪除圖示 (X)。出現提示時,選擇 Detach (分離)。
-
選取信任關係索引標籤,然後選擇編輯信任政策 。選擇左欄上的新增主體選項。對於主體類型 ,選擇IAM角色 ,然後在 中提供 ARN 中的 CodePipeline 服務角色
AccountA
。arn:aws:iam::Account_A:root
從AWS 主體 的清單中移除 ,然後選擇更新政策 。
步驟 2:編輯管道
您無法使用 CodePipeline 主控台建立或編輯使用與其他 AWS 帳戶相關聯資源的管道。不過,您可以使用主控台建立管道的一般結構,然後使用 AWS CLI 編輯管道並新增這些資源。或者,您可以使用現有管道的架構,並手動將資源加入其中。
新增與另一個 AWS 帳戶相關聯的資源 (AWS CLI)
-
在終端機 (Linux、macOS 或 Unix) 或命令提示字元 (Windows) 中,在您要新增資源的管道上執行get-pipeline命令。將命令輸出複製到 JSON 檔案。例如,對於名為 的管道 MyFirstPipeline,您可以輸入類似下列內容:
aws codepipeline get-pipeline --name
MyFirstPipeline
>pipeline.json
輸出會傳送至
pipeline.json
file. -
在任何純文字編輯器中開啟 JSON 檔案。在成品存放
"type": "S3"
區中,新增 KMS encryptionKey、ID 並輸入資訊,其中codepipeline-us-east-2-1234567890
是用於存放管道成品的 Amazon S3 儲存貯體名稱,
也是您剛建立的客戶受管金鑰ARN的 :arn:aws:kms:us-east-1:012ID_ACCOUNT_A:key/2222222-3333333-4444-556677EXAMPLE
{ "artifactStore”: { "location": "
codepipeline-us-east-2-1234567890
", "type": "S3", "encryptionKey": { "id": "arn:aws:kms:us-east-1:012ID_ACCOUNT_A:key/2222222-3333333-4444-556677EXAMPLE
", "type": "KMS" } }, -
在階段中新增部署動作,以使用與 相關聯的 CodeDeploy 資源
AccountB
,包括您建立的跨帳戶角色roleArn
的值 (CrossAccount_Role
).下列範例顯示 JSON 新增名為 的部署動作
ExternalDeploy
。 它使用在 中建立 CodeDeploy 的資源AccountB
在名為 的階段中Staging
。 在下列範例中, ARN的AccountB
是012ID_ACCOUNT_B
:, { "name": "Staging", "actions": [ { "inputArtifacts": [ { "name": "MyAppBuild" } ], "name": "
ExternalDeploy
", "actionTypeId": { "category": "Deploy", "owner": "AWS", "version": "1", "provider": "CodeDeploy" }, "outputArtifacts": [], "configuration": { "ApplicationName": "AccountBApplicationName
", "DeploymentGroupName": "AccountBApplicationGroupName
" }, "runOrder": 1, "roleArn": "arn:aws:iam::012ID_ACCOUNT_B
:role/CrossAccount_Role
" } ] }注意
這並非整個管道JSON的 ,而只是階段中動作的結構。
-
您必須從檔案移除
metadata
行,以讓 update-pipeline 命令可以使用它。從JSON檔案中的管道結構中移除 區段 ("metadata": { }
行和"created"
、"pipelineARN"
和"updated"
欄位)。例如,從結構中移除下列幾行:
"metadata": { "pipelineArn": "arn:aws:codepipeline:
region
:account-ID
:pipeline-name
", "created": "date
", "updated": "date
" }儲存檔案。
-
若要套用變更,請執行 update-pipeline命令,指定管道JSON檔案,如下所示:
重要
請確認在檔案名稱之前包含
file://
。這是此命令必要項目。aws codepipeline update-pipeline --cli-input-json file://
pipeline.json
此命令會傳回所編輯管道的整個結構。
測試使用與其他 AWS 帳戶相關聯資源的管道
-
在終端機 (Linux、macOS 或 Unix) 或命令提示字元 (Windows) 執行 start-pipeline-execution命令,指定管道的名稱,如下所示:
aws codepipeline start-pipeline-execution --name MyFirstPipeline
如需詳細資訊,請參閱手動啟動管道。
-
AWS Management Console 使用 登入
AccountA
並開啟主控台, CodePipeline網址為 https://http://console.aws.amazon.com/codesuite/codepipeline/home。 與 AWS 您的帳戶相關聯的所有管道名稱都會顯示。
-
在 Name (名稱) 中,選擇您剛編輯的管道名稱。這會開啟管道的詳細檢視,包含管道中各階段的每項動作之狀態。
-
從管道觀看進度。等待使用與其他 AWS 帳戶相關聯資源之動作的成功訊息。
注意
如果您在使用 登入時嘗試檢視動作的詳細資訊,將會收到錯誤
AccountA
。 登出,然後使用 登入AccountB
檢視 中的部署詳細資訊 CodeDeploy。