👌

GitHubからAWSにCodePipelineとCodeDeployで資材を配置してみる

2022/02/16に公開

概要

GitHubからAWSに対してCodePipelineとCodeDeployを用いて、EC2に資材を配置(自動デプロイ)してみます。
まずは、ビルドの必要のないアプリケーション(HTMLなど)のインプレース(単純ファイル置き換え)でのEC2へのデプロイ構成になります。

手順

EC2用IAMロールの作成

EC2に対して、CodeDeployに対する接続権限を与えるためのロールを作成します。

  1. IAM-ロール-ロールを作成を選択します。
  2. ユースケース-一般的なユースケース-EC2を選択し、次へを押下します。
  3. AWSCodeDeployRoleを選択して、次へを押下します。
  4. ロール名に任意の名前を設定します。(例:codedeployrole)

CodeDeploy用IAMロールの作成

CodeDeployに対して付与するロールを作成します。

  1. IAM-ロール-ロールを作成を選択します。
  2. ユースケース-他の AWS のサービスのユースケース-CodeDeployを選択し、次へを押下します。
  3. AWSCodeDeployRoleが表示されていることを確認します。
  4. AmazonS3FullAccessを追加で設定します。
  5. そのまま次へを押下します。
  6. ロール名に任意の名前を設定します。(例:codedeploy-servicerole)

EC2の作成

先ほど作成したIAMロールを紐づける形でEC2を作成します。

  1. EC2-インスタンスからインスタンスを起動を選択します。
  2. Amazon Linux 2 AMI (HVM) - Kernel 5.10, SSD Volume Typeを選択します。(無料利用枠の最新版を選択。何でもよいです)
  3. t2.microを選択します。(無料利用枠のものを選択。何でもよいです)
  4. インスタンスの詳細を設定します。
    1. 任意のネットワーク、サブネットを選択します。但しインターネットから接続が可能であることが必要です。
    2. 自動割り当てパブリックIP有効であることを確認します。
    3. IAMロールで先ほど作成したロールを選択します。(例:codedeployrole)
    4. 次のステップへを押下します。
  5. ストレージの追加設定
    1. 何もせず次のステップへを押下します。
  6. タグの追加設定
    1. タグの追加を押下し、以下の設定を追加します。
      1. キーNameCodeDeployDemoを追加します。
      2. キーdeploy01を追加します。※この値は何でもよいですが、後程デプロイ対象の特定に用います。
    2. 次のステップへを押下します。
  7. セキュリティグループの設定
    1. デフォルトで22番ポートが0.0.0.0/0(すべて)から接続可能になっていることを確認します。
    2. 追加で80番ポート(HTTP)を、0.0.0.0/0(すべて)から接続可能に設定します(デプロイ後のWebサーバ動作をブラウザで確認する場合)
    3. 確認と作成を押下します。
  8. 確認~作成
    1. 作成するインスタンス内容を確認し、起動を押下します。
    2. キーペアを選択し、チェックボックスにチェックを入れてインスタンスの作成を押下します。

CodeDeployAgentのインストール

  1. EC2インスタンスにSSHで接続します。
    1. ssh -i [キーファイル(xxx.pemファイル)のパス] ec2-user@[EC2インスタンスのパブリックIPアドレス] ※TeraTermからの接続でもOK
  2. AWS公式ドキュメントに従ってCodeDeployAgentをインストールします。

参考(1)
実行したインストール手順

shell
ssh -i [キーファイル(xxx.pemファイル)のパス] ec2-user@[EC2インスタンスのパブリックIPアドレス]
sudo yum update
sudo yum install ruby
sudo yum install wget
cd /home/ec2-user
wget https://aws-codedeploy-ap-northeast-1.s3.ap-northeast-1.amazonaws.com/latest/install
chmod +x ./install
sudo ./install auto

確認手順

shell
sudo service codedeploy-agent status

以下の内容が表示されればOKです。

確認結果

shell
The AWS CodeDeploy agent is running as PID 3666

参考(2)
AWS公式ドキュメントでは現在、上記手順コマンドラインによる手順より、AWS Systems Managerを用いたインストールが推奨されています。

https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/codedeploy-agent-operations-install-ssm.html

試せていませんが、AWS Systems Managerを使用する手順を試してみたほうが良いかもしれません。
 ※初期セットアップがもろもろ必要そうです。

GitHubリポジトリの作成

GitHubにてリポジトリを作成しておきます。

例:リポジトリ名:codedeploytest

ローカルリポジトリの作成~初回プッシュ

ローカル環境でGitリポジトリを初期化してRemoteに追加しておきます。

ローカルのパス(例):/home/[ユーザ名]/codedeploytest/

shell
cd ~
mkdir codedeploytest
cd codedeploytest
touch README.md
git init
git add README.md
git commit -m "My first commit"
git branch -M main
git remote add origin https://github.com/[ユーザ名]/codedeploytest.git
git push -u origin main

※GitHubリポジトリURLは作成したリポジトリを設定してください。
 ※GitHubのユーザ名、E-mail、Personal Access Tokenなどは必要に応じて設定します。

CodeDeploy用サンプル資材の入手

AWSが用意しているCodeDeploy用のサンプル資材がありますので、その資材を入手します。

以下のページを参考に、資材を取得してローカルディレクトリに展開し、GitHubにプッシュします。
https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/tutorials-github-upload-sample-revision.html

参考:実施した手順

shell
aws s3 cp s3://aws-codedeploy-ap-northeast-1/samples/latest/SampleApp_Linux.zip . --region ap-northeast-1
unzip SampleApp_Linux.zip
rm SampleApp_Linux.zip
git add .
git commit -m "Added sample app"
git push

