Udemy初夏のビッグセール開催中(~5/23)人気教材が1,300円~

AWS DOP試験対策 CodePipelineを触ってみた

AWS-DOP試験対策-CodePipelineを触ってみたアイキャッチ

当ブログにはPRを含みます。

AWS DOP(DevOps Engineer – Professional)の試験にはCodePipelineが頻出です。試験で問われた箇所を実際に触ってみた時のメモを記載します。
なお、実際にDOP-C02の試験を受けてきたレポートは以下記事で紹介しているので見ていただけると嬉しいです。

筆者の全身写真

この記事を書いた人

管理人:syo

サラリーマンエンジニア歴10年
新卒で入社した大手システム会社でリモートワーク、年収800万円に到達
AWS関連プロジェクトのインフラエンジニア&プロジェクトマネージャーを担当。
IT資格
AWS:プロフェッショナルレベル2冠・アソシエイトレベル3冠・CLF・ペシャリティ資格(SAP, DOP, SAA, SOA, DVA, SCS, DBS, MLS, ANS, PAS)
Azure:AZ-305・AZ-104・AZ-900
その他:基本情報、JAVASE Silver、オラクルマスターブロンズ(DBA)、Silver SQL、ITIL Foundation
、LinuC

目次

CodeStarでCodePipelineを作成

CodePipelineではPipelineを数クリックで作成可能です。DOP試験ではEC2にソースコードをデプロイするパターンの設問が多かったのでPHPをEC2にデプロイする構成を選択しました。

マネジメントコンソールでCodeStarを設定する(PHP)

ソースコードのリポジトリにはCodeCommitを使用します。

プロジェクトのリポジトリにCodeCommitを使用する

以上を選択するとPipelineが作成されます。簡単!

作成されるリソース(試験に出る代表的なもの)

CodeStarでプロジェクトを作成すると以下のようなリソースが作成されます。

CodeStarで生成されるリソースのアーキテクチャ図

代表的なものを以下紹介します。

EventBridgeルール(旧称CloudWatchEventルール)

CodeStarでPipelineを作成するとCodeCommitのmasterブランチにソースをコミットするとPipelineが開始してソースのデプロイ作業が開始されます。これ実はCodeStarでEventBridgeルールが作成されているからです。

この点、ソースコードがCodeCommitにコミットされたらデプロイを自動化したいどうしたらよいか的な設問で問われました。

生成されたEventBridgeルール

CodeBuild

ソースのビルドおよびテスト(テストコード)を実行します。CodeBuildで何を行うかはbuildspec.ymlに従います。
以下、初期のbuildspec.ymlです。

version: 0.2

phases:
  install:
    runtime-versions:
      php: 7.3
    commands:
      - composer install
  post_build:
    commands:
      # Do not remove this statement. This command is required for AWS CodeStar projects.
      # Update the AWS Partition, AWS Region, account ID and project ID in the project ARN in template-configuration.json file so AWS CloudFormation can tag project resources.
      - sed -i.bak 's/\$PARTITION\$/'${PARTITION}'/g;s/\$AWS_REGION\$/'${AWS_REGION}'/g;s/\$ACCOUNT_ID\$/'${ACCOUNT_ID}'/g;s/\$PROJECT_ID\$/'${PROJECT_ID}'/g' template-configuration.json

artifacts:
  files:
    - '**/*'
    - 'template-configuration.json'

CloudFormationスタック

インフラの作成を行います。今回だとEC2とその周辺のセキュリティグループなどを作成してくれます。
以下、CloudFormationが参照しているtemplate.ymlです。

AWSTemplateFormatVersion: 2010-09-09
Conditions:
  UseSubnet: !Not [!Equals [!Ref 'SubnetId', subnet-none]]
  IsBurstableInstanceType: !Equals [!Select [0, !Split ['.', !Ref InstanceType]], t3]
Transform:
- AWS::CodeStar
Parameters:
  ProjectId:
    Type: String
    Description: AWS CodeStar project ID used to name project resources and create roles.
  InstanceType:
    Type: String
    Description: The type of Amazon EC2 Linux instances that will be launched for this project.
  WebAppInstanceProfile:
     Type: String
     Description: The IAM role that will be created for the Amazon EC2 Linux instances.
  ImageId:
    Type: String
    Description: The Amazon EC2 Linux instance Amazon Machine Image (AMI), which designates the configuration of the new instance.
  KeyPairName:
    Type: String
    Description: The name of an existing Amazon EC2 key pair in the region where the project is created, which you can use to SSH into the new Amazon EC2 Linux instances.
  VpcId:
    Type: String
    Description: The ID of the Amazon Virtual Private Cloud (VPC) to use for Amazon EC2 instances.
  SubnetId:
    Type: String
    Description: The name of the VPC subnet to use for Amazon EC2 instances launched for this project.
  Stage:
    Type: String
    Description: The name for a project pipeline stage, such as Staging or Prod, for which resources are provisioned and deployed.
    Default: ''
