はじめに
この記事の内容
CodeDeployについて、「基礎学習」と「ハンズオン」の2パートに分けて解説します。
- 基礎学習
- 概要
- 構成要素
- 利用するメリット
- 料金
- デプロイタイプ
- ハンズオン
- GitHubに格納しているソースコードを、CodeDeployでEC2にデプロイする。
試験範囲との関係
この記事の内容は、認定資格「AWS Solution Architect Professional」の試験範囲をカバーします。
認定資格取得を目指す方は…
この記事では基礎的な内容のみを扱っているため、資格取得を目指す方はUdemyや書籍での自主学習も併せて行うことを推奨します。
基礎学習
ハンズオンの前に、まずはCodeDeployの基礎知識を解説します。
CodeDeployの概要
CodeDeployは、AWSが提供する継続的デプロイメント(CD)サービスです。
このサービスを使用することでアプリケーションを、EC2インスタンス、Lambda関数、ECSサービス、オンプレミスサーバーに対して、簡単かつ迅速にデプロイすることができます。
CodeDeployの構成要素
CodeDeployの主な構成要素について説明します。
No. | 構成要素 | 説明 |
---|---|---|
1 | アプリケーション | デプロイ対象のアプリケーションを指します。 |
2 | デプロイグループ | デプロイメント先のインスタンスやLambda関数をグループ化したものです。 |
3 | CodeDeployエージェント | EC2・オンプレサーバへのデプロイに必要なソフトウェア。 CodeDeployサービスと通信し、実際のデプロイメント処理を行います。 |
4 | AppSpec | アプリケーションのデプロイ方法を記述したYAMLファイルです。 |
CodeDeployを利用するメリット
AWS CodeDeployを使用することで、以下のようなメリットが得られます。
- デプロイメントの自動化
- 手動操作を減らすことで人為的なミスを防ぎます。
- 一貫性の確保
- 同じ設定で複数の環境にデプロイできるため、環境間の一貫性が保たれます。
- 他サービスとの統合性
- AWS CodePipelineなど、ほかのAWSサービスと簡単に統合できます。
CodeDeployの料金
デプロイ先に応じて料金が発生しますが、CodeDeploy自体は基本的に追加料金なしで利用できます。
デプロイ先 | 料金 |
---|---|
EC2, Lambda, ECS | 無料 |
オンプレサーバ | 0.02 USD/回 |
デプロイメントのためにCodeDeploy と共に使用した、他の AWS リソース(S3バケットなど)に対しては料金が発生します。
CodeDeployのデプロイタイプ
CodeDeployでは、デプロイグループを作成する際に「デプロイタイプ」を選択します。
デプロイタイプは、アプリケーションの更新やデプロイをどのように実施するかを決定するもので、「インプレース」と「BLue/Green」が提供されています。
インプレース
既存のインスタンス上でアプリケーションを新バージョンに置き換える方法で、以下のプロセスでデプロイが行われます。
デプロイ開始時に、現在のアプリケーションが停止または削除されます。
新しいアプリケーションのコードや設定が、既存のインスタンスに展開されます。
あたら石井バージョンがデプロイされた後、アプリケーションが再起動されます。
- 設定が容易
- 比較設定が簡単で管理も容易です。
- コスト効率
- 新規インスタンスを作成する必要がないため、コストが抑えられます。
- ダウンタイムの発生
- アプリケーションの停止と再起動が必要なため、デプロイ中にダウンタイムが発生します。
- リスク管理
- デプロイメント中に問題が発生した場合に、既存のインスタンスが一時的に利用できない場合があります。
Blue/Green
2つの環境(BlueとGreen)を使用して、デプロイメントのリスクを最小限に抑える方法で、以下のプロセスでデプロイが行われます。
Green環境(新しい環境)に対して、新バージョンのアプリケーションがデプロイされます。
新しい環境が完全に準備ができたら、トラフィックをGreen環境に切り替えます。
- 最小限のダウンタイム
- 新しいバージョンを別環境にデプロイしてからトラフィックを切り替えるため、ダウンタイムが最小限に抑えられます。
- リスクの低減
- 問題が発生した場合、トラフィックをすぐに元の環境(Blue環境)に戻すことができるため、リスクを低減できます。
- スムーズなロールバック
- 新環境に問題があった場合でも、すぐに元の環境に戻すことができます。
- コストの増加
- 新しい環境を用意するため追加のリソースが必要になります。
- 複雑な管理
- 2つの環境を管理する必要があり、設定や運用が複雑になる場合があります。
ハンズオン
GitHubリポジトリにホストされたHTMLソースを、EC2インスタンスへデプロイします。
前提条件
- AWSアカウントを所持していること
- GitHubのアカウント登録が完了していること
- Gitがインストールされていること
- GitHubにサンプルアプリをプッシュするために必要です。
構築手順
以下のファイル構成をGitHubのリポジトリに配置します。
sample-app/
├── appspec.yaml
├── scripts/
│ └── deploy.sh
└── index.html
- appspec.yaml
- CodeDeployのデプロイ設定ファイルで、「ファイルのコピー先」と「デプロイの各ステージで実行するスクリプト」を指定します。
version: 0.0
os: linux
files:
- source: /index.html
destination: /var/www/html/index.html
hooks:
AfterInstall:
- location: scripts/deploy.sh
timeout: 300
runas: root
- scripts/deploy.sh
- デプロイ後に実行したい任意のコマンドを追加できます。例えば、Webサーバーの再起動などです。
#!/bin/bash
echo "Deploy script executed."
# You can add commands to configure or restart services if needed
- index.html
- ウェブサイトのコンテンツを定義するHTMLファイルで、デプロイ先のウェブサーバーで表示されるページの内容を含みます。
<!DOCTYPE html>
<html>
<head>
<title>My Sample App</title>
</head>
<body>
<h1>Hello, AWS CodeDeploy!</h1>
</body>
</html>
CodeDeployとEC2ににアタッチするIAMロールを作成します。
- CodeDeploy用のIAMロール
- IAMのコンソール画面に遷移し、左側のメニューから「ロール」を選択します。
- 「ロールを作成」を選択し、以下設定のIAMロールを作成します。
ステップ | 項目 | 設定値 |
---|---|---|
信頼されたエンティティを選択 | 信頼されたエンティティタイプ | AWSサービス |
サービスまたはユースケース | CodeBuild | |
許可を追加 | 許可ポリシー | AWSCodeDeployRole |
名前、確認、および作成 | ロール名 | 任意の名前 |
- EC2用のIAMロール
- 「ロールを作成」を選択し、以下設定のIAMロールを作成します。
ステップ | 項目 | 設定値 |
---|---|---|
信頼されたエンティティを選択 | 信頼されたエンティティタイプ | AWSサービス |
サービスまたはユースケース | EC2 | |
許可を追加 | 許可ポリシー | AmazonS3FullAccess |
名前、確認、および作成 | ロール名 | 任意の名前 |
EC2を配置するVPCを作成します。
- VPCのコンソール画面に遷移し、「VPCを作成」を選択します。
- 「10.0.0.0/16」のCIDRを持つVPCを作成します。
EC2を配置するパブリックサブネットを作成します。
- サブネットの作成
- VPCのコンソール画面に遷移し、左側のメニューから「サブネット」を選択します。
- 「サブネットを作成」を選択し、以下設定のサブネットを作成します。
項目 | 設定値 |
---|---|
VPC ID | Step1で作成したVPCのID |
IPv4 サブネット CIDR ブロック | 10.0.1.0/24 |
- インターネットゲートウェイの作成
- 左側のメニューから「インターネットゲートウェイ」を選択します。
- 「インターネットゲートウェイを作成」を選択し、インターネットゲートウェイを作成します。
- 「アクション」>「VPCにアタッチ」の順に選択します。
- Spte1で作成したVPCを選択し、「インターネットゲートウェイのアタッチ」を選択します。
- ルートテーブルへのルート追加
- 左側のメニューから「サブネット」を選択します。
- 先ほど作成したサブネットを選択し、「ルートテーブル」>「{ルートテーブルのリンク}」を選択します。
- 該当のルートテーブルを選択し、「ルート」>「ルートを編集」の順に選択します。
- 「ルートを追加」を選択し、以下のルートを追加します。
項目 | 設定値 |
---|---|
送信先 | 0.0.0.0/0 |
ターゲット | インターネットゲートウェイ ※先ほど作成したインターネットゲートウェイを選択します。 |
デプロイ先のEC2を作成します。
- EC2のコンソール画面に遷移し、「インスタンスを起動」を選択します。
- 以下設定のEC2インスタンスを作成します。
カテゴリ | 項目 | 設定値 |
---|---|---|
名前とタグ | 名前 | 任意の名前 |
アプリケーションおよび OS イメージ (Amazon マシンイメージ) | AMI | Amazon Linux 2023 AMI ※無料利用枠の対象 |
インスタンスタイプ | t2.micro | |
キーペア | キーペア名 | 新しいキーペアの作成 |
ネットワーク設定 | VPC | Step2で作成したVPC |
サブネット | Step3で作成したサブネット | |
パブリックIPの自動割り当て | 有効化 | |
ファイアウォール | セキュリティグループを作成 | |
セキュリティグループ名 | 任意の名前 | |
タイプ | ssh | |
ソースタイプ | 自分のIP |
Step4で作成したEC2に対して、CodeDeployエージェントをインストールします。
- Step4で作成したEC2にSSH接続します。
- 以下のインストールコマンドを実行します。
sudo yum update
sudo yum install ruby
sudo yum install wget
- ホームディレクトリに移動します。
cd /home/ec2-user
- CodeDeploy エージェントインストーラをダウンロードします。
wget https://aws-codedeploy-ap-northeast-1.s3.ap-northeast-1.amazonaws.com/latest/install
上記は東京リージョンのS3バケットからダウンロードするコマンドです。
それ以外のリージョンのS3バケットからダウンロードしたい場合は、「リージョン別リソースキットバケット名」を参照して、上記コードの「バケット名」と「リージョン識別子」を更新してください。
install
ファイルに実行権限を設定し、エージェントの最新バージョンをインストールします。
chmod +x ./install
sudo ./install auto
- サービスの実行状況を確認します。
systemctl status codedeploy-agent
以下のようなメッセージが表示されていれば、サービスが実行されています。
>「 Active: active (running) since xxx; yyy ago」
- CodeDeployアプリケーションの作成
- CodeDeployのコンソール画面に遷移し、左側のメニューから「アプリケーション」を選択します。
- 「アプリケーションの作成」を選択し、以下設定のアプリケーションを作成します。
項目 | 設定値 |
---|---|
名前 | 任意の名前 |
コンピューティングプラットフォーム | EC2/オンプレミス ※今回はデプロイ先をEC2とするためです。 |
- CodeDeployデプロイメントグループの作成
- 作成したアプリケーションを選択し、「デプロイグループの作成」を選択します。
- 以下設定のデプロイグループを作成します。
項目 | 設定値 |
---|---|
デプロイグループ名 | 任意の名前 |
サービスロール | Step1で作成したIAMロール(CodeDeploy用)のARN |
デプロイタイプ | インプレース ※今回はあくまでハンズオンのため、コストが安く済む法を選択します。 |
環境設定 | Amazon EC2 インスタンス |
キー:Name 値:作成したEC2 | |
AWS CodeDeploy エージェントのインストール | なし ※Step5でインストール済みのため。 |
デプロイ設定 | CodeDeployDefault.AllAtOnce ※一度にすべてのインスタンスに対してデプロイします。 |
Load balancer | 無効 |
EC2にGitHubに格納してあるアプリケーションをデプロイします。
- Step7で作成したアプリケーションを選択して、「アプリケーションをデプロイする」を選択します。
- 以下設定でデプロイメントを作成します。
項目 | 設定値 |
---|---|
デプロイグループ | Step7で作成したデプロイグループ |
リビジョンタイプ | アプリケーションはGitHubに格納されています |
GitHub トークン名 | |
リポジトリ名 | Step1でサンプルアプリを格納したリポジトリ |
コミットID | Step1でサンプルアプリを格納したコミットID |
- 処理が成功していることを確認します。
おわりに
本記事では、AWS CodeDeployの基本概念とその使用方法について解説しました。
CodeDeployを活用することで、アプリケーションのデプロイメントプロセスを自動化し、一貫性を保ちながら迅速に展開できます。
特に、複数のインスタンスやリージョンにわたるデプロイを簡単に管理できるため、スケーラブルで信頼性の高いデプロイメントが実現可能です。
クラウドアプリケーションの開発と運用において、CodeDeployは非常に重要なツールです。
本記事を参考に、プロジェクトに最適なデプロイ戦略を考え、運用の効率化を図ってみてください。
コメント