【AWS】CloudFormationとGitを利用してCI/CDパイプライン環境を構築してみる

AWS

AWSをコードで管理したい。IaCを実現したい。CloudFormationとGitと利用してCI/CDパイプライン環境を構築したい。

このような筆者自身の疑問に対して、調べならがら環境を構築していく過程を公開していきます。
というわけでこの記事は実況中継型の記事で適宜更新していきます。

この記事で分かる事

  • このハンズオンで目指す構成
  • このハンズオン作業の背景
  • このハンズオン作業のゴール
  • 筆者の環境
  • CloudFormationについて
  • Gitについて
  • CI/CDパイプラインについて
  • 実際の作業手順

このハンズオンで目指す構成


上記の構成を目指します。詳細は後ほど。

このハンズオン作業のゴール

Gitにコードをアップしておいて、好きなタイミングでCloudFormationを通して様々な構成をAWS上に展開が可能。今はざっくりとこのような状態をゴールにしています。

このハンズオン作業の背景

作業の背景は以下の通り。

  1. 個人でAWSの動作検証をする機会がかなり多く、毎回AWSマネジメントコンソールから操作するのは大変だしオシャレじゃない。(環境を放置してしまうとそれなりの課金が発生するので、それは避けたい。)
  2. 個人的に、AWSをコードで管理して、CI/CDパイプラインを回すところまで構築したいのと、何パターンか試したい。
  3. せっかくなら、構築したコードをGitで管理して、コードをオープンにしつつ、自分もオンデマンドで環境を作れるようにしたい。

その1について

端的には、時間と手間の節約のため、自動化をしたい というのがあります。

自分の技術向上のために、個人環境でAWSのハンズオン作業をほぼ毎日行っていますが、作業のたびにAWSマネジメントコンソールから手動で環境をつくるのがかなりしんどく感じるようになってきました。

その対策として、自己学習用のAWS環境をコード管理し、環境の構築と削除を自動化をしたいというのが背景です。

その2について

環境を整えて、試行回数を増やしたい というのがあります。

AWS上での環境構築を自動化をして、ガンガンいろいろなパターンを試すためです。

その3について

端的にいうと、個人的に作成した環境のコードをGitにアップし、草を生やしておくためです。

筆者の環境

ローカル開発環境 Windows10からブラウザよりAWSマネジメントコンソールに接続して作業
SSH通信 TeraTermを利用
作図 dwarioのAWS19アイコンを利用

CloudFormationについて

すこし、CloudFormationについておさらいします。

AWSで構築したインフラをコード管理する(Infrastracture as Code IaC)手法には、代表的な以下の3つの手法

そもそも、AWSで構築したインフラをコード管理する手法には、代表的な以下の3つの手法があるといわれています。

  • Amazon CloudFormation
  • Terraform by Hashi Corp
  • CDK Cloud Development Kit

このなかでも、筆者はAmazonのマネージドサービスであるAmazon CloudFormationを利用したCode管理を選択します。理由はAmazonのマネージドサービスなので、ドキュメントが多く、学習コストが低いと考えるからです。

Terraformに関しては、GCPなどほかのパブリッククラウドをコード管理することも可能ですし、開発も活発におこなわれていますので、導入するメリットは大きそうです。

また、筆者自身がAWSの学習を始めたころに、少し体験したので親近感もあるのですが、現状はいったんAWSの各種サービス取得に主眼があるので今回は深堀しません。

CDKはCloudFormationの上位互換ともいわれており、いずれ取得したい技術ですが、今回はいったんCloudFormationを利用します。

CloudFormationとは

  1. テンプレートファイルでAWSリソースをプロビジョニングが可能
  2. テンプレートベースでリソースの作成・変更・削除が可能
  3. CloudFormation自体の追加料金はなし

その1について

  • テンプレートはCloudFormationの要
  • テキストファイル(JSON形式、YAML(やむる)形式で記述)
  • スタックのリソース状態を記述
  • リソースを記述する順番は関係がない。CloudFormationが自動解決してくれるため

その2について
テンプレートベースでのメリットは以下の通り
インフラの管理を簡略化ができる
一度テンプレートからスタックを作成しておくと、作成が簡単。また、スタック単位でのリソース一括削除も可能。

インフラを簡単に複製することが可能
テンプレートを再利用することで、インフラを立てたり撤去したりが簡単。複数リージョンへのインフラ展開が可能。

その3について
この点は特に補足はなしですね。CloudFormation自体の追加料金はなしです。

CloudFormationの実行方法

Amazonマネジメントコンソールで実行が可能です。またCLIでも実行が可能です。ただし、筆者が実現したいのは、自動化をすることなので、CloudFormation上での再現性が必須。

ということで、CLIで実行していきます。

また、CLIで実行する際に、create-stack, update-stack, deployの3つがありますが、deployが推奨されているようです。

これは、ChangeSetという機能を利用して、事前にスタックに対する変更点を抽出し、必要なインフラを消し去ってしまうようなトラブルを防げるからです。

システムを運用する上では、変更前に差分を確認できるのは本当にありがたいですね。というか基本ですね。

企業などで、誰でも簡単に変更が可能なインフラ作っても、承認通りませんよね。上司で秒で却下されちゃいますwww

ChangeSetについて
変更前に変更点を抽出してくれる機能

ドリフト検出について
Amazonマネジメントコンソールから手動で作ったリソースがある場合、その差分を抽出してくれる機能

Gitについて

Gitとは、ざっくりいうとファイルのバージョン管理が簡単にできるツールです。

バージョン管理というのは、プログラムについて、だれがいつどこをいつ変更したかを管理しておいて、例えば最新バージョンに変更したときに不具合があればすぐに戻したりすることができます。

またプログラムの二重チェックも可能です。たとえば自分が書いたコードをGitにプッシュしてレビューを依頼すると、先輩エンジニアや上司が承認してくれる、そんな感じです。

このように、開発をスムーズに効率的に行うためのツールがGitです。

CI/CDパイプラインについて

まず、CloudFormationを実行する場所候補としては、以下があります。

  • 個人のクライアントPC
  • 適当なEC2インスタンス
  • リポジトリからのパイプライン実行

IaC
個人のクライアントPC
適切な権限を付与したIAMユーザーに、Amazon CLIをインストールして実行できます。

適当なEC2インスタンス
EC2インスタンスに適切なIAMロールをを付与して実行できます。

リポジトリからのパイプライン実行
テンプレートからのリポジトリコミットからパイプラインにより実行します。今回の構成では、インフラをコード管理したいので、この手法をとります。

CloudFormationとGitを利用してCI/CDパイプライン環境を構を構築する手順の概要

以下の手順を想定しています。詳細は調査中ですが、適宜更新予定です。

  • Step01 CloudFormationでAWS環境をコード管理する
  • Step02 GitとCloudFormationを連携する

まとめ

この記事では、AWSをコードで管理したい。IaCを実現したい。CloudFormationとGitと利用してCI/CDパイプライン環境を構築したい。という筆者自身の疑問を解決するため、CloudFormationを軸にしてAWSのインフラをコード管理する手法を考えました。

もっと調査を進めて手順を整理して、実際にハンズオンもして、Gitにコードをあげるまでを実況中継していきますので、引き続きご覧いただければ幸いです。