CodeCommit+CodeBuild+CodeDeploy+Lightsailでデプロイの自動化(CodePipeline)
CodeCommit+CodeBuild+CodeDeploy+EC2という記事は結構ありますが、Lightsailはなかったようなので記事にします。Lightsailもssh
で接続できるので基本的にEC2の場合と同じです。
公式の記事です(英語)。この記事ではソースにGithubを選択しています。
Using AWS CodeDeploy and AWS CodePipeline to Deploy Applications to Amazon Lightsail
環境
Lightsail
$ cat /etc/issue
Ubuntu 16.04.6 LTS \n \l
$ httpd -v
Server version: Apache/2.4.41 (Unix)
Server built: Feb 27 2020 12:22:22
$ php -v
PHP 7.3.15 (cli) (built: Feb 27 2020 12:33:13) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.15, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.3.15, Copyright (c) 1999-2018, by Zend Technologies
$ ruby -v
ruby 2.3.1p112 (2016-04-26) [x86_64-linux-gnu]
$ wget -V
GNU Wget 1.17.1 built on linux-gnu.
...
デプロイまでのフロー
コードのプッシュ~デプロイまでのフローは @leomaro7 さんの記事AWS Code シリーズの通りです。ここでは最後のデプロイ先がLightsailになります。
1点補足すると、CodeCommitにpush
されるとCloudWatchのイベントが発火し、CodepPipelineが起動されるようになっています。このCloudWatchイベントはCodepPipelineを作成する際に作られます。
作業リスト
- S3バケット作成
- IAMロール作成
- IAMユーザー作成
- CodeDeployエージェントのインストール
- CodeCommitのレポジトリ作成
- CodeBuildプロジェクトの作成
- CodeDeployの作成
- CodePipelineの作成
S3バケット作成
CodeBuildによってコンパイルなどがされたアーティファクトの格納先になるS3バケットを作成します。パブリックアクセスをすべてブロックにチェックを付けてください。
IAMロール作成
CodeDeployにアタッチするIAMロールを作成します。新規作成からユースケースでCodeDeployを選択します。
IAMユーザー作成
LightsailのサーバーがS3に保存されたアーティファクトを取得するためのIAMユーザーを作成します。このユーザーはAWSコンソールにはログインできず、S3へのアクセス権限しか持たせません。
先程作成したS3バケットへのアクセス権のあるIAMポリシーを新規作成してをIAMユーザーにアタッチします。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:Get*",
"s3:List*"
],
"Resource": [
"arn:aws:s3:::<作成したバケット名>/*",
]
}
]
}
CodeDeployエージェントのインストール
Lightsailにsshでログインして、CodeDeployエージェントをインストールします。
CodeDeployエージェントのアクセスユーザー設定
上記で作成したユーザーの設定ファイル(codedeploy.onpremises.yml)を作成します。
- Access Key ID
e.g. AKAFUUCHINOHOTOCOCOA7 - Secret Access Key
e.g. yCX0nl9aPqSUNtWLnqM8euLcAupOWTWFUg1g+8r/ - IAM User ARN
e.g. arn:aws:iam::012345678901:user/LightSailCodeDeployUser
$ mkdir /etc/codedeploy-agent/
$ mkdir /etc/codedeploy-agent/conf
$ cat <<EOT >> /etc/codedeploy-agent/conf/codedeploy.onpremises.yml
---
aws_access_key_id: <Access Key ID>
aws_secret_access_key: <Secret Access Key>
iam_user_arn: <IAM User ARN>
region: ap-northeast-1
EOT
CodeDeployエージェントをインストール
aws-codedeploy-ap-northeast-1.s3.ap-northeast-1.amazonaws.comのaws-codedeploy-ap-northeast-1
の部分はインストーラーの置いてあるS3バケット名で、ap-northeast-1はリージョンになっています。(一応、東京リージョンにしていますが、どこでもよさそう?)
Ubuntu Server 用の CodeDeploy エージェントをインストールする
$ wget https://aws-codedeploy-ap-northeast-1.s3.ap-northeast-1.amazonaws.com/latest/install
$ chmod +x ./install
$ sudo ./install auto
インストール後、起動確認をします。AWSのドキュメントには「The AWS CodeDeploy agent is running」と表示されるとありますが、私の環境では以下のように表示されました。
これで起動できています。もし起動していない場合は、sudo service codedeploy-agent start
で起動してください。
sudo service codedeploy-agent status
● codedeploy-agent.service - LSB: AWS CodeDeploy Host Agent
Loaded: loaded (/etc/init.d/codedeploy-agent; bad; vendor preset: enabled)
Active: active (exited) since Sat 2020-07-25 03:18:20 UTC; 6s ago
Docs: man:systemd-sysv-generator(8)
Process: 10122 ExecStart=/etc/init.d/codedeploy-agent start (code=exited, status=0/SUCCESS)
Jul 25 03:18:20 ip-172-26-8-250 systemd[1]: Starting LSB: AWS CodeDeploy Host Agent...
Jul 25 03:18:20 ip-172-26-8-250 codedeploy-agent[10122]: Starting codedeploy-agent:
Jul 25 03:18:20 ip-172-26-8-250 systemd[1]: Started LSB: AWS CodeDeploy Host Agent.
CodeDeployにインスタンスを登録
CodeDeployにLightsailのインスタンスを登録します。
codedeploy.onpremises.ymlの設定と同じIAMユーザーとリージョンを指定します。
aws deploy register-on-premises-instance --instance-name <Lightsailのインスタンス名> --iam-user-arn <IAM User ARN> --region ap-northeast-1
aws deploy add-tags-to-on-premises-instances --instance-names <Lightsailのインスタンス名> --tags Key=Name,Value=CodeDeployMyLightsail --region ap-northeast-1
コマンド実行後オンプレミスインスタンスに登録されます。
詳細画面です。ここのタグが重要で、CodeDeployのデプロイ先の判断に使用します。
CodeCommitのレポジトリ作成
これについては省略します。
AWS CodeCommit リポジトリの作成
CodeBuildプロジェクトの作成
buildspec.yml
buildspec.ymlを作成し、レポジトリのルートに配置します。このファイルを見てCodeBuildがテストやビルドを行います。ファイル内に書かれているパスはbuildspec.ymlファイルからの相対パスです。
CodeBuild のビルド仕様に関するリファレンス
- 「phases - install - runtime-versions」以下をビルドする環境にインストールされます。Javaの場合なら、
java: openjdk8
などになります。 - 「phases - commands」を上から順番に実行します。composerをインストール&実行して、phpunitでテストを行うようにしています。echo以下は実行画面に標準出力されるので、後で確認用に使用できます。
- 「artifacts - files」はビルド後にS3にアップするファイルを指定します。「/*」を指定した場合、その階層のファイルが全て対象になりますが、サブディレクトリーは対象になりません。「**/*」とするとサブディレクトリーまで対象になります。 後述しますが、Codebuildで使用するappspec.ymlとappspec.ymlから呼ばれるシェルスクリプト(hooks以下)は忘れずに入れてください。
version: 0.2
phases:
install:
runtime-versions:
php: 7.3
build:
commands:
- cd app/composer
- composer install
- ./vendor/bin/phpunit ../tests/
- echo Build started on `date`
artifacts:
files:
- app/composer/composer.json
- app/composer/composer.lock
- app/**/*
- hooks/**/*
- appspec.yml
CodeDeployの作成
アプリケーションを作成
コンピューティングプラットフォームは、今回Lightsailなので「EC2/オンプレミス」を選択します。
デプロイグループを作成
デプロイグループはデプロイ方法の設定です。
- サービスロールには上で作成したIAMロールを選択します。
- デプロイタイプはデプロイの方法です。「インプレース」を選択しました。
- 環境設定はデプロイ先になります。先程Lightsailを登録したオンプレミスインスタンスを選択します。タグはインスタンスに付けた「CodeDeployMyLightsail」とします。
- デプロイ設定はデフォルトの「AllAtOnce」。
- Load balancerは未使用です。
appspec.yml
appspec.ymlを作成し、レポジトリのルートに配置します。このファイルを見てCodeDeployがデプロイを行います。
CodeDeploy AppSpec File のリファレンス
hooksでイベント前後に処理をフックできます。ここではInstall後にcomposerを実行しています。CodeDeploynのInstallイベントとはS3からダウンロードした一時ファイルを本来の位置に配置することです。
version: 0.0
os: linux
files:
- source: app/oauth
destination: /home/bitnami/htdocs/oauth
- source: app/composer
destination: /home/bitnami/htdocs/composer
permissions:
- object: /home/bitnami/htdocs
owner: bitnami
group: bitnami-admins
hooks:
AfterInstall:
- location: hooks/after_install.sh
#!/bin/bash
cd /home/bitnami/htdocs/composer
composer update --no-dev
CodePipelineの作成
ここまでで作成したS3、CodeCommit、CodeBuild、CodeDeploy、LightsailをCodePipelineで繋げます。ここはあまり迷うことが無いと思います。CodeCommitで変更がプッシュされたら起動するようにします。
CodePipelineを動かしてみる
CodeCommitにプッシュすると、CodePipelineが動いてデプロイされます。
CloudWatchの内容
Codecommit作成時に自動作成されるCloudWatch EventはCodeCommitのmaster(ブランチの指定は可能です)にプッシュされるとCodePipelineがトリガーされるようになっています。
{
"source": [
"aws.codecommit"
],
"detail-type": [
"CodeCommit Repository State Change"
],
"resources": [
"arn:aws:codecommit:ap-northeast-1:0000000000000:<brunch名>"
],
"detail": {
"event": [
"referenceCreated",
"referenceUpdated"
],
"referenceType": [
"branch"
],
"referenceName": [
"master"
]
}
}
-
Codedeployエージェントをインストールするために必要です。
wget
はあると思いますが、ruby
はないかもしれません。ない場合はapt-get
でインストールしてください。 ↩
Author And Source
この問題について(CodeCommit+CodeBuild+CodeDeploy+Lightsailでデプロイの自動化(CodePipeline)), 我々は、より多くの情報をここで見つけました https://qiita.com/urushibata/items/d36b5619eb3d51dc4b84著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .