「AWS Code サービス群を活用して、CI/CD のための構成を構築しよう！」のハンズオンを実施したのでまとめてみた

# やったこと
AWS公式のハンズオン「AWS Code サービス群を活用して、CI/CD のための構成を構築しよう！」を実施したので私なりにまとめてみました。
ハンズオンを通して実施した事をAgendaよりも一歩踏み込んで記載していますので、ハンズオンを実施するか悩んでいる方の参考となれば嬉しいです。また、誤っている点はご指摘いただければ幸いです。感想やハートをいただけますと励みになります。

# 記事の目的
- 記事を書くことでAWSサービスを用いたCI/CDの理解を深める。
- 今後何を学習するか迷っている方やCI/CDを学ぶか悩んでいる方の参考になれば嬉しいです。

# ハンズオンへのリンク
[AWS Code サービス群を活用して、CI/CD のための構成を構築しよう！](https://pages.awscloud.com/JAPAN-event-OE-Hands-on-for-Beginners-cicd-2022-reg-event.html?trk=aws_introduction_page "AWS Code サービス群を活用して、CI/CD のための構成を構築しよう！")

# ハンズオンの対象者
ハンズオン登録画面では以下のような方におすすめと書かれています。
- AWS Code サービス群の概要が知りたい方
- AWS Code サービス群を使用して、CI/CD 構成を作成してみたい方
（ハンズオン登録画面から引用）

# ハンズオンの構成
![Hands-On-for-Beginners_2022_code_0819_v1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691245/abb6454d-9266-f86c-dc89-628427eed885.png)
（ハンズオンの登録ページから画像をお借りしました）

画像に記載されているようなAWS Codeサービス群を利用してCI/CDパイプラインを作成していきます。
画像ではまとめて書かれていますが、構成としては2つあります。
1. 画像の上側の構成
    Cloud9 (統合開発環境サービス)から AWS CodeCommit (GitHubみたいなもの)のリポジトリにgitプッシュした際に、それを AWS CodePipeline が検知して自動で S3 バケットに成果物をデプロイします。
    S3 バケットは静的ウェブサイトホスティングの設定(S3に置いたファイルをWebサイトとして公開する設定)がされており、自動で変更が反映されているのが確認できます。
2. 画像の下側の構成
    上側の構成にプラスして AWS CodeBuild と AWS CodeDeploy を使った構成です。デプロイ先はS3がEC2に変わっています。
    gitプッシュして AWS CodeCommit が動くのは上側の構成と変わりませんが、 AWS CodeBuild でソースコードをコンパイルしてデプロイ可能なソフトウェアパッケージを作成し、 AWS CodeDeploy でデプロイ先(EC2)を指定してデプロイしています。
    こちらも簡易的なウェブページをEC2上に構築して変更が反映されるところまで確認します。

（ハンズオン実施にあたっては、gitコマンドを少し使えた方がいいかもしれません。使えなくてもハンズオンは問題なく実施できますが、手順を誤って詰まった際に自己解決しやすくなります。）

# 利用するサービス
利用するサービスについてご説明します。こちらはハンズオンの最初の座学で説明されており、その動画を見るだけでも理解が深まると思います。
`AWS Cloud9`：統合開発環境サービス。ブラウザのみでコードを記述して実行できる。
`AWS CodeCommit`：AWS版ソース管理サービス。GitHubやBitbucketみたいなもの。
`AWS CodeBuild`：ソースコードをコンパイルし、テストし、デプロイ可能なソフトウェアパッケージを作成する。
`AWS CodeDeploy`：EC2やLambdaやオンプレ環境などに対してデプロイを行うサービス。
`AWS CodePipeline`：継続的デリバリーサービス。ソースコードの変更をトリガーに、ビルド、デプロイといった一連の流れを自動的に実行する。
`Amazon S3`：オブジェクト（≒いろんなファイル）を置いておける。今回のハンズオンでは置いたファイルを使ってWebサイトとして公開する設定をしています。
`Amazon EC2`：サーバー（仮想）。Linuxディストリビューション(Ubuntuとか)や MS Windows 等選べます。

# Agenda
1. 今回のハンズオンので構築する構成の紹介 + ハンズオンで登場するサービスの紹介
2. S3 をデプロイ先とした、CI/CD 環境を構築する【事前準備 + CodeCommit編】
3. S3 をデプロイ先とした、CI/CD 環境を構築する【CodePipeline 編】
4. EC2 インスタンスをデプロイ先とした、CI/CD 環境を構築する【事前準備編】
5. EC2 インスタンスをデプロイ先とした、CI/CD 環境を構築する【CodeBuild 編】
6. EC2 インスタンスをデプロイ先とした、CI/CD 環境を構築する【CodeDeploy 編】
7. EC2 インスタンスをデプロイ先とした、CI/CD 環境を構築する【CodePipeline 編】
8. 削除手順の紹介、本シリーズのまとめ、Next Step のご案内

ここから上記Agendaに紐づく実施内容となります。

**1. 今回のハンズオンので構築する構成の紹介 + ハンズオンで登場するサービスの紹介**
こちらは座学になります。ハンズオンの内容をざっくり理解するのに役に立ちます。
- そもそもCI/CDとは何か？何が嬉しいのか？
    CI/CD（継続的インテグレーション/継続的デリバリー）とは、一言で言うとアプリケーションをデプロイするまでの作業を自動化したものです（正確にはググっていただきたいです）。例えば、以下のような状況の時、CI/CDが有効となる。
    - 状況
    状況としては、AWS上でアプリケーション（今回はWebサイト）を動かしているとします。
    - やりたいこと、背景
    アプリケーションをサーバーにデプロイしたいと思った際に、以下のようなことが懸念としてあります。
        - プログラミング言語やウェブアプリケーションフレームワークによっては、事前にビルドをする必要がある。。。
        - 複数のサーバーがある場合、それをどのように配置していくかを考える必要がある。。。

毎回毎回一連の流れを手動で実施するのはめんどくさい。自動化したい => **CI/CD** **を構成しよう！**

**2. S3 をデプロイ先とした、CI/CD 環境を構築する【事前準備 + CodeCommit編】**
ここから具体的にハンズオンが始まります。実際の操作としては以下のようなことを行いました。
- S3バケット
    - バケットの作成
    - ウェブサイトホスティングの設定
    - バケットポリシーの設定
    - ファイルのアップロード
    - ホスティングできていることの確認
- CodeCommit
    - CodeCommit にリポジトリの作成
    - Cloud9 の環境作成
    - Cloud9 にて、作成したリポジトリからクローンし、ローカルリポジトリに新たにファイルを追加して CodeCommit にコミットしてプッシュ 
        （私はここのgitプッシュ時に凡ミスでエラーが発生しました。原因としては `index.html` ファイルを配置するディレクトリを誤っていただけですが、慣れないCloud9での操作なのですぐに気づかず。。）

**3. S3 をデプロイ先とした、CI/CD 環境を構築する【CodePipeline 編】**
ここでは CodePipeline を用いて S3 バケットへデプロイを行うパイプラインを構築しました。ここまでで構成図の1つ目の作業が終わります。
- CodePipeline
    - パイプラインを作成
    - Cloud9 で少しコードを変えて動作確認（ウェブサイト画面が更新されていることの確認）

**4. EC2 インスタンスをデプロイ先とした、CI/CD 環境を構築する【事前準備編】**
ここでは EC2 インスタンスの作成と、 EC2 インスタンスに CodeDeploy エージェントをインストールします。
- EC2
    - EC2 インスタンスに紐づける IAM ロールの作成
        S3 バケットを操作できるポリシーを付与
    - EC2 インスタンスの作成
    - EC2 インスタンスにてウェブサーバーとして起動する設定
    - 動作確認
- CodeDeploy
    - EC2 インスタンスに CodeDeploy エージェントのインストール

**5. EC2 インスタンスをデプロイ先とした、CI/CD 環境を構築する【CodeBuild 編】**
ここではソースコードをコンパイル、テスト実行できる CodeBuild に関する構築をしていきます。
- S3
    - CodeBuild で作成したアーティファクト（デプロイ可能なソフトウェアパッケージをこう呼ぶらしい）を入れるための S3 バケットを作成
- CodeBuild
    - ビルドプロジェクトを作成
        ここでソース（どこからファイルを持ってくるのか）、環境（ビルドを実行する環境）、Buildspec（CodeBuild上で行う作業の定義を使うかどうか）、アーティファクト（の作成先）を設定する
    - IAM ロールに IAM　ポリシーの追加
        ビルドプロジェクトを作成すると、裏で専用の IAM ロールが作成されるので、その IAM ロールにCodeDeploy　を操作できるポリシーをアタッチする。
    - buildspec.yml を書いていく

**6. EC2 インスタンスをデプロイ先とした、CI/CD 環境を構築する【CodeDeploy 編】**
ここでは様々なコンピューティングリソースに対してデプロイを行う CodeDeploy　を設定していきます。今回のデプロイ先は EC2 となります。
- CodeDeploy
    - CodeDeploy 用の IAM ロールの作成
    - CodeDeploy のアプリケーションを作成
    - アプリケーションの中にデプロイグループを作成
        ここでデプロイ方法の設定等する
    - appspec.yml を書いていく
        OS、どこにどんなファイルを配置するか等
- CodeBuild の動作確認と、 CodeDeploy の動作確認

**7. EC2 インスタンスをデプロイ先とした、CI/CD 環境を構築する【CodePipeline 編】**
CodePipeline を使って EC2 インスタンスまでのデプロイの流れをパイプライン化していきます。
- CodePipeline
    - パイプラインの作成
        ここでソースステージ、ビルドステージ、デプロイステージに今まで作ったものを指定していきます。
    - CodePipeline の動作確認

**8. 削除手順の紹介、本シリーズのまとめ、Next Step のご案内**
ハンズオンで作成したリソースを削除する手順を紹介してくれます。

# ハンズオン実施の記録
## 実施した日
2022/11/17~18
※ハンズオン動画が収録された日ではなく、私がハンズオンを実施した日です。

## かかった時間
まとめながら実施したため6時間くらいかかりました。。他の記事で2時間で終わると書かれていたため、作業だけであればそれほど時間はかからないと思われます。

## 実施した際に困ったことや気づいたこと
- 動画が早送りできない。
- 画面デザインが古いため、少し戸惑う箇所があった

# 感想
CI/CD　の基礎を学び、 Code　シリーズを一通り触れて大変勉強になりました。オススメです。