Codepipeline 跨账号访问 Codecommit

news2024/11/24 6:21:17

背景

大型企业中代码仓库通常存放在各部门开发账户中,而流水线则位于独立 DevOps 账户中。

本文我们将介绍如何创建跨账号访问 Codecommit 代码仓库的 Codepipeline 流水线,即 CodePipeline 调用另一个账号中的 Codecommit 代码仓库。


亚马逊云科技开发者社区 为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活动与竞赛等。帮助中国开发者对接世界最前沿技术,观点,和项目,并将中国优秀开发者或技术推荐给全球云社区。如果你还没有关注/收藏,看到这里请一定不要匆匆划过,点这里 让它成为你的技术宝库!

部署架构图

权限配置

  1. CodePipeline 执行 role – CodePipelineServiceRole,关键 IAM Policy:允许 CodePipeline assume account B 中的角色 “AssumeAdminRole”。
  2. AssumeAdminRole – CodePipeline-SourceStage 实际执行 role, 添加 policy 以具有以下权限
    • 允许被 Account A 中 CodePipeline Assume
    • 允许访问本账户中的 CodeCommit
    • 允许访问 Account A 中的 S3桶(存放 sourceArtifact)
    • 允许访问 Account A 中的 KMS
  3. 配置 KMS Policy, 允许 CodePipelineServiceRole 和 AssumeAdminRole 访问 kms 中相应的key
  4. 配置 S3 Bucket Policy,允许 AssumeAdminRole 访问 S3中相应的bucket
  5. CodeBuild 执行 role,可配置为自动生成,不是本文重点

流水线执行过程

  1. 触发流水线
  2. SourceStage 中首先 assume AssumeAdminRole,获得访问 CodeCommit 权限
  3. 从 AccountB CodeCommit 代码仓库拉取代码
  4. 将放 sourceArtifact 存入 S3桶
  5. S3 服务端加密
  6. 执行 Build Stage: CodeBuild

账号准备

选择您所在的 region,本文以北京 Region 为例。

准备两个 Amazon 主账号:

  • 代码仓库账号 B:提供 Codecommit 服务,源代码放在这里。
  • pipeline 账号 A:提供 Codepipeline 服务,以及相关联的codebuild、kms 密钥和 s3桶

代码仓库账号 B

一、创建跨账号 IAM Role

该 Role 命名为 assume-admin-role,使用权限如下:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "kms:Decrypt",
                "kms:Encrypt",
                "kms:DescribeKey",
                "s3:GetObject*",
                "s3:PutObjectAcl",
                "kms:ReEncrypt*",
                "kms:GenerateDataKey*"
            ],
            "Resource": [
                " arn:aws-cn:kms:cn-north-1:<Account_A_ID>:key/XXX-XXX-XXX-XXX ",
                "arn:aws-cn:s3:::codecommit-sdv-cross-account/*"
            ]
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "codecommit:List*"
            ],
            "Resource": "arn:aws-cn:s3:::codecommit-sdv-cross-account/*"
        }
    ]
}

该 Role 的信任关系如下:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws-cn:iam::<Account_A_ID>:root"
                ]
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

二、创建 CodeCommit Repository

该 Repo 命名为:cros-account-b-repo,并在该 Repo 中创建文件 demo.txt。

流水线账号 A

三、创建 Codepipeline IAM Role

创建 IAM Role,名为:AWSCodePipelineServiceRole-cn-north-1-sdv-pipeline-cros,为 Codepipeline 的创建做准备。

该 role 关联 Codepipeline 默认 Role 的权限策略,具体如下:

