🐥

AWS Code兄弟を触ってみた

2022/11/20に公開

AWS Code兄弟を触ってみたということで
今日行ったハンズオンは以下になります。
AWS Hands-on for Beginners - AWS Code サービス群を活用して、CI/CD のための構成を構築しよう!

Code兄弟の概要

※code兄弟(code4兄弟)はCodeCommit, CodePipeline, CodeBuild, CodeDeployを総称した名称になります。AWSでCI/CDパイプラインを構築するためのサービス群です。
以下は各サービスのざっくりとした概要になります。

  • CodeCommitはgithubのaws版。バージョン管理ツール
  • CodeBuildはビルド・テストを通じてデプロイ可能なソフトウェアパッケージ(artifact)を作る役目を持ったサービス
  • CodeDeployはデプロイを通じてCodeDeployのリソース(application)を作る役目を持ったサービス
  • CodePipelineはCodeCommit->build->deployを自動化するサービス

無料枠でできること

CodeCommit: 無料枠だと5ユーザーまで無料、1000リポジトリの作成が無料で作れます。
CodeBuild: 1 か月あたり100分の総ビルド時間
CodeDeploy: サービス自体に料金はなし。
CodePipeline: アクティブなパイプライン一つまで無料。
※CodePipelineの無料枠が乏しいことから個人開発であればCodePipelineよりもGithub Actionsを使ってる記事が多く見受けられました。

ハンズオンの設計図

初めて知った用語

Artifact: CodeBuildの成果物。最終的に作られるパッケージの名称。
CodeDeploy Agent: CodeDeployでデプロイ先となるec2に必要なパッケージソフト
CodeCommit 認証ヘルパー: 外部環境からCodeCommitのリポジトリに接続するためのgit configの設定

フェーズ1の流れ

フェーズ1ではs3にホストされてる静的webサイトにCI/CDパイプラインを組み込む流れになります。

  1. S3バケットを作成する
    • パブリックアクセスをブロックしない
    • bucketポリシーを追加
    • 静的webホスティングを有効化, デフォルトドキュメントをindex.htmlに設定
  2. CodeCommitを作成する
    • リポジトリを作成
  3. Cloud9を作成する
    • CodeCommitのリポジトリに接続するために認証ヘルパーを設定する
    • gitのname, emailの設定をする
    • CodeCommitリポジトリをクローンする
    • index.htmlファイルを追加し、git add, commit, pushをする
    • 静的ホスティングURLを表示し、index.htmlの内容が反映してることを確認する
# 認証ヘルパーの設定
$ git config --global credential.helper '!aws codecommit credential-helper $@'
$ git config --global credential.UseHttpPath true

# gitのusernameの設定${name}はお好きな名前
$ git config --global user.name "${name}"
# gitのemailの設定${email}はお好きなメールアドレス
$ git config --global user.email "${email}"
  1. CodePipelineを作成する
    • ソースはCodeCommitのリポジトリを選択
    • ビルドステージをスキップ
    • デプロイ前にファイルを抽出するを有効化(現時点では目的は不明。有効化するとパイプラインを回したときにcodepipeline-ap-northeast-1-xxxxxxxというS3バケットが作成される)
    • デプロイプロバイダーはs3の静的webサイトのバケットに設定
      ※パイプラインはサービスロール(IAMRole)が必要で、CodePipiline作成時に自動的に作成される

フェーズ2の流れ

フェーズ2ではEC2にホストされてる静的webサイトにCI/CDパイプラインを組み込む流れになります。

# フォルダ構成
.
├── buildspec.yml
└── src
    ├── appspec.yml
    └── index.html
  1. EC2を作成する
  2. CodeBuildを作成する
    • artifact用のs3バケットを作成する
    • ビルドプロジェクトを作成する(artifactは先ほどのバケットを追加する
    • 自動で作られたIamRoleにAWSCodeDeployDeployerAccessポリシーを追加する
    • buildspec.ymlを作成する。詳細な書き方はリファレンスを参照
# ${xxx}は自分用に置き換える
version: 0.2
phases:
  build:
    commands:
      - aws deploy push --application-name ${CodeDeployのApplication名} 
        --s3-location s3://${s3のartifactバケット名}/artifact.zip 
        --source src
artifacts:
  files:
    - '**/*'
  base-directory: src
  1. CodeDeployを作成する
    • IAMRoleを作成する。(サービス:CodeDeploy, ポリシー:AWSCodeDeployRole)
    • アプリケーションを作成
    • デプロイグループを作成
      • 先ほどのIAMRole
      • 環境設定で対象のec2インスタンスを選択
      • agentの設定は無効(手動で設定したので)
version: 0.0
os: linux
files:
  - source: index.html
    destination: /var/www/html/

# 今回は使わないがhooksを使用するとデプロイの前後にイベントを仕込むことができる
  1. CodePipelineを作成する
    • ソースプロバイダ: CodeCommit
    • ビルドステージ: CodeBuild
    • デプロイプロバイダー: CodeDeploy(application名, デプロイグループを選択)
  2. $ git push origin masterをしてCodePipelineが走るか検証する

※CodePipelineを作成したタイミングで一度パイプラインが回る

リソースの削除

  1. cloud9の環境を削除
  2. ec2 を削除
  3. codepipelineを2つ削除(s3用とec2用)
  4. codecommitのリポジトリを削除
  5. codebuildのビルドプロジェクトを削除
  6. codedeployのアプリケーションの削除
  7. s3の削除
    • codepipelineの設定でデプロイ前にファイル抽出されたバケット
    • codebuildのartifactのバケット
    • s3のwebホスティング用のバケット

まとめ

業務では必須のCI/CD環境を1から構築してみた。artifactなどサービス独自の呼称だったり認証ヘルパーの設定などは自分で調べると時間がかかる内容だが、ハンズオンなのですんなり理解することができた。ただしCodePipelineの無料枠が一つなので実際に個人開発する際はGithub ActionsでCI/CDを構築しようと思った。
時間があれば今回のCI/CD環境をCloudFormationでコード化してみたい。

Discussion