BootcampでCI/CDの構築に初めて挑戦した話

# はじめに
はじめまして、社会人一年目の若手エンジニアです。
AWSのサービスをハンズオン形式で学ぶために、Bootcampクラウドネイティブ編に参加したのでそのときの内容をまとめようと思います。（本当の目的は会社から無料のバウチャーをもらうためですが、、、）

※この記事では特に、Codebuildのbuildspec.yamlの新規作成方法を中心にまとめています


# この記事でわかる・できること
* コードをGitLabで管理する方法
* CodeBuildで新規にビルドを作成する方法
* template.yamlを編集して線形デプロイを実装する方法


# この記事の対象者
* CI/CDの基礎を学びたい人
* AWSのCode系のサービスについて基礎を学びたい人
* AWSのBootcampでハンズオンの実践に興味がある人


# Agenda
* 事前準備
* コードをGitLabで管理する
* コードをCodebuildでビルドする
* SAMで線形デプロイを実行する

それぞれのステップについて、次に詳しく記載します。


## 事前準備
環境の準備は以下の表示されているような案内に従って、順番に実行して完了してください（スキップしちゃってごめんなさい）。

![事前準備_pic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939953/1bd819cb-2bad-1c1c-1ee6-f00f2115767e.png)

:::note warn
**注意事項①**
下記二つはどこかにメモしていないと後々めんどくさいことになるので気を付けてください！！
* Secret Managerで管理されているパスワード
* GitLabで表示されるAccess Token
:::
:::note warn
**注意事項②**
ポップアップウィンドウでの認証後に正常に更新されない場合がありますが、リトライするとエラーがなくなるので何度か試してみて下さい（私は2回目で正常に更新されました）
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939953/fea18608-d303-1359-5529-39816d5d3d99.png)


## コードをGitLabで管理する
今回の環境ではコードを管理するツールとしてGitLabを使用していきます。（事前準備で既に構築済みです）


① GitLabでプロジェクトを作成して、  
② VS Code Server のターミナルで以下のコマンドを実行します
```bash
git clone <<プロジェクトのクローンURL>>
```
③ そして VS Code Serverにドラッグ＆ドロップでファイルを追加します
④ 最後に忘れずにcommitとpushを実行しましょう
```bash
cd ~/environment/training-applicant
git add -A
git commit -m 'ファイルを登録'
git push origin main
```


## コードをCodebuildでビルドする
次にCodeBuildを利用してビルド・テストを実行するために、buildspec.ymlファイルを作成します。

公式ドキュメントにもbuildspecファイルの記述方法は載っていますが、以下ではとりあえずこの項目があればOKという形で記載しています。
```bash
# buildspec.yml
version: 0.2

phases:
  install:
    runtime-versions:
      nodejs: 20
    commands:
      - npm install

  pre_build:
    commands:
      - npm run test
      - sam build

  build:
    commands:
      - sam package --s3-bucket $S3_BUCKET --output-template-file packaged.yaml

artifacts:
  files:
    - packaged.yaml
  discard-paths: yes
```
:::note info
**公式ドキュメント**
[ CodeBuild のビルド仕様リファレンス \| AWS](https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/build-spec-ref.html#build-spec.artifacts.name)
:::


ここでもbuildとpushコマンドは忘れずに実行しましょう。
```bash
git add buildspec.yml
git commit -m 'bulidspec.ymlを追加'
git push origin main
```
***Tips***
* Buildした後のS3への保存先のパス設定は、artifactsフェーズのfilesで同じ名称を用いて記載します
* buildフェーズなどでのcommandsとfinallyセクションの違い
    * commandsは各フェーズ内で実行
    * finallyはビルドの最後、かつ成功失敗に関わらず実行

##### もし「CodePipelineが自動で動かない」や「CodeBuildでエラーが発生する」ときには、、、

<font color="Red">事前準備の[トリガーを追加]をCodePipelineから確認してみよう</font>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939953/1f458c80-5e44-df45-1e4e-d583b46485c1.png)

