LoginSignup
3
2

More than 1 year has passed since last update.

EC2 にデプロイするCI/CD環境を作ってみた

Last updated at Posted at 2023-03-04

はじめに

AWS Code シリーズを使って Amazon EC2 にデプロイするCI/CD環境を構築してみました。
構築手順を忘れないために残しておきます。

構築する構成は以下です。
image.png

※前提条件
本手順ではローカル開発環境( IDE, Git, AWS CLI ) はセットアップされた状態でスタートします。

CodeCommitの設定

AWS コンソールにログインし、CodeCommitのサービスに移動します。
リポジトリの作成をします。
image.png
Code CommitにCLIで接続できるようにします。
今回は、認証情報ヘルパーを使った方法で設定しました。
手順は公式ドキュメントを参照。

接続できるようになったら、ローカルにリモートリポジトリのクローンを作成します。
コンソール画面からgit cloneコマンドをコピーして、ターミナルで実行します。
image.png

CodeCommitにファイルを登録してみる

HTMLファイルの作成します。
最終的なフォルダ構成
demoCICD
∟ src / index.html
∟ src / appspec.yml
∟ buildspec.yml

index.html(サンプル)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

    <style>
        .sample{
            margin-top: 20%;
            margin-left: 20%;
        }
    </style>
</head>
<body>
    <div class="sample">
        <h1>CI/CD demo</h1>
        <h2>version 1</h2>        
    </div>
</body>
</html>

コミットしてpushしてみます。

git add -A 
git commit -m "init"
git push origin main

無事リポジトリに反映されるか確認しましょう。

デプロイ先となるEC2を準備する

EC2に紐づけるIAMロールの作成

IAMのサービスページに移動して作成します。EC2を選択して「次へ」
image.png
S3アクセスが必要となるので、フルアクセスの権限をつける。(ユースケースに応じて権限は絞ってください。)
image.png
あとはロール名を決めて作成

EC2を起動

今回は、マシンイメージ、インスタンスタイプなどはデフォルトで進めます。
image.png
ネットワーク設定の項目では、

  • 「パブリックIPの自動割り当て」を有効化(今回はIPでブラウザからアクセスして動作確認します。)
  • セキュリティグループは新規に作成します。
    • インバウンドセキュリティグループのルールを追加します。
    • 下記画面のようにHTTPで通信できるようにしておきます。
    • IPは会社のIPや自宅のIPなど適切に絞ってください。
      image.png
      次に、「高度な設定」で先ほど作ったIAMロールを紐づけます。
      「IAMインスタンスプロフィール」で設定します。
      「キーペアなし」で作成します。

EC2への接続はsshではなく、ssmエージェントを利用した方法が推奨 [参考]

EC2のセットアップ

インスタンスが起動したら、「接続」ボタンを押してインスタンスに接続します。
image.png

以下のコマンドを流していきます。

sudo yum update -y
sudo yum install httpd -y
# httpdの起動
sudo systemctl start httpd.service
# 再起動がかかった際に起動するようにしておく
sudo systemctl enable httpd.service

終わったら、EC2インスタンスのパブリックIPをコンソール画面からコピーして、ブラウザに貼り付けます。apacheのテストページが表示されるのを確認します。
image.png

次にCodeDeployからEC2にデプロイするために、デプロイエージェントをインストールします。
手順に沿ってコマンドを実行します。

S3バケットの作成

artifactを格納するS3を作成します。
バケット名決めて作成するだけなので、割愛します。

CodeBuildeの設定

Codebuildのサービスページに移動して、ビルドプロジェクトを作成していきます。
image.png

作成したCodeCommitのリポジトリとブランチを選択します。
image.png

Linux環境で設定を進めます。イメージやバージョンは最新で進めます。
サービスロールは新規に作成を選択します。
image.png

アーティファクトは先ほど作ったS3に格納するように設定します。
パッケージ化は「Zip」を選択し、他の項目はデフォルトで進めます。
image.png

上記ビルドプロジェクトの過程で作成されたIAMロールに必要なポリシーをアタッチします。
IAMロールの設定画面から該当のIAMを選択し、「許可を追加」 > 「ポリシーをアタッチ」 > 下記スクショのポリシーを選択してアタッチします。
image.png

buildspec.ymlを書く

フォルダ直下にbuildspec.ymlファイルを作成します。
buildspec.ymlの書き方は公式ドキュメントを見て書き方を調べます。
今回ビルドフェーズで実行するコマンドは、CodeDeployでデプロイするリビジョンを引き渡します。参考

buildspec.yml(サンプル)
version: 0.2

# <application-name>と<backet>は書き換えてください。
phases:
  build:
    commands:
      - aws deploy push --application-name <application-name> --s3-location s3://<backet>/artifact.zip --source src
artifacts:
  files:
    - '**/*'
  base-directory: src

CodeDeployの設定

CodeDeploy の設定をしていきます。

IAMrole の作成

CodeDeployで使うIAMroleをまず作ります。
IAMrole作成画面で、信頼されたエンティティとしてCodeDeployを選択して作成します。
image.png

CodeDeploy でアプリケーションを作成

「アプリケーションの作成」を押します。
image.png
image.png

次にデプロイグループを作成します。
image.png
先ほど作成したIAMroleを選択します。
image.png
今回は「デプロイタイプ」としてインプレースを選択し、EC2に付けたProjectタグとEnvironmentタグを指定してデプロイします。
image.png

今回は手動でインストールしたので、「なし」を選択します。
image.png

ロードバランシングのチェックは外します。
image.png

appspec.ymlを書く

CodeDeployで読み込むappspec.ymlを作成します。
srcフォルダにappspec.ymlファイルを作成します。
appspec.ymlの書き方は公式ドキュメントを見て調べます。

appspec.yml(サンプル)
version: 0.0
os: linux
files:
  - source: /
    destination: /var/www/html/

アプリケーションをデプロイしてみる

「アプリケーションをデプロイする」からデプロイしてみるのですが、CodeBuildでアーティファクトを作成しておく必要があるので、一旦CodeBuildに遷移して、ビルドの開始を押します。
成功したら再度CodeDeployに戻って、作業を続けます。
image.png
デプロイの作成画面でデプロイグループとリビジョンの場所を選択します。
image.png

CodePipeline を作る

あとわずかです。
今まで作ったコンポーネントをCodePipelineで繋げていきます。
パイプライン作成画面で、CodePipeline用のロールを作ります。
image.png
ソースステージを設定します。
image.png
ビルドステージを設定します。
image.png
デプロイステージを設定します。
image.png

完成です。

動作確認

index.html に変更を加えたら、下記コマンドをターミナルから実行して、git pushしていきます。

# ステージングエリアに追加
git add -A

# ローカルリポジトリに追加
git commit -m "comment"

# リモートリポジトリにプッシュ
git push origin main

無事最後まで流れて成功しました。
image.png

デプロイしたEC2のパブリックIPにブラウザからアクセスして、HTMLも無事表示されました。
image.png

さいごに

実際にシステム開発する際には商用、検証、ステージングなどでAWSアカウントを分離してCI/CDパイプラインを構築するケースが多いかと思います。
参考になるリンクを記載しておきます。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2