{
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iam:PassRole"
            ],
            "Resource": "*",
            "Condition": {
                "StringEqualsIfExists": {
                    "iam:PassedToService": [
                        "cloudformation.amazonaws.com",
                        "elasticbeanstalk.amazonaws.com",
                        "ec2.amazonaws.com",
                        "ecs-tasks.amazonaws.com"
                    ]
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "codecommit:CancelUploadArchive",
                "codecommit:GetBranch",
                "codecommit:GetCommit",
                "codecommit:GetRepository",
                "codecommit:GetUploadArchiveStatus",
                "codecommit:UploadArchive"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "codedeploy:CreateDeployment",
                "codedeploy:GetApplication",
                "codedeploy:GetApplicationRevision",
                "codedeploy:GetDeployment",
                "codedeploy:GetDeploymentConfig",
                "codedeploy:RegisterApplicationRevision"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "elasticbeanstalk:*",
                "ec2:*",
                "elasticloadbalancing:*",
                "autoscaling:*",
                "cloudwatch:*",
                "s3:*",
                "sns:*",
                "cloudformation:*",
                "rds:*",
                "sqs:*",
                "ecs:*"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "lambda:InvokeFunction",
                "lambda:ListFunctions"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "cloudformation:CreateStack",
                "cloudformation:DeleteStack",
                "cloudformation:DescribeStacks",
                "cloudformation:UpdateStack",
                "cloudformation:CreateChangeSet",
                "cloudformation:DeleteChangeSet",
                "cloudformation:DescribeChangeSet",
                "cloudformation:ExecuteChangeSet",
                "cloudformation:SetStackPolicy",
                "cloudformation:ValidateTemplate"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "codebuild:BatchGetBuilds",
                "codebuild:StartBuild",
                "codebuild:BatchGetBuildBatches",
                "codebuild:StartBuildBatch"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "servicecatalog:ListProvisioningArtifacts",
                "servicecatalog:CreateProvisioningArtifact",
                "servicecatalog:DescribeProvisioningArtifact",
                "servicecatalog:DeleteProvisioningArtifact",
                "servicecatalog:UpdateProduct"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "cloudformation:ValidateTemplate"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ecr:DescribeImages"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "states:DescribeExecution",
                "states:DescribeStateMachine",
                "states:StartExecution"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "appconfig:StartDeployment",
                "appconfig:StopDeployment",
                "appconfig:GetDeployment"
            ],
            "Resource": "*"
        }
    ],
    "Version": "2012-10-17"
}

除了默认权限策略,为了提供跨账号调用,该 Role 还需要加入如下权限策略:

{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Allow",
        "Action": "sts:AssumeRole",
        "Resource": [
            "arn:aws-cn:iam::<Account_B_ID>:role/*"
        ]
    }
}

四、创建 KMS 秘钥

创建名为:account_a_cros_kms 的 KMS 秘钥。

在定义秘钥使用权限时,需要加入 Codepipeline 所关联的 Role(上一步创建名为:AWSCodePipelineServiceRole-cn-north-1-sdv-pipeline-cros 的 IAM Role)和 Account B 的账号 ID。记录 KMS ARN 为:arn:aws-cn:kms:cn-north-1:<Account_A_ID>:key/XXX-XXX-XXX-XXX

五、创建 S3桶

这里创建名为:codecommit-sdv-cross-account 的 S3桶。

这里 S3桶命名为 codecommit-sdv-cross-account。然后编辑存储桶权限,即权限->存储通权限,点击编辑按钮,添加如下 policy json:

{
"Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Statement1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws-cn:iam::<Account_B_ID>:root"
            },
            "Action": [
                "s3:Get*",
                "s3:Put*"
            ],
            "Resource": "arn:aws-cn:s3:::codecommit-sdv-cross-account/*"
        },
        {
            "Sid": "Statement2",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws-cn:iam:: <Account_B_ID>:root"
            },
            "Action": "s3:ListBucket",
            "Resource": "arn:aws-cn:s3:::codecommit-sdv-cross-account"
        }
    ]
}

六、创建 CodeBuild

创建名为:sdv-build 的 codebuild 项目,供 codepipeline 调用。

在 Buildspec 中添加命令如下:

七、创建 Codepipeline

对于跨账号调用 Codecommit 的 Codepipeline 只能通过 Amazon CLI 创建,准备如下 pipeline.json 文件

