「AWS Hands-on for Beginners – AWS Code サービス群を活用して、CI/CD のための構成を構築しよう!」のハンズオンをやってみた

AWS

2024.1.4

Topics

はじめに

こんにちは、第三SAチームのamaebiです。
今回は、「AWS Hands-on for Beginners – AWS Code サービス群を活用して、CI/CD のための構成を構築しよう!」の紹介や実際にやってみた感想などをまとめました。
こういうのがあるんだな~ぐらいの軽い気持ちで見ていただけると幸いです。

きっかけ

そもそもなぜ、AWS Code サービス群を触ろうと考えたのかと言いますと、普段からAWS Code サービス群を触る機会が全くなかったためです。
普段働いている中で、AWS Code サービス群は構成の一部として利用している話を聞くことが多く、数多くの疑問点があり、ぼんやりとしたイメージしかありませんでした。

  • 各種サービスにはどのような役割があるのか
  • どのサービスが連携しているのか
  • サービス間の具体的な違いはなんなのか

AWSの認定資格でも知識として問われることが多く、クラウドエンジニアとして一度は触れておきたいという思いもあったため、AWS Code サービス群を使用したCI/CD構成のハンズオンを実際にやってみようという流れになりました。

CI/CDとは何か

では、AWS Code サービス群を活用したCI/CD構成と言いますが、そもそもCI/CDとは何かについて説明していきます。

概要

継続的インテグレーションと継続的デリバリー (CI/CD) は、ソフトウェアリリースのライフサイクルを自動化するプロセスです。
引用:CI/CD について理解する

CI/CDを活用することで、開発後のビルド、テスト、デプロイの作業を一括で自動化してくれるため、アジャイル開発などで用いられている手法になります。
では、CI/CDの概要も理解できたと思いますので、より具体的な内容に触れていきます。

構成図


引用:AWS Hands-on for Beginners – AWS Code サービス群を活用して、CI/CD のための構成を構築しよう!

思っていたよりも構成がシンプルで、連携の仕組みも分かりやすかったです。
百聞は一見にしかず!参考書などで得る知識も大事ですが、やはり図として見た方がより具体的なイメージが持てました。
続いて、今回のハンズオンの概要を少し触れていきます。

概要

まず初めに構成内容について、簡単に説明します。
構成図を見ていただけると分かる通り、2つの構成内容に分かれております。

  1. AWS CodeCommitとAWS CodePipelineを活用して、S3バケットに成果物を自動的にデプロイする簡単なCI/CD構成
  2. AWS CodeCommit、AWS CodeBuild、AWS CodeDeploy、AWS CodePipelineを活用して、EC2インスタンスに成果物を自動的にデプロイする複雑なCI/CD構成

今回のハンズオンのメインになるのが、(2)のAWS Code サービス群を活用したCI/CD構成ですので、(1)のシンプルなCI/CD構成については、本ブログでは紹介しません。
次に、今回のハンズオンで使用するサービス紹介を行います。(EC2、S3、Cloud9についての説明は省略しております。)

AWS CodeCommit

  • フルマネージド型のソース管理サービス
  • スケーラブルでセキュア、既存のGitツールともシームレスに連携できる
  • 月々のアクティブユーザー数、APIリクエスト数、利用容量による課金体系

引用:Code シリーズ入門ハンズオンを公開しました!- Monthly AWS Hands-on for Beginners 2020年8月号

「作成したプログラムを格納する格納庫」というイメージです。

AWS CodeBuild

  • ソースコードをコンパイル、テスト実行し、デプロイ可能なソフトウェアパッケージを作成できるフルマネージド型のビルドサービス
  • ビルド用のサーバーをプロビジョニング・管理する必要がなくなる
  • 利用した分のみのお支払い

引用:Code シリーズ入門ハンズオンを公開しました!- Monthly AWS Hands-on for Beginners 2020年8月号

「格納したプログラムの品質チェックを行い、問題なければ機械が読めるようにプログラムを翻訳する一連の作業のこと」というイメージです。

