aws(学习笔记第三十八课) codepipeline-build-deploy-github-manual

news2025/7/7 19:55:26

文章目录

  • aws(学习笔记第三十八课) codepipeline-build-deploy-github-manual
  • 学习内容:
    • 1. 整体架构
      • 1.1 代码链接
      • 1.2 全体处理架构
    • 2. 代码分析
      • 2.1 创建`ImageRepo`,并设定给`FargateTaskDef`
      • 2.2 创建`CodeBuild project`
      • 2.3 对`CodeBuild project`赋予权限(`ECR`的`image repo`)
      • 2.4 生成`lambda`函数触发`codebuild`的首次执行
        • 2.4.1 生成`lambda`函数触发`codebuild`
        • 2.4.2 `lambda`函数触发`codebuild`的代码
        • 2.4.3 `AWS Custom Resource`的代码
      • 2.5 创建`vpc`和`ecs cluster`
        • 2.5.1 创建`vpc`
        • 2.5.2 创建`蓝绿部署`
      • 2.5 创建`Application Loader Balancer`
      • 2.6 创建`fargate service`
      • 2.6.1 创建`fargate service`
      • 2.6.1 在`fargate service`上进行`application target group`的`attach`
      • 2.7 创建`code pipeline`
        • 2.7.2 `codepipe`整体架构
        • 2.7.1 创建`pipeline artifacts`
        • 2.7.2 创建`source stage`
        • 2.7.3 创建`build stage`
        • 2.7.4 创建`deploy stage`
      • 2.8 创建`code pipeline`
        • 2.8.1 为`code build`设定`github`的`confidential`
        • 2.8.2 最终创建`pipeline`
    • 3 执行`CDK`

aws(学习笔记第三十八课) codepipeline-build-deploy-github-manual

  • 使用codepipeline-build-deploy

学习内容:

  • 使用codepipeline,★代码库不采用codecommit,而是github
  • 使用codebuild
  • 使用codedeploy

1. 整体架构

1.1 代码链接

  • 代码链接(codepipeline-build-deploy-github-manual)
  • 同时可以参照aws(学习笔记第二十课) codecommit以及codedeploy进行开发

1.2 全体处理架构

在这里插入图片描述

2. 代码分析

2.1 创建ImageRepo,并设定给FargateTaskDef

        # Creates an Elastic Container Registry (ECR) image repository
        image_repo = ecr.Repository(self, "ImageRepo")

        # Creates a Task Definition for the ECS Fargate service
        fargate_task_def = ecs.FargateTaskDefinition(self, "FargateTaskDef")
        fargate_task_def.add_container(
            "Container",
            container_name="web",
            image=ecs.ContainerImage.from_ecr_repository(image_repo),
            port_mappings=[{"containerPort": 80}]
        )

注意,这里并没有指定具体的imageURI以及tag,这里只是指定了Image Repo(ECR)。后面会在CodeBuildStage阶段build出来docker image,并且接在CodeDeployStage阶段将该docker image部署到Fargate Service
在这里插入图片描述

2.2 创建CodeBuild project

