58
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

概要

2024年Qiitaアドベントカレンダー2回目の投稿になりますので、よろしくお願いします。
CodeDeployの情報はデプロイ先がLinuxのものが多く、Windowsサーバの情報がほとんどなかったので、備忘録の意味も含めて皆様に共有できればと思ってこの記事を投稿します。
CodeBuildやCodePipeline、ECRでのCI/CDを構築したことはありましたが、CodeDeployを使うことがなく、対応した案件内ではWindowsサーバへのデプロイが求めらたこともあったので、色々と調べることになりました。

インフラ構成図

今回想定するCI/CD構成は下記の通りになります。ただ構成手順を全て記載すると膨大な量になるので、ポイントとなる部分をかいつまんで記載させていただきます。

image.png

この投稿ではWindows Serverへのデプロイに必要な箇所を記載していますので、基本的なAWSでCI/CDの構築方法は他の情報を参考にしていただければと思います。

前提

今回は.Netのサンプル用のAPIサーバーをデプロイするようCI/CDを回します。
デプロイ先はEC2のWindows Server2022です。
インフラ構成図ではCodeCommitを使っていますが、現在は場合によって新規リポジトリは作成できないので、GitHub等の代替ホスティングサービスを使用してください。

構築

ディレクトリ構成

今回の記事では下記のディレクトリ構成でCI/CDを回していくことを想定しています。

project/
├── src/
│   ├── SimpleServer
│   ├── Program.cs
│   └── SimpleServer.csproj
├── Script
│   ├── StartService.ps1
│   └── StopService.ps1
├── appspec.yml
└── buildspec.yml

src配下のコードはサンプルAPIサーバーとして下記リンク先のコードを使わせてもらっています。

Script配下はCodeDeployの起動時にサーバ上で実行されるファイルが格納されています。
appspec.ymlはCodeDeployの定義ファイルで、buildspec.ymlはCodeBuildの定義ファイルになります。

buildspec.yml

まずCodeBuild用の定義ファイルになります。
.Netのアプリをビルドし、実行ファイルとして公開できるようにしてから、Zip化してS3バケットに配置するという流れになります。

version: 0.2
phases:
  install:
    runtime-versions:
      dotnet: 8.0
    commands:
      - echo Install Package
      - dotnet restore
  build:
    commands:
      - echo Build Code
      - dotnet build --configuration Release --no-restore
  post_build:
    commands:
      - echo Publish Application
      - dotnet publish --configuration Release -r win-x64 --self-contained true -f net8.0 --artifacts-path ./output

artifacts:
  files:
    - '../output/publish/**/*'
    - '../appspec.yaml'
    - '../Script/*'
  discard-paths: yes
  base-directory: ./src

appspec.yaml

CodeDeployの定義署になりますが、Windowsの事例は本当に少ないので、参考にしてもらえればと思います。
分かる方はすぐにできると思いますが、調べながら対応したので、結構時間がかかりましたね〜

version: 0.0
os: windows
files:
  - source: /
    destination: C:¥Users¥Administrator¥Desktop¥test
hooks:
  BeforeInstall:
    - location: .¥Script¥StopService.ps1
      timeout: 300
  AfterInstall:
    - location: .¥Script¥StartService.ps1

上記のファイルで、S3に配置したアプリをWindowsのtestディレクトリに配置をすることを定義しています。
フックでは、インストール前にStopService.ps1ファイルを実行して、アプリを停止して、インストール後にStartService.ps1ファイルを実行してアプリを起動するという定義になります。

ちなみにStopService.ps1ファイルが、

Stop-Process -Name "SimpleServer" -Force

StartService.ps1`ファイルが、

Start-Process -FilePath "C:¥Users¥Administrator¥Desktop¥test¥SimpleServer.exe"

となります。

構築

CodeCommitにリポジトリを構築し上記のディレクトリでコードを配置します。
CodeBuildやCodeDeploy、CodePipelineも特に変わった設定なくシンプルに構築します。
アプリを配置するS3バケットを構築し、デプロイ先のEC2を起動しておきます。

実行

CodeCommitにコードをプッシュするとPipelineが実行され、最終的にEC2にアプリがデプロイされます。

最後に

Windows Serverに関するCodeDeployの情報が少ないことでこの記事を投稿してみましたが、なぜ少ないんでしょうかね〜デプロイ先としてWindows Serverは選択肢として少ないんでしょうかね〜と思っていますが、実際はどうですかね。
一応、Windows ServerへのCodeDeployを使った自動デプロイ方法としてみなさんの参考になればと思っています。
もしご指摘等ありましたらコメントいただければと思いますので、よろしくお願いいたします。

58
3
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
58
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?