AWS CodeDeploy

  • 様々なコンピューティングリソース(EC2,Lambda,オンプレ環境など)に対してデプロイを行う
  • AutoScalingする構成に対しても、連動して自動でデプロイする
  • AWS 上のリソースを対象としたデプロイの場合は料金はかからない

引用:Code シリーズ入門ハンズオンを公開しました!- Monthly AWS Hands-on for Beginners 2020年8月号

「実際に処理してくれる機械に翻訳したものをビルド(配置)する」というイメージです。

AWS CodePipeline

  • フルマネージド型の継続的デリバリーサービス
  • ソースコードの変更をトリガーに、ビルド、デプロイといった一連の流れを自動的に実行する
  • アクティブなパイプライン数で料金が決まる

引用:Code シリーズ入門ハンズオンを公開しました!- Monthly AWS Hands-on for Beginners 2020年8月号

「プログラムを格納→品質チェック→加工(翻訳)→機械にビルド(配置)の一連の流れをパイプラインとして自動的に実行できるようにしたもの」というイメージです。

最後に今回のハンズオンの手順を簡単に紹介します。

手順

今回のハンズオンのメインとなる「AWS CodeCommit、AWS CodeBuild、AWS CodeDeploy、AWS CodePipelineを活用して、EC2インスタンスに成果物を自動的にデプロイする複雑なCI/CD構成」に焦点を当てて、こちらの手順を紹介していきます。

S3をデプロイ先とした、CI/CD 環境を構成する【事前準備 + CodeCommit編】

  1. AWS CodeCommitのリポジトリを作成します。
  2. AWS Cloud9を作成し、AWS CodeCommitで作成したリポジトリを接続するため、AWS Cloud9側に認証ヘルパーの設定を行います。
  3. AWS Cloud9で作成したHTMLファイルがリポジトリ内にプッシュできているかどうかを確認します。

実際にやってみて

AWS CodeCommitのリポジトリの設定項目が少なくシンプルで分かりやすかったかなと感じました。
リポジトリ名を作成するだけでしたので、ここは問題なかったかなと思います。

AWS CodeCommitとAWS Cloud9との連携もそこまで複雑ではないため、今回のハンズオンと公式ドキュメントを参考にやってみるといいかなと思います。

AWS Cloud9のCLIから設定

amaebi:~/environment $ git config --global credential.helper '!aws codecommit credential-helper $@'
amaebi:~/environment $ git config --global credential.UseHttpPath true
amaebi:~/environment $ git config --global user.name "ユーザー名"
amaebi:~/environment $ git config --global user.email "Eメールアドレス"
amaebi:~/environment $ git clone "URL" ←下の画像の(ステップ 3: リポジトリのクローンを作成する)に該当するURLを入力
Cloning into 'amaebi-cicd-hands-on-repository'...
warning: You appear to have cloned an empty repository.
amaebi:~/environment $ cd amaebi-cicd-hands-on-repository/
amaebi:~/environment/amaebi-cicd-hands-on-repository (master) $ 

公式ドキュメント:AWS CLI 認証情報ヘルパーを使用した、Linux、macOS、または UNIX での AWS CodeCommit リポジトリへの HTTPS 接続のセットアップ手順

EC2インスタンスをデプロイ先とした、CI/CD環境を構築する【事前準備】

  1. EC2用のIAMロールを作成します。
  2. デプロイ先となるEC2インスタンスを作成します。その際、先ほど作成したIAMロールもアタッチします。
  3. 先程作成したEC2にログインし、Amazon CodeDeployに接続するためのCodeDeploy エージェントのインストール、起動などを行います。

実際にやってみて

AWS CodeDeploy エージェントのインストール、セットアップもハンズオンと公式ドキュメントを参考にやってみればそこまで難しくないと思います。
ただ、一点注意点ですが、ハンズオンを見ながらやっているとどうしても流れ作業になってしまいますので、このコマンドは何をやっているんだろうということを意識しながら作業した方が定着しやすいなと感じました。

CodeDeploy エージェントインストール、セットアップのコマンド一覧(コマンド出力結果は長いため、割愛いたします。)