{
    "pipeline": {
        "roleArn": "arn:aws-cn:iam::<Account_A_ID>:role/service-role/AWSCodePipelineServiceRole-cn-north-1-sdv-pipeline-cros", 
        "stages": [
            {
                "name": "Source", 
                "actions": [
                    {
                        "inputArtifacts": [], 
                        "name": "Source", 
                        "region": "cn-north-1", 
                        "namespace": "SourceVariables", 
                        "actionTypeId": {
                            "category": "Source", 
                            "owner": "AWS", 
                            "version": "1", 
                            "provider": "CodeCommit"
                        }, 
                        "outputArtifacts": [
                            {
                                "name": "SourceArtifact"
                            }
                        ], 
                        "roleArn":"arn:aws-cn:iam::<Account_B_ID>:role/assume-admin-role",
                        "configuration": {
                            "BranchName": "master", 
                            "PollForSourceChanges": "false", 
                            "RepositoryName": "cros-account-b-repo"
                        }, 
                        "runOrder": 1
                    }
                ]
            }, 
            {
                "name": "Build", 
                "actions": [
                    {
                        "inputArtifacts": [
                            {
                                "name": "SourceArtifact"
                            }
                        ], 
                        "name": "Build", 
                        "region": "cn-north-1", 
                        "namespace": "BuildVariables", 
                        "actionTypeId": {
                            "category": "Build", 
                            "owner": "AWS", 
                            "version": "1", 
                            "provider": "CodeBuild"
                        }, 
                        "outputArtifacts": [
                            {
                                "name": "BuildArtifact"
                            }
                        ], 
                        "configuration": {
                            "ProjectName": "sdv-build"
                        }, 
                        "runOrder": 1
                    }
                ]
            }
        ], 
        "artifactStore": {
            "type": "S3", 
            "location": "codecommit-sdv-cross-account",
            "encryptionKey": {
               "id": " arn:aws-cn:kms:cn-north-1:<Account_A_ID>:key/XXX-XXX-XXX-XXX ",
               "type": "KMS"
            }
       },
        "name": "pipeline-cros", 
        "version": 1
    }
}

这里计划在 Account A 创建名为 pipeline-cros的codepipeline,该 pipeline 以 Account B 的 codecommit repo: cros-account-b-repo (master branch) 作为源,并利用预先准备好的位于 Account A 的 codebuild 进行流水线的执行。

使用如上 Json,并利用 Amazon cli 执行命令如下:

amazon codepipeline create-pipeline –cli-input-json file://pipeline.json # 创建 pipeline

同时 codebuild 会打印日志如下:

……
[Container] 2022/07/18 03:23:11 Entering phase BUILD
[Container] 2022/07/18 03:23:11 Running command ls
demo.txt
[Container] 2022/07/18 03:23:11 Phase complete: BUILD State: SUCCEEDED
……

本篇作者

王帅

Amazon 专业服务团队 Devops 顾问。提倡融合文化,实践和工具的 Devops 理念,致力于帮助客户使组织能够以更高的速度和可靠性交付产品并获得业务价值。擅长平台规划,迁移和工具链设计。对新鲜事物充满热情。

冯霄鹏

Amazon 专业服务团队高级 DevOps 顾问。主要负责 DevOps 咨询和技术实施。在 DevSecOps 加速企业数字化转型方面领域拥有多年经验,对公有云、DevOps、基于云原生的微服务架构、敏捷加速研发效能等有深入的研究和热情。

文章来源:https://dev.amazoncloud.cn/column/article/630a07ad86218f3ca3e8f822?sc_medium=regulartraffic&sc_campaign=crossplatform&sc_channel=CSDN

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/430020.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Python_Scrapy学习笔记(十二)】基于Scrapy框架实现POST请求爬虫

基于Scrapy框架实现POST请求爬虫 前言 本文中介绍 如何基于 Scrapy 框架实现 POST 请求爬虫&#xff0c;并以抓取指定城市的 KFC 门店信息为例进行展示 正文 1、Scrapy框架处理POST请求方法 Scrapy框架 提供了 FormRequest() 方法来发送 POST 请求&#xff1b; FormReques…