# CodeBuild project that builds the Docker image
        build_image = codebuild.Project(
            self, "BuildImage",
            build_spec=codebuild.BuildSpec.from_source_filename(
                "buildspec.yaml"),
            source=codebuild.Source.git_hub(
                owner="bufanli",    # TODO: Replace with your GitHub username
                repo="web_app",   # TODO: Replace with your GitHub repository name
                branch_or_ref="main",
            ),
            environment=codebuild.BuildEnvironment(
                privileged=True
            ),
            environment_variables={
                "AWS_ACCOUNT_ID": codebuild.BuildEnvironmentVariable(value=os.getenv('CDK_DEFAULT_ACCOUNT') or ""),
                "REGION": codebuild.BuildEnvironmentVariable(value=os.getenv('CDK_DEFAULT_REGION') or ""),
                "IMAGE_TAG": codebuild.BuildEnvironmentVariable(value="latest"),
                "IMAGE_REPO_NAME": codebuild.BuildEnvironmentVariable(value=image_repo.repository_name),
                "REPOSITORY_URI": codebuild.BuildEnvironmentVariable(value=image_repo.repository_uri),
                "TASK_DEFINITION_ARN": codebuild.BuildEnvironmentVariable(value=fargate_task_def.task_definition_arn),
                "TASK_ROLE_ARN": codebuild.BuildEnvironmentVariable(value=fargate_task_def.task_role.role_arn),
                "EXECUTION_ROLE_ARN": codebuild.BuildEnvironmentVariable(value=fargate_task_def.execution_role.role_arn)
            }

在这里插入图片描述
这里,设定build_spec文件,在app/buildspec.yml中,

  • 设定pre_build登录ecr (‌Amazon Elastic Container Registry(ECR),方便之后的向ecr进行镜像的登录。
        commands:
          - echo Logging in to Amazon ECR...
          - aws --version
          - aws ecr get-login-password --region $REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$REGION.amazonaws.com
    
  • 进行build处理
    这里的
        commands:
          - echo Building the Docker image...
          - docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG .
          - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG
    
    注意,这里的环境给build_spec.yml传递变量都是通过env(环境变量)来传递的。
    可以看到,这里build执行docker build命令,进行docker imagebuild
    在这里插入图片描述
  • 进行post build处理
    这里的变量也同样是在codebuild中,在cdkcodebuild.project中,通过变量传递过来的。
    commands:
      - echo Pushing the Docker image...
      - docker push $AWS_ACCOUNT_ID.dkr.ecr.$REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG
      - echo Container image to be used $REPOSITORY_URI:$IMAGE_TAG
      - sed -i "s|REPOSITORY_URI|${REPOSITORY_URI}|g" taskdef.json
      - sed -i "s|IMAGE_TAG|${IMAGE_TAG}|g" taskdef.json
      - sed -i "s|TASK_ROLE_ARN|${TASK_ROLE_ARN}|g" taskdef.json
      - sed -i "s|EXECUTION_ROLE_ARN|${EXECUTION_ROLE_ARN}|g" taskdef.json
      - sed -i "s|TASK_DEFINITION_ARN|${TASK_DEFINITION_ARN}|g" appspec.yaml
      - cat appspec.yaml && cat taskdef.json

2.3 对CodeBuild project赋予权限(ECRimage repo

        # Grants CodeBuild project access to pull/push images from/to ECR repo
        image_repo.grant_pull_push(build_image)

2.4 生成lambda函数触发codebuild的首次执行

2.4.1 生成lambda函数触发codebuild

整体架构如下:

  • aws custom resource triggers lambda on create event
  • lambda executes code build project
  • code build project starts source stage,build stage and deploy stage
    在这里插入图片描述
2.4.2 lambda函数触发codebuild的代码
  • CDK代码
    注意,这里赋予了lamba权限,允许执行code build
        # Lambda function that triggers CodeBuild image build project
        trigger_code_build = lambda_.Function(
            self, "BuildLambda",
            architecture=lambda_.Architecture.ARM_64,
            code=lambda_.Code.from_asset("lambda"),
            handler="trigger-build.handler",
            runtime=lambda_.Runtime.NODEJS_18_X,
            environment={
                "CODEBUILD_PROJECT_NAME": build_image.project_name,
                "REGION": os.getenv('CDK_DEFAULT_REGION') or ""
            },
            # Allows this Lambda function to trigger the buildImage CodeBuild project
            initial_policy=[
                iam.PolicyStatement(
                    effect=iam.Effect.ALLOW,
                    actions=["codebuild:StartBuild"],
                    resources=[build_image.project_arn]
                )
            ]
        )
  • lambda函数代码
const {
  CodeBuildClient,
  StartBuildCommand,
} = require("@aws-sdk/client-codebuild");

exports.handler = async (event) => {
  const region = process.env.REGION;
  const buildProjectName = process.env.CODEBUILD_PROJECT_NAME;

  const codebuild = new CodeBuildClient({ region: region });
  const buildCommand = new StartBuildCommand({ projectName: buildProjectName });

  console.log("Triggering CodeBuild Project...");
  const buildResponse = await codebuild.send(buildCommand);
  console.log(buildResponse);

  return {
    statusCode: 200,
    body: "CodeBuild Project building...",
  };
};
2.4.3 AWS Custom Resource的代码
        # Triggers a Lambda function using AWS SDK
        trigger_lambda = custom.AwsCustomResource(
            self, "BuildLambdaTrigger",
            install_latest_aws_sdk=True,
            policy=custom.AwsCustomResourcePolicy.from_statements([
                iam.PolicyStatement(
                    effect=iam.Effect.ALLOW,
                    actions=["lambda:InvokeFunction"],
                    resources=[trigger_code_build.function_arn],
                )
            ]),
            on_create={
                "service": "Lambda",
                "action": "invoke",
                "physical_resource_id": custom.PhysicalResourceId.of("id"),
                "parameters": {
                    "FunctionName": trigger_code_build.function_name,
                    "InvocationType": "Event",
                },
            },
            on_update={
                "service": "Lambda",
                "action": "invoke",
                "parameters": {
                    "FunctionName": trigger_code_build.function_name,
                    "InvocationType": "Event",
                },
            }
        )

2.5 创建vpcecs cluster

2.5.1 创建vpc
        # Creates VPC for the ECS Cluster
        cluster_vpc = ec2.Vpc(
            self, "ClusterVpc",
            ip_addresses=ec2.IpAddresses.cidr(cidr_block="10.75.0.0/16")
        )

        # Deploys the cluster VPC after the initial image build triggers
        cluster_vpc.node.add_dependency(trigger_lambda)

注意,这里创建vpc需要依赖trigger _lambda,只有当trigger lambdaaws custom resource创建好了,才能创建vpc

2.5.2 创建蓝绿部署
  • 蓝绿部署的整体架构
    在这里插入图片描述

    • 【1】利用CodeDepoly服务,开始进行application deploy
    • 【2】生成导入新的applicationGreen Group
    • 【3】在Application对开发者设定对Green Group的访问的listener
    • 【4】开发者对Green Group进行动作确认,确保生产环境上没有问题
    • 【5】在Application对一般用户设定对访问的listener,让其指向Green Group,设定Blue Group为新的Green Group
    • 【6】删除原来的Blue Group。这里取决于设定的策略,可能不是马上删除。
  • 创建ApplicationTargetGroup(blue)蓝色目标组

            target_group_blue = elb.ApplicationTargetGroup(
                self, "BlueTargetGroup",
                target_group_name="alb-blue-tg",
                target_type=elb.TargetType.IP,
                port=80,
                vpc=cluster_vpc
            )
    

    在这里插入图片描述

  • 创建ApplicationTargetGroup(green)绿色目标组

        # Creates a new green Target Group
        target_group_green = elb.ApplicationTargetGroup(
            self, "GreenTargetGroup",
            target_group_name="alb-green-tg",
            target_type=elb.TargetType.IP,
            port=80,
            vpc=cluster_vpc
        )
    

    在这里插入图片描述

2.5 创建Application Loader Balancer

注意,这里 default_target_groups=[target_group_blue]默认的target group设成了blue group

       # Creates a new green Target Group
        target_group_green = elb.ApplicationTargetGroup(
            self, "GreenTargetGroup",
            target_group_name="alb-green-tg",
            target_type=elb.TargetType.IP,
            port=80,
            vpc=cluster_vpc
        )

        # Creates a Security Group for the Application Load Balancer (ALB)
        albSg = ec2.SecurityGroup(
            self, "AlbSecurityGroup",
            vpc=cluster_vpc,
            allow_all_outbound=True
        )
        albSg.add_ingress_rule(
            peer=ec2.Peer.any_ipv4(),
            connection=ec2.Port.tcp(80),
            description="Allows access on port 80/http",
            remote_rule=False
        )

        # Creates a public ALB
        public_alb = elb.ApplicationLoadBalancer(
            self, "PublicAlb",
            vpc=cluster_vpc,
            internet_facing=True,
            security_group=albSg
        )

        # Adds a listener on port 80 to the ALB
        alb_listener = public_alb.add_listener(
            "AlbListener80",
            open=False,
            port=80,
            default_target_groups=[target_group_blue]
        )

2.6 创建fargate service

2.6.1 创建fargate service

注意,这里直接在创建fargate service的时候,直接创建ecs cluster。并且将task defecs cluster联系起来。

        # Creates an ECS Fargate service
        fargate_service = ecs.FargateService(
            self, "FargateService",
            desired_count=1,
            service_name="fargate-frontend-service",
            task_definition=fargate_task_def,
            cluster=ecs.Cluster(
                self, "EcsCluster",
                enable_fargate_capacity_providers=True,
                vpc=cluster_vpc
            ),
            # Sets CodeDeploy as the deployment controller
            deployment_controller=ecs.DeploymentController(
                type=ecs.DeploymentControllerType.CODE_DEPLOY
            ),
        )

2.6.1 在fargate service上进行application target groupattach

 # Adds the ECS Fargate service to the ALB target group
fargate_service.attach_to_application_target_group(target_group_blue)

2.7 创建code pipeline

2.7.2 codepipe整体架构

在这里插入图片描述

2.7.1 创建pipeline artifacts
        # Creates new pipeline artifacts
        source_artifact = pipeline.Artifact("SourceArtifact")
        build_artifact = pipeline.Artifact("BuildArtifact")

在这里插入图片描述

  • source_artifact是由source_stage作成,由build_stage进行使用
  • build_artifact是由build_stage作成,由deploy_stage进行使用,并且包括:
    • appspec.yml
    • taskdef.json
2.7.2 创建source stage
        # Creates the source stage for CodePipeline
        source_stage = pipeline.StageProps(
            stage_name="Source",
            actions=[
                pipelineactions.GitHubSourceAction(
                    action_name="GitHub",
                    owner='XXXXXX',    # TODO: Replace with your GitHub username
                    repo='web_app',   # TODO: Replace with your GitHub repository name
                    branch="main",
                    oauth_token=SecretValue.secrets_manager("github-access-token-secret"),
                    output=source_artifact,
                )
            ]
        )
  • 这里,需要设定几个地方:
    • owner 这里是github工程的用户名,这里就是自己的github账号。
    • repo这里是github库的名字。
    • oauth_token,因为需要将awsurl(callback),注册给github,所以需要 oauth_token进行验证。因为awssource stage需要检测到githubcommit,自动触发code pipeline,所以需要注册url(callback)
      下面的就是讲本次example程序中的application的部分pushgithub,创建一个示例的web application
      在这里插入图片描述
  • githubwebhookscodepipeline交互
    在这里插入图片描述
  • cdk中练习使用aws secret manager
    在这里插入图片描述
2.7.3 创建build stage
        # Creates the build stage for CodePipeline
        build_stage = pipeline.StageProps(
            stage_name="Build",
            actions=[
                pipelineactions.CodeBuildAction(
                    action_name="DockerBuildPush",
                    input=pipeline.Artifact("SourceArtifact"),
                    project=build_image,
                    outputs=[build_artifact]
                )
            ]
        )
  • 这里使用source stage生成的source artifact,进行docker build,之后将docker image进行pushaws ecr
  • project设定这里要设定成前面创建的build_image
2.7.4 创建deploy stage
  • 整体构造
    在这里插入图片描述
  • 创建deployment group
    # Creates a new CodeDeploy Deployment Group
            deployment_group = codedeploy.EcsDeploymentGroup(
                self, "CodeDeployGroup",
                service=fargate_service,
                # Configurations for CodeDeploy Blue/Green deployments
                blue_green_deployment_config=codedeploy.EcsBlueGreenDeploymentConfig(
                    listener=alb_listener,
                    blue_target_group=target_group_blue,
                    green_target_group=target_group_green
                )
            )
    
  • 创建deploy stage
            # Creates the deploy stage for CodePipeline
            deploy_stage = pipeline.StageProps(
                stage_name="Deploy",
                actions=[
                    pipelineactions.CodeDeployEcsDeployAction(
                        action_name="EcsFargateDeploy",
                        app_spec_template_input=build_artifact,
                        task_definition_template_input=build_artifact,
                        deployment_group=deployment_group
                    )
                ]
            )
    

2.8 创建code pipeline

2.8.1 为code build设定githubconfidential
        # Store Github credentials to CodeBuild
        codebuild.GitHubSourceCredentials(self, "CodeBuildGitHubCreds",
            access_token=SecretValue.secrets_manager("github-access-token-secret")
        )
2.8.2 最终创建pipeline
        # Creates an AWS CodePipeline with source, build, and deploy stages
        pipeline.Pipeline(
            self, "BuildDeployPipeline",
            pipeline_name="ImageBuildDeployPipeline",
            stages=[source_stage, build_stage, deploy_stage]
        )

3 执行CDK

执行后继续更新。

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

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

相关文章

深度学习|注意力机制

一、注意力提示 随意:跟随主观意识,也就是指有意识。 注意力机制:考虑“随意线索”,有一个注意力池化层,将会最终选择考虑到“随意线索”的那个值 二、注意力汇聚 这一部分也就是讲第一大点中“注意力汇聚”那个池化…

京东店铺托管7*16小时全时护航

内容概要 京东店铺托管服务的*716小时全时护航模式,相当于给商家配了个全年无休的"运营管家"。专业团队每天从早7点到晚11点实时盯着运营数据和商品排名,连半夜流量波动都能通过智能系统秒级预警。这种全天候服务可不是单纯拼人力——系统自动…

遵循IEC62304YY/T0664:确保医疗器械软件生命周期合规性

一、EC 62304与YY/T 0664的核心定位与关系 IEC 62304(IEC 62304)是国际通用的医疗器械软件生命周期管理标准,适用于所有包含软件的医疗器械(如嵌入式软件、独立软件、移动应用等),其核心目标是确保软件的安…

20250408-报错:pre_state = state同更新现象

项目场景: 基于强化学习解决组合优化问题 问题描述 # POMO Rolloutstate, reward, done self.env.pre_step()# next_state statewith autocast():while not done:# 执行动作并获取新状态和奖励selected, prob self.model(state)# 更新状态:因为self.env.step(s…

如何在服务器里部署辅助域

辅助域(Additional Domain Controller,ADC)是指在现有的Active Directory(活动目录)架构中,新增一个或多个域控制器以提高目录服务的可用性和可靠性。以下是辅助域的定义、功能和应用场景的详细说明&#x…

GNSS有源天线和无源天线

区别 需要外部供电的就是有源天线,不需要外部供电的是无源天线。 无源天线 一般就是一个陶瓷片、金属片等,结构简单,成本低廉,占用空间及体积小,适合于强调紧凑型空间的导航类产品。 不需要供电,跟设备直…

欧税通香港分公司办公室正式乔迁至海港城!

3月20日,欧税通香港分公司办公室正式乔迁至香港油尖旺区的核心商业区海港城!左手挽着内地市场,右手牵起国际航道——这波乔迁选址操作堪称“地理课代表”! 乔迁仪式秒变行业大联欢!感谢亚马逊合规团队、亚马逊云、阿里国际站、Wayfair、coupang、美客多…

ETPNav:基于演进拓扑规划的连续环境视觉语言导航模型

1、现有工作的缺陷: 最近,出现了一种基于模块化航路点的方法的新兴趋势,该方法将复杂任务分为航路点生成、子目标规划和导航控制: (1)在每个决策循环中,代理使用预训练的网络来预测附近的几个…

Spring Cloud LoadBalancer负载均衡+算法切换

目录 介绍核心功能负载均衡启动两个支付服务订单模块引入依赖LoadBalanced 注解启动订单服务测试结果 负载均衡算法切换总结 介绍 Spring Cloud LoadBalancer 是 Spring Cloud 提供的客户端负载均衡解决方案,提供更现代化的 API 和更好的 Spring 生态系统集成。它支…

游戏引擎学习第210天

回顾并为今天的工作做准备 今天我们,进行一些编码工作。这部分的编码内容对那些对代码架构感兴趣的人非常有帮助,我认为今天的编码内容会很有教育意义,尤其是在展示一些代码转化的过程中,希望大家能够从中获得一些启发。 接下来…

UML类图综合实验三补档

1.使用简单工厂模式模拟女娲(Nvwa)造人(Person),如果传入参数“M”,则返回一个Man对象,如果传入参数“W”,则返回一个Woman对象,用Java语言实现该场景。现需要增加一个新的Robot类,如果传入参数“R”&#…

WinForm真入门(11)——ComboBox控件详解

WinForm中 ComboBox 控件详解‌ ComboBox 是 WinForms 中一个集文本框与下拉列表于一体的控件,支持用户从预定义选项中选择或直接输入内容。以下从核心属性、事件、使用场景到高级技巧的全面解析: 一、ComboBox 核心属性‌ 属性说明示例‌Items‌下拉…

DeepSeek底层揭秘——《推理时Scaling方法》技术对比浅析

4月初,DeepSeek 提交到 arXiv 上的最新论文正在 AI 社区逐渐升温。 笔者尝试对比了“关于推理时Scaling”与现有技术,粗浅分析如下: 与LoRA的对比 区别: 应用场景:LoRA是一种参数高效微调方法,主要用于在…

Android Coli 3 ImageView load two suit Bitmap thumb and formal,Kotlin(四)

Android Coli 3 ImageView load two suit Bitmap thumb and formal,Kotlin(四) 对 Android Coli 3 ImageView load two suit Bitmap thumb and formal,Kotlin(三)-CSDN博客 进行完善,注意完善 …

Adam优化器研究综述

摘要 Adam优化器(Adaptive Moment Estimation)是一种广泛应用于深度学习的优化算法,通过自适应学习率加速梯度下降过程。本文从Adam的定义、算法原理、优势与局限性、应用场景及变体等方面进行调研,结合学术文献和实践经验&#x…

在 macOS 上连接 PostgreSQL 数据库(pgAdmin、DBeaver)

在 macOS 上连接 PostgreSQL 数据库 pgAdmin 官方提供的图形化管理工具,支持 macOS。 下载地址:https://www.pgadmin.org/ pgAdmin 4 是对 pgAdmin 的完全重写,使用 Python、ReactJs 和 Javascript 构建。一个用 Electron 编写的桌面运行时…

2018年真题

数学基础 一、 (共4分)用逻辑符号表达下列语句(论域为包含一切事物的集合) 1、(2分)集合A的任一元素的元素都是A的元素 经过对图片文字的识别与逻辑分析,结果如下: 符号定义&…

Efficient Burst Raw Denoising:稳定噪声方差和分频率降噪

Efficient Burst Raw Denoising with Stabilization and Multi-Frequency Denoising Network Burst Raw Denoising必要性Burst Raw Image Denoising流程Main Contributions具体方法介绍集成noise priorCMOS sensor 噪声建模噪声变换(Variance stabilization&#xf…

mapbox进阶,使用本地dem数据,加载hillshade山体阴影图层

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️hillshade 山体阴影图层 api1.3.1 ☘️…

【C++】Stack Queue 仿函数

📝前言: 这篇文章我们来讲讲STL中的stack和queue。因为前面我们已经有了string、vector和list的学习基础,所以这篇文章主要关注一些stack和queue的细节问题,以及了解一下deque(缝合怪)和priority_queue &am…