[ec2-user@ip-xxx-xxx-xxx-xxx ~]$ sudo yum update
[ec2-user@ip-xxx-xxx-xxx-xxx ~]$ sudo yum install ruby
[ec2-user@ip-xxx-xxx-xxx-xxx ~]$ sudo yum install wget
[ec2-user@ip-xxx-xxx-xxx-xxx ~]$ cd /home/ec2-user
[ec2-user@ip-xxx-xxx-xxx-xxx ~]$ wget https://aws-codedeploy-ap-northeast-1.s3.ap-northeast-1.amazonaws.com/latest/install ←東京リージョン用のCodeDeploy エージェントをダウンロードします。
[ec2-user@ip-xxx-xxx-xxx-xxx ~]$ chmod +x ./install ←ファイルに実行権限を付与します。
[ec2-user@ip-xxx-xxx-xxx-xxx ~]$ sudo ./install auto ←CodeDeploy 最新バージョンのエージェントをインストールします。
[ec2-user@ip-xxx-xxx-xxx-xxx ~]$ sudo service codedeploy-agent status ←CodeDeploy エージェントが実行されているかどうか確認します。

公式ドキュメント:Amazon Linux または RHEL CodeDeploy 用のエージェントをインストールします。

EC2インスタンスをデプロイ先とした、CI/CD環境を構築する【CodeBuild 編】

  1. AWS CodeBuildで使用するアーティファクト用のS3バケットを作成します。
  2. AWS CodeBuildのビルドプロジェクトを作成します。その際に、先ほど作成したAWS CodeCommit リポジトリ、アーティファクトに先程作成したS3バケットを指定します。
  3. AWS CodeBuild用のIAMロールに追加のポリシーをアタッチします。
  4. AWS Cloud9上でbuildspec.ymlファイルを作成します。

実際にやってみて

ここのハンズオンが少し複雑かなと感じました。
1つ1つの設定項目や連携が増えているため、そこを意識しながらやるといいのかなと思います。

例えば、AWS CodeBuildのプロジェクトの作成する際の設定項目が4つほどあり、どれに何が設定されているのかをひとつひとつ意識しながら設定してみてください。

EC2インスタンスをデプロイ先とした、CI/CD環境を構築する【CodeDeploy 編】

  1. AWS CodeDeploy用のIAMロールを作成します。
  2. AWS CodeDeployのアプリケーションを作成します。
  3. デプロイグループを作成します。その際に、先ほど作成したIAMロール、デプロイ用のEC2インスタンスを選択します。
  4. AWS Cloud9上でappspec.ymlファイルを作成します。
  5. HTMLファイルをリポジトリにプッシュ、ビルド、アプリケーションをデプロイします。実際にEC2インスタンスにアクセスして、ファイルが書き換わっていることを確認します。

実際にやってみて

ここのフェーズはとにかくエラーが多く、トラブルシューティングに時間を費やしました。
ビルド、デプロイ時に細やかところでエラーを発生しておりましたので、その中からいくつかご紹介いたします。

ビルドエラー

AWS CodeBuildを実際にビルドした際の、ビルド履歴の画像です。

こちらのエラー内容が「バケットが東京リージョンにありません。バージニア北部にあります。」とのエラーでしたので、AWS CodeBuildの設定からバケットの指定先を再度確認しました。
その結果、アーティファクト用のバケットではなく、CloudTrail用のバケットを指定しておりました。(なぜ私はこのバケットを指定したのか…)

指定する間違ったバケットを指定した画像

正しいバケットをを指定した画像

バケットの指定先を変えたことでエラーは解消されました。

デプロイエラー

次にAWS CodeDeployを実際に実行した際のエラー画像です。

エラー内容を確認した際に、CodeDeploy エージェントが起動していないかIAMロールがアタッチされていない可能性がありましたので、それぞれを確認しました。

公式ドキュメント:EC2/オンプレミスのデプロイに関する問題のトラブルシューティング
まず初めにCodeDeploy エージェントの起動確認を行います。