Resources:
  WebApp01:
    Description: The installation and configuration commands this project will use to create instances that support this sample web application.
    Properties:
      CreditSpecification:
        CPUCredits: !If [IsBurstableInstanceType, unlimited, !Ref 'AWS::NoValue']
      IamInstanceProfile: !Ref 'WebAppInstanceProfile'
      ImageId: !Ref 'ImageId'
      InstanceType: !Ref 'InstanceType'
      KeyName: !Ref 'KeyPairName'
      NetworkInterfaces:
      - AssociatePublicIpAddress: true
        DeviceIndex: 0
        GroupSet:
        - !Ref 'WebAppSG'
        SubnetId: !If
        - UseSubnet
        - !Ref 'SubnetId'
        - !Ref 'AWS::NoValue'
      Tags:
      - Key: Environment
        Value: !Sub '${ProjectId}-WebApp${Stage}'
      - Key: Name
        Value: !Sub '${ProjectId}-WebApp${Stage}'
      UserData:
        Fn::Base64:
          Fn::Sub: |
            #!/bin/bash -ex
            # Install Ruby
            amazon-linux-extras install ruby2.6 -y
            # Install the AWS CodeDeploy Agent
            cd /home/ec2-user/
            wget https://aws-codedeploy-${AWS::Region}.s3.amazonaws.com/releases/codedeploy-agent-1.1.2-1855.noarch.rpm
            yum -y install codedeploy-agent-1.1.2-1855.noarch.rpm
            # Install the Amazon CloudWatch Logs Agent
            yum install -y awslogs-1.1.4
            wget https://s3.amazonaws.com/aws-codedeploy-us-east-1/cloudwatch/codedeploy_logs.conf
            mkdir -p /var/awslogs/etc/config
            cp codedeploy_logs.conf /var/awslogs/etc/config/
            sed -i 's/us-east-1/${AWS::Region}/g' /etc/awslogs/awscli.conf
            # Start the service logs
            service awslogs start
    Type: AWS::EC2::Instance
  WebAppSG:
    Description: The default Amazon EC2 security group that will be created for the Amazon EC2 Linux instances.
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Enable HTTP access via port 80 and SSH access via port 22.
      SecurityGroupIngress:
      - IpProtocol: tcp
        FromPort: '80'
        ToPort: '80'
        CidrIp: 0.0.0.0/0
      - IpProtocol: tcp
        FromPort: '22'
        ToPort: '22'
        CidrIp: 0.0.0.0/0
      VpcId: !Ref 'VpcId'

CodeDeploy

ビルドされたソースをEC2にデプロイします。Deploy時の動作はappspec.ymlに従います。
以下初期構築時のappspec.ymlです。このファイルについてはDOPで問われることが多かったので後で詳しく確認します。

version: 0.0
os: linux
files:
- source: /app
  destination: /var/www/phplaravel/app/
- source: /bootstrap
  destination: /var/www/phplaravel/bootstrap/
- source: /config
  destination: /var/www/phplaravel/config/
- source: /database
  destination: /var/www/phplaravel/database/
- source: /public
  destination: /var/www/phplaravel/public/
- source: /resources
  destination: /var/www/phplaravel/resources/
- source: /routes
  destination: /var/www/phplaravel/routes/
- source: /storage
  destination: /var/www/phplaravel/storage/
- source: /tests
  destination: /var/www/phplaravel/tests/
- source: /.env.example
  destination: /var/www/phplaravel/
- source: /.gitattributes
  destination: /var/www/phplaravel/
- source: /.gitignore
  destination: /var/www/phplaravel/
- source: /artisan
  destination: /var/www/phplaravel/
- source: /composer.json
  destination: /var/www/phplaravel/
- source: /composer.lock
  destination: /var/www/phplaravel/
- source: /gulpfile.js
  destination: /var/www/phplaravel/
- source: /index.php
  destination: /var/www/phplaravel/
- source: /package.json
  destination: /var/www/phplaravel/
- source: /phpunit.xml
  destination: /var/www/phplaravel/
- source: /server.php
  destination: /var/www/phplaravel/
- source: /scripts/requirements.txt
  destination: /home/ec2-user/scripts
