- 2023/06/10 21:00 - 22:10
概要(Slackより抜粋)
> CICDの基礎から、cloudformation / terraformなどでの構築、実際のフローまで開設する予定です。
> ハンズオン形式でやろうと思います。
動画(限定公開)
ルビコンから補足
以下、勉強会中にルビコンがSlackに投稿した内容です。
====
- CodeCommit:一言でいえば AWS版GitHub です
- CodeBuild:GitからPullしてビルドするためのサービスです
- CodePipeline:CodeBuildやCodeDeployなどを連携させるためのサービスです
- CodeArtifact:ビルドしたアプリケーションのパッケージを安全に保存・公開・共有するためのサービスです
- CodeDeploy:アプリケーションをEC2などにデプロイするサービスです
====
buildspec.yml が GitHub Actions で言うところの WorkflowのYAMLファイルに相当します。
↓ GitHub ActionsのWorkflow
https://docs.github.com/ja/actions/using-workflows/workflow-syntax-for-github-actions
====
ただGitHub ActionsのWorkflowにはトリガー(ビルドを開始する条件)も含めて書きますが、
AWSの場合はCodeBuildにトリガーを書けず、トリガーはCodePipelineの方に書いてCodeBuildをキックすることになります。
====
青木さんのされていることをまとめると、
- ローカルでCloudFormationのテンプレートと
buildspec.yml
を作成・編集する - CodeCommit(AWS版GitHub)にそれらをPushする
- CodePipelineでそれを検知して、CodeBuildをキックする
- CodeBuildで
buildspec.yml
の手順通り、CloudFormationのテンプレートをチェックし、スタックを作成する - CloudFormationのスタックによって、IAMユーザーが作成される
という流れです。
1.でコードを用意して、2.でPushすると、3.のビルドと 4.のデプロイ が自動で行われるのがポイントですね。 ↑ これがまさに CI/CD です。
====
CodeBuild ビルド履歴の「送信者」に着目すると、誰がキックしたか分かります。
使用したファイル
- CloudFormationのテンプレート
Resources:
MyVPC:
Type: 'AWS::EC2::VPC'
Properties:
CidrBlock: 10.0.0.0/16
EnableDnsSupport: true
EnableDnsHostnames: true
Tags:
- Key: Name
Value: VPC-A
PublicSubnet1:
Type: 'AWS::EC2::Subnet'
Properties:
AvailabilityZone: !Select [ 0, !GetAZs '' ]
CidrBlock: 10.0.1.0/24
MapPublicIpOnLaunch: true
VpcId: !Ref MyVPC
Tags:
- Key: Name
Value: APublicSubnet1
PublicSubnet2:
Type: 'AWS::EC2::Subnet'
Properties:
AvailabilityZone: !Select [ 1, !GetAZs '' ]
CidrBlock: 10.0.2.0/24
MapPublicIpOnLaunch: true
VpcId: !Ref MyVPC
Tags:
- Key: Name
Value: APublicSubnet2
PublicSubnet3:
Type: 'AWS::EC2::Subnet'
Properties:
AvailabilityZone: !Select [ 2, !GetAZs '' ]
CidrBlock: 10.0.3.0/24
MapPublicIpOnLaunch: true
VpcId: !Ref MyVPC
Tags:
- Key: Name
Value: APublicSubnet3
MyRouteTable:
Type: 'AWS::EC2::RouteTable'
Properties:
VpcId: !Ref MyVPC
MyRouteTableAssociation1:
Type: 'AWS::EC2::SubnetRouteTableAssociation'
Properties:
SubnetId: !Ref PublicSubnet1
RouteTableId: !Ref MyRouteTable
MyRouteTableAssociation2:
Type: 'AWS::EC2::SubnetRouteTableAssociation'
Properties:
SubnetId: !Ref PublicSubnet2
RouteTableId: !Ref MyRouteTable
MyRouteTableAssociation3:
Type: 'AWS::EC2::SubnetRouteTableAssociation'
Properties:
SubnetId: !Ref PublicSubnet3
RouteTableId: !Ref MyRouteTable
InternetGateway:
Type: 'AWS::EC2::InternetGateway'
AttachGateway:
Type: 'AWS::EC2::VPCGatewayAttachment'
Properties:
VpcId: !Ref MyVPC
InternetGatewayId: !Ref InternetGateway
RouteToInternet:
Type: 'AWS::EC2::Route'
DependsOn: AttachGateway
Properties:
RouteTableId: !Ref MyRouteTable
DestinationCidrBlock: '0.0.0.0/0'
GatewayId: !Ref InternetGateway
Outputs:
VpcId1:
Description: "VPC ID"
Value: !Ref MyVPC
Export:
Name: VpcId1
SubnetId1A:
Description: "Subnet ID 1A"
Value: !Ref PublicSubnet1
Export:
Name: SubnetId1A
SubnetId1B:
Description: "Subnet ID 1B"
Value: !Ref PublicSubnet2
Export:
Name: SubnetId1B
SubnetId1C:
Description: "Subnet ID 1C"
Value: !Ref PublicSubnet3
Export:
Name: SubnetId1C
RouteTableId1:
Description: "Route Table ID"
Value: !Ref MyRouteTable
Export:
Name: RouteTableId1
- buldspec.yml
version: 0.2
phases:
install:
runtime-versions:
python: 3.11
pre_build:
commands:
- echo Build started on `date`
build:
commands:
- echo Validating the CloudFormation template
- aws cloudformation validate-template --template-body file://test.yml
- echo deploy cloudformation
- aws cloudformation deploy --template-file test.yml --stack-name cicd-teststack2
- echo Build completed on `date`
参考
- 認証情報のヘルパー
- buildspec.yml
- cloudformation CLI
- cloudformation deploy