下記のように、[保存]をしっかりと押す必要があります！！（このせいでだいぶ苦しめられた、、、）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939953/594e74bd-9767-ff1f-5d07-e2e7ab49772c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939953/99761b61-1953-ebad-a2cc-ee8e98bbc34c.png)
これで解決できなければ、別の箇所を再度確認してみてください


## SAMで線形デプロイを実行する
template.yamlファイルに、DeploymentPreferenceの項目を追記します。
```bash
# ～～～～上記省略～～～～
Resources:
  PutItemFunction:
    Type: AWS::Serverless::Function
    Properties:
      # ～～～～一部省略～～～～
      
      #以下のコマンドを追加する 
      AutoPublishAlias: live
      DeploymentPreference:
        Type: Linear10PercentEvery1Minute
# ～～～～下記省略～～～～
```
:::note warn
**注意事項**
記述する段落は、Resources⇒PutItemFunction⇒Properties配下になるので、間違えないように気をつけましょう！！
:::


# 参考情報
* ***[ AWS SAM を使用したサーバーレスアプリケーションの段階的なデプロイ ](https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/automating-updates-to-serverless-apps.html#:~:text=AWS%20Serverless%20Application%20Model%20%28AWS%20SAM%29%20%E3%81%AB%E3%81%AF%20CodeDeploy,%E3%81%8C%E7%B5%84%E3%81%BF%E8%BE%BC%E3%81%BE%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81AWS%20Lambda%20%E3%82%92%E6%AE%B5%E9%9A%8E%E7%9A%84%E3%81%AB%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82%20%E6%95%B0%E8%A1%8C%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B%E3%81%A0%E3%81%91%E3%81%A7%E3%80%81AWS%20SAM%20%E3%81%8C%E4%BB%A5%E4%B8%8B%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%20Lambda%20%E9%96%A2%E6%95%B0%E3%81%AE%E6%96%B0%E3%81%97%E3%81%84%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%82%92%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%81%97%E3%80%81%E6%96%B0%E3%81%97%E3%81%84%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%82%92%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88%E3%81%99%E3%82%8B%E3%82%A8%E3%82%A4%E3%83%AA%E3%82%A2%E3%82%B9%E3%82%92%E8%87%AA%E5%8B%95%E7%9A%84%E3%81%AB%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E3%80%82)***
* ***[ ランタイムバージョン | AWS buildspecファイル ](https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/runtime-versions.html)***
* ***[ 実践力を鍛えるBootcamp - クラウドネイティブ編 - ](https://catalog.us-east-1.prod.workshops.aws/workshops/a9b0eefd-f429-4859-9881-ce3a7f1a4e5f/ja-JP)***


# おまけ
今回のイベントでは座学と実践が時間ごとに分けられていたので、座学でインプットしたことをいくつか書いておきたいと思います。
* 継続的デリバリーは人による承認の段階がプロセスに組み込まれているが、継続的デプロイメントは組み込まれていないという点で異なる
* buildspec.ymlのphasesの構成要素
    * install : 環境を準備するためのパッケージのインストール
    * pre build : 構文チェックなどビルド前に実行したいこと
    * build : ビルドツールやコマンドの実行
    * post build : テスト実行やレポジトリへのコンテナイメージの配布
* SAMでは段階的なデプロイとして、カナリア、線形（Liner）、すべて一度に（AllAtOnce）が選択可能


# 終わりに
Bootcampイベントは、ドキュメントを参照しながら実際に手を動かしてこれまで学んだ知識を確認できる良い機会になりました。これを機にAWS Certified Developer – Associate試験を受験してさらにスキル向上を目指そうと思います。
つたない文章にもかかわらず最後まで読んで下さった方、ありがとうございました。

本ドキュメントが少しでも参考になれば幸いです。

- AWS は、米国その他の諸国における Amazon.com, Inc. またはその関連会社の商標です。
- その他、記載されている会社名および商品・製品・サービス名は、各社の商標または登録商標です。