hooks:
  AfterInstall:
  - location: scripts/install_python3
    timeout: 300
    runas: root
  - location: scripts/codestar_remote_access
    timeout: 300
    runas: root
  - location: scripts/install_php_laravel
    timeout: 300
    runas: root
  - location: scripts/install_httpd
    timeout: 300
    runas: root
  ApplicationStart:
  - location: scripts/start_server
    timeout: 300
    runas: root
  ApplicationStop:
  - location: scripts/stop_server
    timeout: 300
    runas: root

CodeDeployのappspec.ymlについて

appspec.ymlのfilesセクションは指定したファイルをEC2のdestinationにコピーしてくれます。
DOPではhooksセクションについて問われることが多かったです。AfterInstall、ApplicationStart、ApplicationStopとあるのでそれぞれ見ていきます。
なお、hooksセクションで指定しているscripts/install_python3などのファイルはCodeStarで作成されています。

hooksで使用するファイル

hooksで使用するファイル一覧

hooksセクション抜粋。

hooks:
  AfterInstall:
  - location: scripts/install_python3
    timeout: 300
    runas: root
  - location: scripts/codestar_remote_access
    timeout: 300
    runas: root
  - location: scripts/install_php_laravel
    timeout: 300
    runas: root
  - location: scripts/install_httpd
    timeout: 300
    runas: root
  ApplicationStart:
  - location: scripts/start_server
    timeout: 300
    runas: root
  ApplicationStop:
  - location: scripts/stop_server
    timeout: 300
    runas: root

hooksから呼び出されているscripts/install_python3は以下のbashが記載されていました。
実行したいbashがある場合はscripts配下にファイルを追加してhooksセクションに記載すればカスタマイズできました。

#!/bin/bash

cd /home/ec2-user

# Install python3
yum -y install python3-3.7.9-1.amzn2.0.2

# Install pip
yum -y install python3-pip-9.0.3
pip3 install -Iv --upgrade pip==20.2.1

# Install awscli and python dev libraries
pip install --user -r scripts/requirements.txt

hooksのそれぞれのセクション

それぞれのセクションの役割です。ApplicationStopは最後に書かれていますが、どういうわけか実行されるときは最初に実行されます。初期のファイルには書かれていないセクションがありますが追加することができます。
(DOP試験にも出題された記憶があります。~~を実施するスクリプトはどのセクションに記述するべきかといった感じに)

ApplicationStop

インストール前にアプリケーションの停止を行う。初回デプロイ時は実行されない。(デプロイ前にアプリケーションをストップするセクションだから当たり前っちゃ当たり前か。)
現在インストールされているパッケージを削除してデプロイの準備をする場合にも使用する。

BeforeInstall

ファイルの復号や現在のバージョンのバックアップの作成などの事前インストールタスクに使用

AfterInstall

アプリケーションの設定やファイルのアクセス許可の変更などに使用

ApplicationStart

停止したサービスを再開

ValidateService

デプロイが正常に完了したことを確認する

AWS公式ドキュメントに実行順が記載されていました。

hooksセクションのフロー図

デプロイログの確認方法

実際にスクリプトをカスタマイズしてあれこれやっているとログを確認したいもの。EC2上にログが出力されます。
全体のログを確認できる/var/log/aws/codedeploy-agent/codedeploy-agent.logや標準出力が確認できる/opt/codedeploy-agent/deployment-root/deployment-logs/codedeploy-agent-deployments.logをよく参照しました。
その他にもログが出力されますが、以下の記事が大変参考になりました。

さいごに(感想)

参考書やBlackBeltなので勉強するだけでなく実際に触ってみるとかなり深く理解できた気がします。やはり技術は触ってみてなんぼですね!
DOPの試験対策をしたい方は以下Udemyの動画講座もおすすめです。

DOPの参考書が無かったのでUdemyの英語教材を使用しました。音声は英語ですが、日本語字幕がついており図を多用してくれるので英語が苦手な筆者でも理解することができました。
セールで3000円程度で購入できたのでお得だと思います。試験範囲すべてを網羅的に解説してくれます。セール中であれば買いだと思います。定価だと28,000円するので正直高いと思うのでセール時期がおすすめです。セール中かぜひチェックしてみてください。
AWS Certified DevOps Engineer Professional 2023 – DOP-C02 icon

DOPの動画教材詳細説明
目標に向かって学びをスタートしよう。対象コースが¥1,800から。

PR
当ブログはWordPressテーマSWELLを使用しています。非常に使いやすく、簡単にプロのようなデザインを使えるのでお勧めです!!

SWELL – シンプル美と機能性両立を両立させた、圧巻のWordPressテーマ

ランキング

ランキングに参加しています。クリックして応援いただけると嬉しいです。
にほんブログ村 IT技術ブログ クラウドコンピューティングへ
にほんブログ村
AWSランキング
AWSランキング

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次