阿里云ECS大测评【免费领阿里云套餐~】

送福利&#xff01;阿里云热门产品免费领&#xff08;含ECS&#xff09;&#xff0c;点击进入&#xff1a;https://click.aliyun.com/m/1000370359/ 本篇博客参与阿里云 ECS实例测评&#xff0c;这里采用阿里的C5.large计算型实例 本次对云服务器ECS产品能力的体验和建议&…

【2023最新】超详细图文保姆级教程:App开发新手入门(4)

之前章节我们已经完成了一个应用项目的导入、代码更新和代码提交和应用打包编译&#xff0c;本章继续讲述一下&#xff0c;如何在开发过程中进行代码的同步联机调试。 7 代码真机调试 7.1 纯静态CSS页面样式查看 代码调试有多种方式&#xff0c;如果是查看纯粹的静态样式&am…

价值迭代求解马尔可夫决策过程

Value Iteration Algorithm 其算法思想是: 在每一个状态s下&#xff0c; 之迭代算法流程如下&#xff1a; 初始化状态价值state value&#xff0c;即对每个状态的价值都赋一个初始值&#xff0c;一般是0 计算每一个状态-动作对的 动作价值函数&#xff0c;通常通过创建一个二维…

项目管理(PMP)考试:易混淆知识点汇总

请点击↑关注、收藏&#xff0c;本博客免费为你获取精彩知识分享&#xff01;有惊喜哟&#xff01;&#xff01; PMP考试中经常出现&#xff0c;但容易混淆的一些内容&#xff0c;包含15个会议、40个分析、6个矩阵、5个清单、5个审计、5个报告、4个分解结构、4个评估、3个日志…

谷歌人机验证Google reCAPTCHA

reCAPTCHA是Google公司推出的一项验证服务&#xff0c;使用十分方便快捷&#xff0c;在国外许多网站上均有使用。它与许多其他的人机验证方式不同&#xff0c;它极少需要用户进行各种识图验证。 它的使用方式如下如所示&#xff0c;只需勾选复选框即可通过人机验证。 虽然简单…

Python项目之中国数据可视化

文章目录关键词一、做什么二、怎么做1、获取数据&&处理数据2、数据库设计&&存储数据3、开发后端接口4、前端页面编写三、效果展示四、总结关键词 PythonDjangoPython网络爬虫echarts可视化阅读者&#xff08;Python基础、Django基础、H5基础&#xff09; 一、…

Linux学习笔记——UDP协议

文章目录UDP协议端格式UDP的特点面向数据报UDP的缓冲区基于UDP的应用层协议UDP使用注意事项16位的UDP校验和的校验原理UDP协议端格式 16位源端口号&#xff1a;数据从哪一个端口发出来的&#xff0c;也就是数据从哪一个进程发送出来的。在编写应用层代码的时候&#xff0c;用ui…

Git安装使用教程

Git - Downloadshttps://git-scm.com/downloads 安装 Git。可以在 Git 官网上下载安装包并按照提示进行安装。 GitHub或Gitee官网上注册一个账号&#xff0c;注册好后&#xff0c;桌面右键选择Git Bash&#xff0c;进行账号配置&#xff0c;命令如下&#xff1a; # 配置用户名…

spark第八章:Pyspark

系列文章目录 spark第一章&#xff1a;环境安装 spark第二章&#xff1a;sparkcore实例 spark第三章&#xff1a;工程化代码 spark第四章&#xff1a;SparkSQL基本操作 spark第五章&#xff1a;SparkSQL实例 spark第六章&#xff1a;SparkStreaming基本操作 spark第七章&#…

带隙基准基本原理

目录 负温度系数电压 正温度系数电压 带隙基准 小结 如何产生一个不受温度变化&#xff0c;保持恒定的电压基准呢&#xff1f; 我们假设&#xff0c;如果将两个具有相反温度系数&#xff08;TC&#xff09;的量以适当的权重相加&#xff0c;那么结果就会成为零温度系数&am…

