本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
在中 CodePipeline 创建一个使用来自另一个管道的资源 AWS 账户
您可能希望创建一个使用由另一个 AWS 账户创建或管理的资源的管道。例如,您可能希望将一个账户用于您的管道,将另一个账户用于您的 CodeDeploy 资源。
注意
当您创建一个包含多个账户的操作的管道时,必须配置您的操作,以使它们仍可以在跨账户管道的限制范围内访问构件。跨账户操作适用以下限制:
-
通常,只有在以下情况下,操作才能使用构件:
-
操作所属账户与管道账户相同,或者
-
构件是在管道账户中为另一个账户中的操作创建的,或者
-
构件是由操作所属账户中的先前操作生成的
换句话说,如果两个账户都不是管道账户,则无法将构件从一个账户传递到另一个账户。
-
-
Cross-account 以下操作类型不支持操作:
-
Jenkins 构建操作
-
在此示例中,您必须创建一个 AWS Key Management Service (AWS KMS) 密钥才能使用,将密钥添加到管道中,并设置账户策略和角色以启用跨账户访问。对于 AWS KMS 密钥,您可以使用密钥 ID、密钥 ARN 或别名 ARN。
注意
别名只能在创建 KMS 密钥的账户中识别。对于跨账户操作,您只能使用密钥 ID 或密钥 ARN 来识别密钥。 Cross-account 操作涉及使用来自其他账户(AccountB)的角色,因此指定密钥 ID 将使用来自其他账户(AccountB)的密钥。
在本演练及其示例中,AccountA是最初用于创建管道的帐户。它可以访问用于存储管道对象的 Amazon S3 存储桶和使用的服务角色 AWS CodePipeline。AccountB是最初用于创建所使用的 CodeDeploy 应用程序、部署组和服务角色的帐户 CodeDeploy。
AccountA要编辑管道以使用由创建的 CodeDeploy 应用程序AccountB,AccountA必须:
-
请求的 ARN 或账户 ID
AccountB(在本演练中,AccountBID 为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(在本演练中,AccountAID 为012ID_ACCOUNT_A)。 -
创建适用于为其配置的 Amazon EC2 实例角色的策略 CodeDeploy ,该策略允许访问 Amazon S3 存储桶 (
codepipeline-us-east-2-1234567890)。 -
创建适用于配置的 Amazon EC2 实例角色的策略 CodeDeploy ,该策略允许访问用于加密管道对象的 AWS KMS 客户管理密钥
AccountA。 -
使用允许中的 CodePipeline 服务角色代入该角色的信任关系策略配置和附加 IAM 角色 (
CrossAccount_Role)。AccountA -
创建允许访问管道所需的部署资源的策略并将其附加到
CrossAccount_Role。 -
创建允许访问 Amazon S3 存储桶 (
codepipeline-us-east-2-1234567890) 的策略并将其附加到CrossAccount_Role。
先决条件:创建一个 AWS KMS 加密密钥
Customer-managed 密钥是特定于某个区域的,所有 AWS KMS 密钥也是如此。您必须在创建管道的同一区域(例如us-east-2)中创建客户管理 AWS KMS 密钥。
要在中创建客户管理的密钥 AWS KMS
-
使用登录 AWS 管理控制台
AccountA并打开 AWS KMS 控制台。 -
在左侧,选择 客户管理的密钥。
-
选择创建密钥。在配置密钥中,保留默认选中的对称,然后选择下一步。
-
在别名中,输入用于此密钥的别名(例如,
PipelineName-Key)。(可选)提供有关该密钥的描述和标签,然后选择下一步。 -
在定义密钥管理权限中,选择您希望作为该密钥管理员的一个或多个角色,然后选择下一步。
-
在 “定义密钥使用权限” 中的 “此帐户” 下,选择管道的服务角色的名称(例如, CodePipeline_Service_Role)。在 “其他 AWS 帐户” 下,选择 “添加其他 AWS 帐户” 。输入的账户 ID
AccountB以完成 ARN,然后选择 “下一步”。 -
在审核和编辑密钥策略中审核策略,然后选择完成。
-
从密钥列表中选择密钥的别名并复制其 ARN(例如
)。在您编辑您的管道和配置策略时将会需要此密钥。arn:aws:kms:us-east-2:012ID_ACCOUNT_A:key/2222222-3333333-4444-556677EXAMPLE
步骤 1:设置账户策略和角色
创建 AWS KMS 密钥后,必须创建和附加允许跨账户访问的策略。这需要AccountA和都采取行动AccountB。
在将创建管道的账户中配置策略和角色 (账户 A)
要创建使用与其他 AWS 账户关联的 CodeDeploy 资源的管道,AccountA必须为用于存储对象的 Amazon S3 存储桶和的服务角色配置策略 CodePipeline。
创建授予 AccountB 访问权限的 Amazon S3 桶策略(控制台)
-
AWS 管理控制台 使用登录
AccountA并打开 Amazon S3 控制台,网址为https://console.aws.amazon.com/s3/。 -
在 Amazon S3 桶列表中,选择用于存储您的管道构件的 Amazon S3 桶。此存储桶命名
codepipeline-,其中region-1234567EXAMPLEregion是您创建管道的 AWS 区域,1234567EXAMPLE是一个十位数的随机数,可确保存储桶名称是唯一的(例如,codepipeline-us-east-2-1234567890)。 -
在 Amazon S3 桶的详细信息页面上,选择属性。
-
在属性窗格中,展开 Permissions,然后选择 Add bucket policy。
注意
如果一个策略已附加到您的 Amazon S3 桶,请选择编辑桶策略。然后,您可以将以下示例中的语句添加到现有策略中。要添加新策略,请选择链接,然后按照 AWS 策略生成器中的说明进行操作。有关更多信息,请参阅 IAM 策略概述。
-
在 Bucket Policy Editor 窗口中,创建一个策略,该策略将
AccountB允许AccountB访问管道对象,并允许在某个操作(例如自定义源或生成操作)创建输出对象时添加这些对象。 -
选择 Save,然后关闭策略编辑器。
-
选择保存以保存 Amazon S3 桶的权限。
为的服务角色创建策略 CodePipeline (控制台)
-
AWS 管理控制台 使用登录
AccountA并打开 IAM 控制台,网址为https://console.aws.amazon.com/iam/。 -
在导航窗格中,选择角色。
-
在角色列表中的角色名称下,选择 CodePipeline 的服务角色的名称。
-
在权限选项卡上,选择添加内联策略。
-
选择 JSON 选项卡,然后输入以下策略
AccountB以允许代入该角色。在以下示例中,ARN012ID_ACCOUNT_B是:AccountB -
选择查看策略。
-
在 Name (名称) 中,输入此策略的名称。选择创建策略。
在拥有的账户中配置策略和角色 AWS 资源(账户 B)
当您在中创建应用程序、部署和部署组时 CodeDeploy,您还会创建一个 Amazon EC2 实例角色。(如果您使用“运行部署演练”向导,系统将为您创建该角色,但您也可以手动创建该角色。) AccountA要使在中创建的管道使用在中创建的 CodeDeploy 资源AccountB,您必须:
-
为实例角色配置策略,允许它访问存储管道构件的 Amazon S3 桶。
-
在
AccountB配置为跨账户访问中创建第二个角色。第二个角色不仅必须有权访问中的 Amazon S3 存储桶
AccountA,还必须包含允许访问 CodeDeploy 资源的策略和允许中的 CodePipelineAccountA服务角色代入该角色的信任关系策略。注意
这些策略专门用于设置要在使用其他 AWS 账户创建的管道中使用的 CodeDeploy 资源。其他 AWS 资源将需要专门针对其资源需求的政策。
为配置的 Amazon EC2 实例角色创建策略 CodeDeploy (控制台)
-
AWS 管理控制台 使用登录
AccountB并打开 IAM 控制台,网址为https://console.aws.amazon.com/iam/。 -
在导航窗格中,选择角色。
-
在角色列表的角色名称下,选择用作 CodeDeploy 应用程序的 Amazon EC2 实例角色的服务角色的名称。该角色名称可能不同,而且多个实例角色可以由一个部署组使用。有关更多信息,请参阅为 Amazon EC2 实例创建 IAM 实例配置文件。
-
在权限选项卡上,选择添加内联策略。
-
选择 JSON 选项卡,然后输入以下策略以授予访问用于存储管道对象的
AccountAAmazon S3 存储桶的访问权限(在本示例中,codepipeline-us-east-2-1234567890): -
选择查看策略。
-
在 Name (名称) 中,输入此策略的名称。选择创建策略。
-
创建第二个策略,说明客户管理密钥
的 ARN 在 AWS KMS 哪里,该密钥是在哪里创建arn:aws:kms:us-east-1:012ID_ACCOUNT_A:key/2222222-3333333-4444-556677EXAMPLEAccountA并配置为AccountB允许使用的:重要
您必须使用此策略
AccountA中的账户 ID 作为 AWS KMS 密钥资源 ARN 的一部分,如此处所示,否则该策略将无法生效。 -
选择查看策略。
-
在 Name (名称) 中,输入此策略的名称。选择创建策略。
现在创建一个 IAM 角色用于跨账户访问,并对其进行配置,以便中的 CodePipeline 服务角色AccountA可以代入该角色。此角色必须包含允许访问 CodeDeploy 资源和用于存储对象的 Amazon S3 存储桶的策略AccountA。
在 IAM 中配置跨账户角色
-
AWS 管理控制台 使用登录
AccountB并打开 IAM 控制台,网址为https://console.aws.amazon.com/iam。 -
在导航窗格中,选择角色。选择创建角色。
-
在选择受信任实体的类型下,选择其他 AWS 账户。在 “指定可以使用此角色的帐户” 下的 “账户 ID” 中 ,在 CodePipeline (
AccountA) 中输入用于创建管道的账户的账户 ID,然后选择 “下一步:权限” 。 AWS重要
此步骤创建
AccountB和之间的信任关系策略AccountA。但是,这会授予账户的根级访问权限,并 CodePipeline 建议将其范围缩小到中的 CodePipelineAccountA服务角色。按照步骤 16 限制权限。 -
在 “附加权限策略” 下 AmazonS3ReadOnlyAccess,选择,然后选择 “下一步:标签” 。
注意
这并不是您要使用的策略。您必须选择一个策略来完成向导。
-
选择下一步:审核。在角色名称中键入该角色的名称(例如,
CrossAccount_Role)。您可以任意命名该角色,只要其遵循 IAM 中的命名约定即可。考虑为该角色使用一个明确指明其用途的名称。选择创建角色。 -
从角色列表中,选择您刚刚创建的角色(例如
CrossAccount_Role)以打开该角色的摘要页面。 -
在权限选项卡上,选择添加内联策略。
-
选择 JSON 选项卡,然后输入以下策略以允许访问 CodeDeploy 资源:
-
选择查看策略。
-
在 Name (名称) 中,输入此策略的名称。选择创建策略。
-
在权限选项卡上,选择添加内联策略。
-
选择 JSON 选项卡,然后输入以下策略,以允许此角色从 Amazon S3 存储桶中检索输入项目,并将输出项目放入其中
AccountA: -
选择查看策略。
-
在 Name (名称) 中,输入此策略的名称。选择创建策略。
-
在 “权限” 选项卡上,AmazonS3ReadOnlyAccess在 “策略名称” 下的策略列表中查找,然后选择策略旁边的删除图标 (X)。系统提示时,选择 Detach。
-
选择信任关系选项卡,然后选择编辑信任策略。选择左侧栏中的添加主体选项。对于委托人类型,选择 IAM 角色,然后为中的 CodePipeline
AccountA服务角色提供 ARN。从 AWS 主体列表中删除arn:aws:iam::Account_A:root,然后选择更新策略。
步骤 2:编辑管道
您不能使用 CodePipeline 控制台创建或编辑使用与其他 AWS 账户关联的资源的管道。但是,您可以使用控制台创建管道的总体结构,然后使用 AWS CLI 来编辑管道并添加这些资源。或者,您可以使用现有管道的结构并手动向其添加资源。
添加与其他资源关联的资源 AWS 账户 (AWS CLI)
-
在终端(Linux、macOS 或 Unix)或命令提示符 (Windows) 中,对您要添加资源的管道运行 get-pipeline 命令。将命令输出复制到 JSON 文件。例如,对于名为 MyFirstPipeline 的管道,您应键入类似以下的内容:
aws codepipeline get-pipeline --nameMyFirstPipeline>pipeline.json输出将会发送到
pipeline.json文件。 -
在任何纯文本编辑器中打开 JSON 文件。进入工件存储后
"type": "S3",添加 KMS 加密密钥、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。它使用在名为的阶段AccountB中创建的 CodeDeploy 资源Staging。在以下示例中,的 ARNAccountB是: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 管理控制台
AccountA并打开 CodePipeline控制台,地址为http://console.aws.amazon.com/codesuite/codepipeline/home。 将显示与您的 AWS 账户关联的所有管道的名称。
-
在名称中,选择您刚编辑的管道的名称。这将打开管道的详细视图,包括管道每个阶段中每个操作的状态。
-
观看管道中的进度。等待有关使用与其他 AWS 账户关联的资源的操作的成功消息。
注意
如果您尝试在登录时查看操作的详细信息,则会收到错误消息
AccountA。注销,然后使用登录AccountB以查看部署详细信息 CodeDeploy。