当ブログにはPRを含みます。
AWS DOP(DevOps Engineer – Professional)の試験にはCodePipelineが頻出です。試験で問われた箇所を実際に触ってみた時のメモを記載します。
なお、実際にDOP-C02の試験を受けてきた所感は以下記事で紹介しているので見ていただけると嬉しいです。
この記事を書いた人
管理人:syo
サラリーマンエンジニア約9年
新卒で入社した大手システム会社でリモートワーク、年収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にデプロイする構成を選択しました。
ソースコードのリポジトリにはCodeCommitを使用します。
以上を選択するとPipelineが作成されます。簡単!
作成されるリソース(試験に出る代表的なもの)
CodeStarでプロジェクトを作成すると以下のようなリソースが作成されます。
代表的なものを以下紹介します。
EventBridgeルール(旧称CloudWatchEventルール)
CodeStarでPipelineを作成するとCodeCommitのmasterブランチにソースをコミットするとPipelineが開始してソースのデプロイ作業が開始されます。これ実はCodeStarで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:
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公式ドキュメントに実行順が記載されていました。
AppSpec 「フック」セクション – AWS CodeDeploy
デプロイログの確認方法
実際にスクリプトをカスタマイズしてあれこれやっているとログを確認したいもの。EC2上にログが出力されます。
全体のログを確認できる/var/log/aws/codedeploy-agent/codedeploy-agent.logや標準出力が確認できる/opt/codedeploy-agent/deployment-root/deployment-logs/codedeploy-agent-deployments.logをよく参照しました。
その他にもログが出力されますが、以下の記事が大変参考になりました。
CodeDeployエージェントが出力するログをCloudWatch Agentを利用してCloudWatch Logsに転送してみた | Deve…
さいごに(感想)
参考書やBlackBeltなので勉強するだけでなく実際に触ってみるとかなり深く理解できた気がします。やはり技術は触ってみてなんぼですね!
DOPの試験対策をしたい方は以下Udemyの動画講座もおすすめです。
DOPの参考書が無かったのでUdemyの英語教材を使用しました。音声は英語ですが、日本語字幕がついており図を多用してくれるので英語が苦手な筆者でも理解することができました。
セールで3000円程度で購入できたのでお得だと思います。試験範囲すべてを網羅的に解説してくれます。セール中であれば買いだと思います。定価だと28,000円するので正直高いと思うのでセール時期がおすすめです。セール中かぜひチェックしてみてください。
AWS Certified DevOps Engineer Professional 2023 – DOP-C02
PR
当ブログはWordPressテーマSWELLを使用しています。非常に使いやすく、簡単にプロのようなデザインを使えるのでお勧めです!!
SWELL – シンプル美と機能性両立を両立させた、圧巻のWordPressテーマ
システムエンジニア
AWSを中心としたクラウド案件に携わっています。
IoTシステムのバックエンド開発、Datadogを用いた監視開発など経験があります。
IT資格マニアでいろいろ取得しています。
AWS認定:SAP, DOP, SAA, DVA, SOA, CLF
Azure認定:AZ-104, AZ-300
ITIL Foundation
Oracle Master Bronze (DBA)
Oracle Master Silver (SQL)
Oracle Java Silver SE
■略歴
理系の大学院を卒業
IT企業に就職
AWSのシステム導入のプロジェクトを担当