awsコマンドを通すために、AWS CLIを事前にインストールしておく必要があります。AWS CLIインストール手順は以下を参考にしてください。
https://zenn.dev/ttani/articles/aws-cli-setup

参考:CodeDeployのファイル配置の仕様

デプロイの動作定義(appspec.yml)

ルートディレクトリ直下に必ずappspec.ymlファイルを配置する必要がある。

appspec.yml
version: 0.0
os: linux
files:
  - source: /index.html
    destination: /var/www/html/
hooks:
  BeforeInstall:
    - location: scripts/install_dependencies
      timeout: 300
      runas: root
    - location: scripts/start_server
      timeout: 300
      runas: root
  ApplicationStop:
    - location: scripts/stop_server
      timeout: 300
      runas: root
  • filesで同期させる元ファイル(source)と、配置先を定義(destination)を設定する。
  • hooksでCodeDeploy実行時の任意の合間に実行する処理を定義する。
  • ApplicationStopは既存のアプリが停止したときに動作する(初回は動かない)

CodeDeployの設定

AWSコンソールに接続し、CodeDeployの設定を行います。

  1. AWSコンソールで、CodeDeploy-デプロイ-開始方法-アプリケーションの作成を選択します。
  2. アプリケーションの作成で次の設定を行います。
    1. アプリケーション名:任意の名前を設定します。(例:test-codedeploy
    2. コンピューティングプラットフォーム:EC2/オンプレミスを選択します。
    3. アプリケーションの作成を押下します。
  3. アプリケーションの作成を行ったら、続いてデプロイグループの作成を行います。
    1. デプロイグループの作成を押下します。
    2. デプロイグループの作成で次の内容を設定します。
      1. デプロイグループ名:任意の名前を設定します。(例:test-deploygroup
      2. サービスロール:事前に作成したサービスロールを選択します。(例:codedeploy-servicerole
      3. デプロイタイプ:インプレースを選択します。
      4. 環境設定:Amazon EC2 インスタンスを選択します。
      5. タググループ:キーdeploy01を設定します。※EC2作成時に設定したデプロイ対象特定用のタグを設定します。
      6. AWS Systems Manager を使用したエージェント設定:AWS CodeDeploy エージェントのインストールは今すぐ更新し、更新をスケジュールのままとします。ベーシックスケジューラも14日間のままとします。
      7. デプロイ設定:AllAtOnceのままとします。
      8. Load balancer:今回はロードバランサを使用していないのでチェックを外します。
      9. デプロイグループの作成を押下し、作成を実行します。
  4. 単体でデプロイを実行してみます。
    1. 対象のデプロイグループでデプロイの作成を押下します。
    2. リビジョンタイプを、アプリケーションは GitHub に格納されていますを選択します。
    3. GitHub トークン名でGitHubアカウント名を指定し、GitHubに接続するを実行します。
    4. リポジトリ名について、GitHubで作成したリポジトリを`[アカウント名]/[リポジトリ名]で設定します。
    5. コミットIDについて、GitHubからコミット履歴を確認し、最新のコミットIDを確認して設定します。
    6. デプロイの実行を押下します。

うまくいけば、デプロイのステータスが「成功」になります。
サーバにコンソール接続し/var/www/html/index.htmlファイルが配置されていればOKです。

補足:GitHubのOAuthトークンがエラーとなり削除したい場合
コンソール画面から削除することができません。次の方法で削除し、再登録します。

一覧確認

shell
aws deploy list-git-hub-account-token-names

削除実行

shell
aws deploy delete-git-hub-account-token --token-name <GitHubアカウント名>

CodePipelineの設定

続いて、GitHubにPushしたら自動デプロイされるようにCodePipelineを構成していきます。

  1. AWSコンソールでCodePipelineを開きパイプラインを作成するを押下します。
  2. パイプラインの設定を行います。
    1. パイプライン名:任意の名前を設定します。(例:test-pipeline
    2. ロール名は自動で作成されるので、次にを押下します。
    3. ソースプロバイダーとしてGitHub(バージョン2)を選択します。
    4. 接続するを押下し、任意の接続名を設定します。(例:GitHubConnection
    5. 接続を行い、GitHub側の画面で認可を行います。
    6. 新しいアプリをインストールするを選択し、連携対象のリポジトリを選択します。
    7. 接続ボタンを押下します。
    8. リポジトリ名から、対象のリポジトリを選択します。(既に接続済みのものから選択できます)
    9. ブランチ名から、mainを選択します。
    10. 出力アーティファクト形式CodePipeline のデフォルトを選択します。
    11. ビルドステージを追加するは、ビルドステージをスキップを選択します。
    12. デプロイプロバイダーの選択で、AWS CodeDeployを選択します。
    13. アプリケーション名デプロイグループについては、事前に作成したものを選択します。(test-codedeploytest-deploygroup
    14. 確認画面で、内容を確認し、パイプラインを作成するを押下します。

ここまでで設定は終了です。

動作確認

GitHubにHTML資材を変更しPUSHを行います。
PUSHをトリガとしてCodePipelineと、CodeDeployが動作し、資材がWebサーバに配置されます。

次のような画面が非表示されます。(文字色を少し変更してみている)

所感

今回はまだ、CodeBuild等は使っていない、ビルドレスのアプリケーションのインプレースでのデプロイまでをやってみました。
実際にはビルド連携や、Blue/Greenデプロイといった考慮も必要になってきますので、そのあたりもやっていければと思います。

Discussion