メモ
以前取得したAWSの資格「クラウドプラクティショナー」に続き「ソリューションアーキテクトアソシエイト(SAA-C03)」取得を目指して勉強中!
いつも何か勉強するときは基本的に書きながら覚えるのでここでアウトプットします。
有益な情報かどうかは不明(笑)
スポンサーリンク
AWSにおける継続的なアプリケーション開発の支援サービス
アプリケーションは、一度作ってしまえばそれで終わり、というわけではない。
利用者の声を聞きながら新しい機能を追加したり、報告のあった不具合を改修したりすることで、継続的にアプリケーションの価値を高めていくことが重要。
そのため、ソースコードをビルドしたり、ユニットテストを走らせたりといった開発プロセスの自動化を考える必要がある。
このような考え方は、継続的インテグレーション(CI)や継続的デリバリー(CD)と呼ばれる。
そのための環境、CI/CD環境をマネージドサービスとして提供しているのがCodeシリーズ。
Codeシリーズの概要と各サービスの役割
Codeシリーズには次の5つのサービスがある。
・CodeCommit:ソースコードを管理するGitリポジトリサービス
・CodeBuild:ソースコードのビルド/テスティングサービス
・CodeDeploy:ビルドされたモジュール(アーティファクト)のデプロイサービス
・CodePipeline:上記3つのサービスを束ねて、一連のプロセスを自動化するサービス
・CodeStar:上記4つのサービスを利用したCI/CD環境を自動構築するサービス
★AWSではCodeシリーズのサービスとしてCodeCommit、CodeBuild、CodeDeploy、Codepipeline、CodeStarの5つが提供される。これらによって、継続的インテグレーション(CI)や継続的デリバリー(CD)が実現される
CodeCommit
CodeCommitは、ソースコード管理のためのGitリポジトリサービスを提供するマネージドサービス。
チームでアプリケーションを開発していく際に、ソースコードをバージョン管理するのは今では当たり前。
特に最近では、Gitを用いることがデファクトスタンダードとなっている。
Gitのリポジトリを用意する場合、大きく下記の2つの方式がある。
・自前でサーバー上に導入する
・SaaSを利用する
最初の方法では、自身で用意したサーバー上にGitリポジトリをホスティングするため、クローズドな環境でGitを使えるメリットがある。
しかし、サーバーの保守であったり、ソフトウェアのアップデートなども自分で行う必要があるため、その管理工数がかかってしまう点がデメリット。
SaaSを用いると、サーバーのメンテナンス作業に工数がかからないため、本来行いたい開発業務に人的リソースを割り当てることができる。
世の中には、Gitリポジトリを提供するSaaSがいくつかあるが、CodeCommitはそのうちの1つになる。
★CodeCommitは、ソースコード管理のためのGitリポジトリを提供するマネージドサービス
CodeCommitの特徴
IAMユーザーを用いた権限管理
まず、CodeCommitの特徴として、IAMユーザーを用いて権限管理を行う点が挙げられる。
例えば、HTTPS方式でアスセスする場合は、コンソール上でコマンドを利用し、ローカル環境にあるIAMのクレデンシャル情報を用いてGitリポジトリに接続できる。
SSHで接続する場合は、ターミナル上で秘密鍵と公開鍵のペアを作成し、公開鍵をマネジメントコンソールでIAMユーザーに紐づけることでGitリポジトリに接続する。
開発に携わるメンバーが全員IAMユーザーを保持しているのであれば、Gitリポジトリ用のユーザー管理をしなくて済むことが利点と言える。
他のAWSサービスとの連携
AWSのサービスでGitリポジトリを運用するメリットとして、他のAWSサービスとシームレスに連携できることが挙げられる。
設定画面からわかるように、Gitリポジトリで何らかのイベントが発生した際に、それをトリガーにSNSトピックを呼び出すことができる。
SNSトピック経由で他のAWSサービスをキックすることができ、様々な連携を行うことができる。
また、CodePipelineやその他のCodeサービスと組み合わせることで、CI/CD環境を簡単に構築できる。
CodeCommitに新しいソースコードをPushすると、自動でそれをビルドし、自動でユニットテストを走らせ、自動で開発環境へデプロイするといった連携を簡単に設定できる。
プルリクエスト機能の提供
チームでソフトウェア開発をする場合、コードレビューによる品質の担保が非常に重要になる。
そのコードレビューを支援するためのプルリクエスト機能がある。
ソースコードのどの部分が修正されたかをdiffで表示したり、誰がその修正を承認していて、誰が修正が必要とコメントしているかといったコミュニケーションを支援する。
現在ではチーム開発に欠かせない機能となっているプルリクエスト機能だが、CodeCommitでも2017年11月のアップデートでサポートされていた。
スポンサーリンク
CodeBuild
CodeBuildは、その名の通りソースコードのコンパイル/ビルド環境を提供するマネージドサービス。
継続的な開発プロセスでは、最新ソースコードをビルドし実行できる形にするまでの流れを自動化することが多い。
そのためにビルド用のサーバーを調達し、Jenkinsのようなソフトウェアを導入したビルド環境を用意する必要がある。
しかし、その環境の管理が必要なことや、ビルドする時にしか使わない環境のためにインフラリソースを確保し続けなければならないなどの課題があった。
この課題を解消するSaaSサービスもいくつかあるが、CodeBuildもその1つ。
★CodeBuildは、ソースコードのコンパイル/ビルド環境を提供するマネージドサービス
CodeBuildの特徴
ビルド環境を簡単に構築可能
CodeBuildはビルド環境を簡単に構築、運用できるマネージドサービス。
マネジメントコンソールから数ステップでビルド環境を構築できる。
また、CodeBuild上でユニットテストを実行することもでき、継続的な品質の担保にも貢献する。
ビルド環境のランタイムとして、JavaやPHP、Python、Ruby、Node.jsなどを標準でサポートしている他、個人で用意したDockerイメージを利用することもできる。
ビルド対象のソースコード取得元として、CodeCommitはもちろんのこと、外部プロバイダーとしてGitHubやBitbucketを選択することもできる。
S3から取得することも可能なため、ソースプロバイダーとして対応していないリポジトリを利用している場合は、一度S3に転送する必要がある。
ビルドの定義はbuildspec.ymlに記載する
CodeBuildで提供されるビルド環境上で何をするかは、設定ファイルのbuildspec.ymlに記載する。
この設定ファイルには、次の内容が含まれる。
・ビルド環境のセットアップ情報
・ビルド/ユニットテスト実行コマンド
・ビルド前後にしたい処理
・ビルド後の出力情報
料金は従量課金型
気になる料金体系は、ビルドにかかった時間単位の従量課金となる。
CodeBuildで選択した環境のスペックに従った料金体系となる。
従量課金のため課題の1つであった「インフラリソースを使っていない間のコスト」を気にしなくて済む。
また、アプリケーションの成長に伴いビルド負荷が高まってきたタイミングで、環境のスペックを上げることも可能。
開発当初から高いスペックのリソースを用意しなくてよいことも、コストメリットの1つといえる。
CodeDeploy
CodeDeployは、ビルド済みのモジュール(アーティファクト)のサーバーへのデプロイを自動化するサービス。
運用中のシステムに対して新しいモジュールをデプロイするには様々な工夫が必要になる。
例えば、複数台のWebサーバーにモジュールをデプロイする場合、一気に全てのサーバーにデプロイするのではなく少しずつ、システムを停止することなくデプロイしたい、という要望がよくある。
この場合、ロードバランサー配下にあるサーバーを少しずつ切り離してデプロイし、再度ロードバランサーにアタッチするといった作り込みが必要になる。
また、少しずつデプロイし始めたのはいいが途中で新しいモジュールに不具合が見つかったという場合に備えてロールバックを考慮する必要がある。
この作業についても、方針を検討したり、切り戻し用のスクリプトや手順を作成する必要があった。
CodeDeployには、こういったデプロイの悩みを解決する機能があらかじめ用意されている。
CodeDeployを用いることで、デプロイのための作り込みを減らすことができ、よりビジネスに直結する機能の開発に集中できる。
★CodeDeployは、ビルド済みのモジュール(アーティファクト)のサーバーへのデプロイを自動化するサービス
CodeDeployの特徴
デプロイ先を選択可能
CodeDeployは、EC2やLambda、そしてオンプレミスのサーバーに対してモジュールをデプロイできる。
EC2やオンプレミスサーバーを対象とする場合は、対象サーバーにCodeDeployエージェントをインストールしておく必要がある。
デプロイ時にどのモジュールを、どこに配置するかといった設定は、appspec.ymlに定義する。
デプロイの前後に何かしらの処理を差し込む場合は、このappspec.ymlの「hooks」エリアに定義することで実現できる。
デプロイ方式を選択可能
システムのサービスレベルによっては、無停止で新機能をデプロイすることが求められる。
このような要件に対応できるように、CodeDeployではデプロイの方式をいくつか用意している。
・AllAtOnce:関連するサーバー全てに同時デプロイを行う。リリース時間が最も短くなる半面、システム全体でダウンタイムが発生してしまう
・HalfAtATime:関連するサーバー群の半分のリソースに対してデプロイを行う。デプロイの前に対象のサーバーをロードバランサーから切り離すため、デプロイ中は半分のサーバーで縮退運用することになる。半分のリソースでも高負荷にならないようなデプロイ計画が必要
・OneAtATime:関連するサーバーを1つずつロードバランサーから切り離し、デプロイを行う方式。ロードバランサーから切り離されるサーバーは最大でも1台なため、他のサーバーに負荷がかかりにくくなる。その分リリースにかかる時間が長くなる
その他、「正常に稼働しているホスト数が3つ以上を維持する」「正常に稼働しているホスト数が全体の25%以上を維持する」といった独自のデプロイ設定を作成することも可能。
また、「デプロイが失敗した時にロールバックする」機能を有効にすることで、デプロイに失敗した場合の切り戻しを自動で行うことも可能。
デプロイ対象のサーバーが増減する場合への対応
デプロイの仕組みを自前で構築する場合、サーバー数が増減した際の対応が必要。
特に、Auto Scalingを用いて動的にサーバー数が変わる構成を採用している場合は、この設計の難易度が上がる。
CodeDeployでは、AutoScalingグループをデプロイ対象として選択できるため、この問題に簡単に対処できる。
スポンサーリンク
CodePipeline
Codeシリーズとして、CodeCommit、CodeBuild、CodeDeployを用いることで、ソースコードの管理・ビルド・サーバーへのデプロイの「それぞれ」を容易に実現できるようになった。
しかし、
・ソースコードが変更されたことを検知してビルドする
・ビルドの完了を待って検証環境にデプロイする
といった前段の作業が終わったことを検知し、その後続の作業を実施する部分については人手が必要な状況。
開発が続く限り、この一連の作業を何度も繰り返すことになるため、サイクル全体を自動化したいところ。
このような要望に対応するのがCodePipeline。
★CodePipelineは、CodeCommit、CodeBuild、CodeDeployのサービスを束ねて、一連の開発プロセスを自動化するサービス
CodePipelineの特徴
開発プロセスの自動化
CodePipelineを用いることで、
・ソースコードのPush
・(Pushを検知して)→ソースコードのビルド
・(ビルドが完了したことを検知して)→アーティファクトのデプロイ
という自動化されたパイプラインを作成することができる。
パイプラインはビジュアライズされるため、現在どの作業が進んでいるかを一目で理解できる。
ここまでは、Codeシリーズを使う前提で説明してきたが、一部のプロセスをAWS以外のサービスに置き換えることも可能。
例えば、ソースコードの取得元をGitHubのリポジトリに設定したり、ビルドやテスティング部分をJenkinsに任せたりすることができる。
開発プロセスの一部がすでにある場合は、足りない部分をCodeシリーズで埋めた上で、CodePipelineで自動化するという使い方も可能。
承認プロセスを定義することも可能
CodePipelineでは、リリースの承認プロセスをパイプラインの途中に挟むことも可能。
例えば、開発チーム内でのテストが終わった後、リリース承認者に対してUAT(ユーザー受け入れテスト)を依頼するシーンがある。
CodePipelineでは、次のように承認(approval)プロセスを定義することができる。
・開発環境へのリリースまでは自動で行う
・UAT環境へのリリースの直前に承認者にメールを送信し、承認者が承認するまでパイプラインの処理を停止する
・承認者が承認したタイミングでUAT環境へのリリースを行う
まとめ
開発者ツール
・AWSでは、CodeシリーズのサービスとしてCodeCommit、CodeBuild、CodeDeploy、CodePipeline、CodeStarの5つが提供される。これらによって、継続的インテグレーション(CI)や継続的デリバリー(CD)が実現される
・CodeCommitは、ソースコード管理のためのGitリポジトリサービスを提供するマネージドサービス
・CodeBuildは、ソースコードのコンパイル/ビルド環境を提供するマネージドサービス
・CodeDeployは、ビルド済みのモジュール(アーティファクト)のサーバーへのデプロイを自動化するサービス
・CodePipelineは、CodeCommit、CodeBuild、CodeDeployのサービスを束ねて、一連の開発プロセスを自動化するサービス