MIT6.824 lab2C2D实验总结

2C 就是持久化一些变量&#xff0c;日志&#xff0c;任期&#xff0c;投票给谁&#xff0c;2D(lastincludeterm, lastincludeindex, snapshot)。同时最难受的是Figure8Unreliable这个测试点&#xff0c;总是几百次出现一两个错误。最后发现是对论文一句话的歧义。这里讲解一下…

Linux(DHCP原理与配置)

文章目录一 、什么是DHCP1.1DHCP定义1.2DHCP好处1.3DHCP的分配方式二 、DHCP 的工作过程三 、DHCP中的设置3.1 DHCP参数3.2 相关操作步骤一 、什么是DHCP 1.1DHCP定义 DHCP&#xff08;动态主机配置协议&#xff09;是一个局域网的网络协议。指的是由服务器控制一段IP地址范围…

swagger文件上传接口没有选择文件按钮问题解决 使用@RequestPart注解

在使用文件上传API时&#xff0c;swagger没有选择文件按钮 在MultipartFile前面加上RequestPart注解 PostMapping("/importFile")ApiOperation(value "文件上传API")public Object importFile(ApiParam(value "文件流", required true) Reque…

超越ChatGpt,最近爆火的AutoGPT 究竟是什么

一、AutoGPT是什么 最近几天&#xff0c;一款基于GPT-4的最强语言模型AutoGPT火遍了整个AI圈。众所周知&#xff0c;此前爆火AI圈的ChatGPT&#xff0c;唯一不太好用的地方就是需要人类不断的prompt。因此&#xff0c;如果你想要ChatGPT帮你去做一件复杂的事情&#xff0c;那么…

第九章 法律责任与法律制裁

第九章 法律责任与法律制裁_副本 目录 第一节 法律责任的概念 一 法律责任的含义二 法律责任的特点 第二节 法律责任的分类与竞合 一 法律责任的分类 &#xff08;一&#xff09;根据责任行为所违反的法律的性质 民事责任&#xff1a;刑事责任行政责任违宪责任 &#xff08;二…

【云原生 • Docker】cAdvisor+Prometheus+Grafana 10分钟搞定Docker容器监控平台

文章目录cAdvisorPrometheusGrafana 10分钟搞定Docker容器监控平台cAdvisor部署Prometheus部署Grafana部署cAdvisorPrometheusGrafana 10分钟搞定Docker容器监控平台 cAdvisor(Container Advisor) 是 Google 开源的一个容器监控工具&#xff0c;可用于对容器资源的使用情况和性…

企业级信息系统开发讲课笔记3.1 基于配置文件整合SSM框架实现用户登录

文章目录零、本节学习目标一、采用MVC架构二、用户登录运行效果三、基于XML配置方式整合SSM框架实现用户登录&#xff08;一&#xff09;创建数据库与表1、创建数据库2、创建用户表3、在用户表里插入记录&#xff08;二&#xff09;创建Maven项目&#xff08;三&#xff09;项目…

【手把手刷CCF】202303-2-垦田计划100分(超简单思路,含详细解释注释与代码)

文章目录&#xff1a;故事的开头总是极尽温柔&#xff0c;故事会一直温柔……&#x1f49c;一、&#x1f333;代码如下&#xff1a;二、&#x1f335;解题思路❤️❤️❤️忙碌的敲代码也不要忘了浪漫鸭&#xff01;故事的开头总是极尽温柔&#xff0c;故事会一直温柔……&…

vector使用+模拟实现

目录 vector介绍 常见接口 构造函数 迭代器 容量操作 元素访问 增删查改 模拟实现 模拟实现要点图解 整体代码 迭代器失效问题 内部失效 外部失效 深浅拷贝问题 vector介绍 vector是表示可变大小数组的序列式容器。vector采用连续的空间存储元素&#xff0c;大小…