こちらは起動しているため、原因はCodeDeploy エージェントではありませんでした。
続いて、IAMロールを確認します。
やはり、IAMロールがアタッチされていないため、IAMロールをアタッチして、CodeDeploy エージェントを再起動してもう一度デプロイを行いました。

IAMロールがアタッチされていない

正しいIAMロールをアタッチ


…デプロイができてない??

もう一度デプロイを行いましたが、また同じエラーが出てしまい、セキュリティグループやEC2インスタンスやAWS CodeDeployのIAMロールにアタッチされているIAMポリシーを変更したりしましたがエラー内容は変わりませんでした。

そこで、CodeDeploy Agent側に問題があるのではないかと思い、CodeDeploy Agentのログファイルを確認しました。
※一部エラーログを割愛しています。

[ec2-user@ip-xxx-xxx-xxx-xxx ~]$ tail -100 /var/log/aws/codedeploy-agent/codedeploy-agent.log
2023-12-21T09:45:37 WARN  [codedeploy-agent(26393)]: InstanceAgent::Plugins::Cod
2023-12-21T09:45:37 INFO  [codedeploy-agent(26393)]: [Aws::CodeDeployCommand::Clessage\":\"The deployment failed because an invalid version value () was entered identifier:"xxxxxx")                                                         

どうやら、appspec.ymlのバージョン指定が違うらしいので、公式ドキュメントから参照し、もう一度書き換えました。

version: 0.0
os: linux
files:
  - source: index.html
    destination: /var/www/html/                                                      

そして、前回のファイルと書き換えたファイルをdiffで見比べてみた結果がこちらです。

amaebi:~/environment/amaebi-cicd-hands-on-repository/src (master) $ diff -U0 .appspec.yml.backup appspec.yml 
--- .appspec.yml.backup 2023-12-21 06:11:31.243952080 +0000
+++ appspec.yml 2023-12-21 10:03:46.526030238 +0000
@@ -1 +1 @@
-Version: 0.0
+version: 0.0
amaebi:~/environment/amaebi-cicd-hands-on-repository/src (master) $                                                      

はい…
大文字のVか小文字のvかの違いでした。(手書きするより公式ドキュメントからコピペした方が一番いいことを学びました…)

一応こちらを書き換えて実行してみたところ、無事デプロイが成功しました。

このような凡ミスからIAM権限周りやセキュリティグループでエラーが発生する可能性がありますので、皆さんはひとつひとつの設定項目を注意しながらやってみてください。

EC2インスタンスをデプロイ先とした、CI/CD環境を構築する【CodePipeline 編】

  1. 今まで作成してきたAWS CodeCommit、AWS CodeBuild、AWS CodeDeployの一連の流れをAWS CodePipelineを使用してパイプライン化します。
  2. 最後に、パイプライン化した一連の流れを自動的に実行して、EC2インスタンスのファイルが書き換わっているかことを確認します。

実際にやってみて

ここのフェーズが一番感動しました。
コードをリポジトリにプッシュだけで、ビルド、デプロイまでの流れを一貫して自動反映してくれたことには驚きが大きかったです。
その他にもAWS CodePipelineのUIも分かりやすく、CI/CDがイメージしやすい内容でした。

ここまでの確認が完了しましたら、今回のハンズオンは終了になります。

最後に

ハンズオンの構成がとてもシンプルで分かりやすく、CI/CDの具体的なイメージやAWS Code サービス群の概要や連携方法を深く理解することができました。
ただ、AWS Code サービス群の各種IAMロールの設定内容が複雑で分かりにくかったです。ここについては、違いが分かるようになるまで何回もハンズオンを見返しました。

今回のハンズオンはCI/CD構成に興味を持つきっかけにもなりましたので、皆さんも是非やってみてください。
今後、Windows Server系のサービス以外にもこのようなハンズオン系の記事などを投稿する予定ですので、皆様よろしくお願いします。

amaebi

amaebiと申します。平日は技術を学び、休日にゲームセンターに足を運ぶエンジニアです。クラウドエンジニアとしてまだまだ未熟ですが、これから精進していきたいです。

Recommends

こちらもおすすめ

Special Topics

注目記事はこちら