文章目录
- 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`
- 3.1 将`application`提前部署到`github`
- 3.2 在`github`创建`PAT Person Access Tocken`
- 3.3 执行命令将`github`的`PAT`创建到`AWS Secret Manager`上
- 3.4 修改`codepipeline_build_deploy_stack.py`中的`todo`
- 3.4 执行`cdk`
- 3.5 访问`Application Loader Balancer`
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 repositoryimage_repo = ecr.Repository(self, "ImageRepo")# Creates a Task Definition for the ECS Fargate servicefargate_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}])
注意,这里并没有指定具体的image
的URI
以及tag
,这里只是指定了Image Repo(ECR)
。后面会在CodeBuildStage
阶段build
出来docker image
,并且接在CodeDeployStage
阶段将该docker image
部署到Fargate Service
。
2.2 创建CodeBuild project
# CodeBuild project that builds the Docker imagebuild_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 usernamerepo="web_app", # TODO: Replace with your GitHub repository namebranch_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