本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
您可能希望创建一个使用由另一个 AWS 账户创建或管理的资源的管道。例如,您可能希望将一个账户用于您的管道,将另一个账户用于您的 CodeDeploy 资源。
注意
当您创建一个包含多个账户的操作的管道时,必须配置您的操作,以使它们仍可以在跨账户管道的限制范围内访问构件。跨账户操作适用以下限制:
-
通常,只有在以下情况下,操作才能使用构件:
-
操作所属账户与管道账户相同,或者
-
构件是在管道账户中为另一个账户中的操作创建的,或者
-
构件是由操作所属账户中的先前操作生成的
换句话说,如果两个账户都不是管道账户,则无法将构件从一个账户传递到另一个账户。
-
-
以下操作类型不支持跨账户操作:
-
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
能够编辑管道以使用 AccountB
创建的 CodeDeploy 应用程序,AccountA
必须:
-
请求
AccountB
的 ARN 或账户 ID(在本演练中,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
必须:
-
请求
AccountA
的 ARN 或账户 ID(在本演练中,AccountA
ID 为012ID_ACCOUNT_A
)。 -
创建一个应用于为 CodeDeploy 配置的 Amazon EC2 实例角色的策略,该策略允许访问 Amazon S3 桶 (
codepipeline-us-east-2-1234567890
)。 -
创建一个应用于为 CodeDeploy 配置的 Amazon EC2 实例角色的策略,该策略允许访问用于对
AccountA
中的管道构件加密的客户管理的 AWS KMS 密钥。 -
配置并附加一个 IAM 角色(
CrossAccount_Role
),其信任关系策略允许AccountA
中的 CodePipeline 服务角色代入该角色。 -
创建一个允许访问管道所需的部署资源的策略,并将其附加到
CrossAccount_Role
。 -
创建一个允许访问 Amazon S3 桶 (
codepipeline-us-east-2-1234567890
) 的策略,并将其附加到CrossAccount_Role
。
先决条件:创建 AWS KMS 加密密钥
与所有 AWS KMS 密钥一样,客户管理的密钥也是特定于区域的。您必须在创建管道的同一区域(例如 us-east-2
)内创建客户管理的 AWS KMS 密钥。
在 AWS KMS 中创建客户管理的密钥
-
使用
AccountA
登录 AWS Management Console,并打开 AWS KMS 控制台。 -
在左侧,选择 客户管理的密钥。
-
选择 Create key。在配置密钥中,保留默认选中的对称,然后选择下一步。
-
在 Alias 中,键入要为该密钥使用的别名(例如
PipelineName-Key
)。(可选)提供有关该密钥的描述和标签,然后选择下一步。 -
在定义密钥管理权限中,选择您希望作为该密钥管理员的一个或多个角色,然后选择下一步。
-
在定义密钥使用权限中的此账户下,选择管道服务角色的名称(例如 CodePipeline_Service_Role)。在其他 AWS 账户下,选择添加其他 AWS 账户。输入
AccountB
的账户 ID 以完成 ARN,然后选择下一步。 -
在审核和编辑密钥策略中审核策略,然后选择完成。
-
从密钥列表中选择密钥的别名并复制其 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 桶策略(控制台)
-
使用
AccountA
登录 AWS Management Console 并打开 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 策略概述。
-
在桶策略编辑器窗口中,键入以下策略。这将允许
AccountB
访问管道项目,并且如果某个操作 (比如自定义源或生成操作) 创建了这些管道项目,则将为AccountB
提供添加输出项目的功能。在该示例中,
AccountB
的 ARN 为012ID_ACCOUNT_B
。Amazon S3 桶的 ARN 是codepipeline-us-east-2-1234567890
。将这些 ARN 分别替换为要允许访问的账户的 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 服务角色创建策略(控制台)
-
使用
AccountA
登录 AWS Management Console 并打开 IAM 控制台,网址为 https://console.aws.amazon.com/iam/。 -
在导航窗格中,选择角色。
-
在角色列表中的角色名称下,选择 CodePipeline 服务角色的名称。
-
在权限选项卡上,选择添加内联策略。
-
选择 JSON 选项卡,然后输入以下策略以允许
AccountB
代入该角色。在以下示例中,012ID_ACCOUNT_B
是AccountB
的 ARN:{ "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
中创建的管道使用在 AccountB
中创建的 CodeDeploy 资源,您必须:
-
为实例角色配置策略,允许它访问存储管道构件的 Amazon S3 桶。
-
在配置为跨账户存取的
AccountB
中创建第二个角色。第二个角色不仅必须能访问
AccountA
中的 Amazon S3 存储桶,还必须包含允许访问 CodeDeploy 资源的策略,以及允许AccountA
中 CodePipeline 服务角色代入该角色的信任关系策略。注意
这些策略专门用于设置 CodeDeploy 资源以便在使用不同 AWS 账户创建的管道中使用。其他 AWS 资源将需要特定于其资源需求的策略。
为针对 CodeDeploy 配置的 Amazon EC2 实例角色创建策略(控制台)
-
使用
AccountB
登录 AWS Management Console 并打开 IAM 控制台,网址为 https://console.aws.amazon.com/iam/。 -
在导航窗格中,选择角色。
-
在角色列表中,在角色名称下,选择用作 CodeDeploy 应用程序 Amazon EC2 实例角色的服务角色的名称。该角色名称可能不同,而且多个实例角色可以由一个部署组使用。有关更多信息,请参阅为 Amazon EC2 实例创建 IAM 实例配置文件。
-
在权限选项卡上,选择添加内联策略。
-
选择 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:aws:kms:us-east-1:012ID_ACCOUNT_A:key/2222222-3333333-4444-556677EXAMPLE
AccountA
中创建并配置为允许AccountB
使用它的客户管理密钥的 ARN:{ "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
" ] } ] }重要
您必须在此策略中使用
AccountA
的账户 ID 作为 AWS KMS 密钥的资源 ARN 的一部分,如此处所示,否则此策略将不起作用。 -
选择查看策略。
-
在 Name (名称) 中,输入此策略的名称。选择创建策略。
现在创建一个用于跨账户访问的 IAM 角色,并对其进行配置,以便 AccountA
中的 CodePipeline 服务角色可以代入该角色。该角色必须包含允许访问 AccountA
中的 CodeDeploy 资源和用于存储构件的 Amazon S3 桶的策略。
在 IAM 中配置跨账户角色
-
使用
AccountB
登录 AWS Management Console 并打开 IAM 控制台,网址为 https://console.aws.amazon.com/iam。 -
在导航窗格中,选择角色。选择 Create role(创建角色)。
-
在选择受信任实体的类型下,选择其他 AWS 账户。在指定可以使用此角色的账户下的账户 ID 中,输入要在 CodePipeline 中创建管道的账户 (
AccountA
) 的 AWS 账户 ID,然后选择下一步:权限。重要
此步骤将在
AccountB
与AccountA
之间创建信任关系策略。不过,这将授予账户根级别的访问权限,CodePipeline 建议将其范围缩小到AccountA
中的 CodePipeline 服务角色。按照步骤 16 限制权限。 -
在附加权限策略下,选择 AmazonS3ReadOnlyAccess,然后选择下一步:标签。
注意
这并不是您要使用的策略。您必须选择一个策略来完成向导。
-
选择 下一步: 审核。在角色名称中键入该角色的名称(例如
CrossAccount_Role
)。您可以任意命名该角色,只要其遵循 IAM 中的命名约定即可。考虑为该角色使用一个明确指明其用途的名称。请选择 Create Role(创建角色)。 -
从角色列表中,选择您刚创建的角色(例如
CrossAccount_Role
)以打开该角色的摘要页面。 -
在权限选项卡上,选择添加内联策略。
-
选择 JSON 选项卡,然后输入以下策略以允许访问 CodeDeploy 资源:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "codedeploy:CreateDeployment", "codedeploy:GetDeployment", "codedeploy:GetDeploymentConfig", "codedeploy:GetApplicationRevision", "codedeploy:RegisterApplicationRevision" ], "Resource": "*" } ] }
-
选择查看策略。
-
在 Name (名称) 中,输入此策略的名称。选择创建策略。
-
在权限选项卡上,选择添加内联策略。
-
在策略文档中,键入以下策略以允许该角色从
AccountA
的 Amazon S3 桶中检索输入构件,或者将输出构件放入该桶中:{ "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 角色,然后在
AccountA
中提供 CodePipeline 服务角色的 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 --name
MyFirstPipeline
>pipeline.json
输出将发送到
pipeline.json
文件。 -
在任何纯文本编辑器中打开 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" } }, -
在一个阶段中添加部署操作,以使用与
AccountB
关联的 CodeDeploy 资源,包括您创建的跨账户角色 (CrossAccount_Role
) 的roleArn
值。以下示例显示添加了一个名为
ExternalDeploy
的部署操作的 JSON。它使用名为Staging
的阶段中在AccountB
中创建的 CodeDeploy 资源。在以下示例中,AccountB
的 ARN 是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
有关更多信息,请参阅 手动启动管道。
-
使用
AccountA
登录 AWS Management Console 并打开 CodePipeline 控制台,网址为 http://console.aws.amazon.com/codesuite/codepipeline/home。 将会显示所有与您的 AWS 账户关联的管道的名称。
-
在名称中,选择您刚编辑的管道的名称。这将打开管道的详细视图,包括管道每个阶段中每个操作的状态。
-
观看管道中的进度。等待使用与另一个 AWS 账户关联的资源的操作显示成功消息。
注意
使用
AccountA
登录时,如果您尝试查看操作的详细信息,您将收到一条错误消息。注销,然后使用AccountB
登录以查看 CodeDeploy 中的部署详细信息。