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