2025/10/11

CodePipelineによるCI/CD

# CodeCommit
## HTTPS方式でアクセスする場合
予め、~/.aws/configファイルにプロファイルを作成し、リージョンや、アクセスキーを設定しておく。
```
[profile git]
region = us-east-1
output = json
aws_access_key_id = xxxxxxxxxxxxxx
aws_secret_access_key = xxxxxxxxxxxxxxxxx
```

以下のコマンドでローカルにあるIAMのクレデンシャル情報を用いてGitリポジトリに接続(git clone等)できるようになる。
```
$ git config --global credential.helper "!aws --profile git codecommit credential-helper $@"
$ git config --global credential.UseHttpPath true
```

## index.html, buildspec.yml, appspec.ymlをリポジトリへ格納
* buildspec.yaml
[CodeBuild のビルド仕様に関するリファレンス](https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/build-spec-ref.html)
[ビルド環境の環境変数](https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/build-env-ref-env-vars.html)
```
version: 0.2
phases:
  build:
    commands:
      - echo "Build step (optional)"
artifacts:
  files:
    - index.html
    - appspec.yml
```

* appspec.yml
[CodeDeploy AppSpec ファイルのリファレンス](https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/reference-appspec-file.html)
```
version: 0.0
os: linux
files:
  - source: index.html
    destination: /var/www/html
```

# EC2設定
## EC2インスタンス作成
- AMI:Amazon Linux 2
- インスタンスタイプ:t2.micro
- セキュリティグループ:
- ポート 22(SSH)
- ポート 80(HTTP)

## Apache設定
```
sudo yum update -y
sudo yum install -y httpd
sudo systemctl start httpd
sudo systemctl enable httpd

curl http://localhost
```

## CodeDeployエージェント
[Amazon Linux または RHEL 用の CodeDeploy エージェントをインストールする](https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/codedeploy-agent-operations-install-linux.html)

```
sudo yum install -y ruby wget
cd /home/ec2-user
wget https://aws-codedeploy-ap-northeast-1.s3.amazonaws.com/latest/install
chmod +x ./install
sudo ./install auto
sudo systemctl start codedeploy-agent
sudo systemctl enable codedeploy-agent
sudo systemctl status codedeploy-agent
```

## IAMロール
- EC2にアタッチするIAMロールに以下のポリシーを付与:
  - AmazonEC2RoleforAWSCodeDeploy

## 次のステップ
- EC2がApacheで /var/www/html/index.html を表示できる状態にあること
- CodeDeploy Agentが起動していること
- EC2にタグ(例:Name=ATDemoInstance)を付けて、CodeDeployのデプロイグループでターゲットに指定できるようにする

# CodeBuildの設定
## CodeBuildに与えるロール
[CodeBuild が他の AWS のサービスとやり取りすることを許可](https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/setting-up-service-role.html)

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Resource": [
                "arn:aws:logs:us-east-1:123456789012:log-group:/aws/codebuild/TestSiteBuild",
                "arn:aws:logs:us-east-1:123456789012:log-group:/aws/codebuild/TestSiteBuild:*"
            ],
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ]
        },
        {
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::codepipeline-us-east-1-*"
            ],
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:GetObjectVersion",
                "s3:GetBucketAcl",
                "s3:GetBucketLocation"
            ]
        },
        {
            "Effect": "Allow",
            "Resource": [
                "arn:aws:codecommit:us-east-1:123456789012:repos_tmp"
            ],
            "Action": [
                "codecommit:GitPull"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "codebuild:CreateReportGroup",
                "codebuild:CreateReport",
                "codebuild:UpdateReport",
                "codebuild:BatchPutTestCases",
                "codebuild:BatchPutCodeCoverages"
            ],
            "Resource": [
                "arn:aws:codebuild:us-east-1:123456789012:report-group/TestSiteBuild-*"
            ]
        }
    ]
}
```

1. プロジェクト作成
  - AWSコンソール → CodeBuild → 「プロジェクトを作成」
  - 名前:TestSiteBuild
  - ソースプロバイダー:CodeCommit
    - リポジトリ:先ほど作成したもの
    - ブランチ:main(または使用中のブランチ)
2. 環境設定
  - 環境イメージ:マネージド型イメージ
    - OS:Amazon Linux 2
    - ランタイム:Standard
    - イメージ:aws/codebuild/standard:7.0(または最新)
  - ビルド仕様:buildspec.yml を使用
3. アーティファクト
- アーティファクトタイプ:Amazon S3
  - 新しいS3バケットを作成するか、既存のものを選択
  - 出力場所:TestSiteBuildArtifact(任意)

> このステージでアーティファクトをS3に出力する。

# CodeDeployの設定
[CodeDeployのサービスのロールを作成する](https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/getting-started-create-service-role.html)

1. アプリケーション作成
  - AWSコンソール → CodeDeploy → 「アプリケーションを作成」
  - 名前:TestSiteDeploy
  - コンピューティングプラットフォーム:EC2/オンプレミス
2. デプロイグループ作成
  - 名前:TestSiteGroup
  - サービスロール:CodeDeployServiceRole(必要なら新規作成)
    - ポリシー:AWSCodeDeployRole
  - ターゲット:EC2インスタンスのタグ
    - 例:Name=ATDemoInstance
  - デプロイタイプ:インプレース
  - アプリケーションのリビジョン場所:Amazon S3

> S3に保存されたCodeBuildの出力(アーティファクト)をCodeDeployが取得してEC2に配置する。

## CodeDeploy時のEC2側のログ
```
sudo less /opt/codedeploy-agent/deployment-root/deployment-logs//log

sudo less /var/log/aws/codedeploy-agent/codedeploy-agent.log
```

# CodePipelineの設定
[CodePipeline サービスロールを管理する](https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/how-to-custom-role.html)

1. パイプライン作成
  - AWSコンソール → CodePipeline → 「パイプラインを作成」
  - 名前:TestSitePipeline
  - サービスロール:新規作成(自動でOK)

ソースステージ(CodeCommit)
  - ソースプロバイダー:CodeCommit
  - リポジトリ:先ほど作成したもの
  - ブランチ:main(または使用中のブランチ)
  - 変更検出:Amazon CloudWatch Events(自動トリガー)
  ※複数リポジトリから資産を取得するには、パイプライン作成後にソースステージからアクショングループを追加し、セカンダリソースを追加する。
[複数の入力ソースと出力アーティファクトのサンプル](https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/sample-multi-in-out.html)

ビルドステージ(CodeBuild)
  - ビルドプロバイダー:AWS CodeBuild
  - プロジェクト:TestSiteBuild(先ほど作成したもの)
  - 出力アーティファクト名:例)BuildArtifact

デプロイステージ(CodeDeploy)
  - デプロイプロバイダー:AWS CodeDeploy
  - アプリケーション名:TestSiteDeploy
  - デプロイグループ:TestSiteGroup
  - 入力アーティファクト名:CodeBuildの出力名と一致させる(例:BuildArtifact)

## CodePipelineのPollForSourceChangesをCLIでfalseする方法
[PollForSourceChanges パラメータのデフォルト動作について](https://repost.aws/ja/knowledge-center/codepipeline-running-twice)
1. 現在のパイプライン定義を取得
対象のパイプライン(例: MyPipeline)のJSON定義を取得し、ファイルに保存する
```bash
aws codepipeline get-pipeline --name MyPipeline --query pipeline > pipeline.json
```
2. JSONファイルを編集
PollForSourceChangesの値を"true"から"false"に変更する
編集前:
```json
"configuration": {
    "BranchName": "main",
    "PollForSourceChanges": "true",
    "RepositoryName": "MyRepo"
},
```
編集後:
```json
"configuration": {
    "BranchName": "main",
    "PollForSourceChanges": "false",
    "RepositoryName": "MyRepo"
},
```
※注: get-pipeline で取得した JSON の構造が update-pipeline が期待する形式({"pipeline": { ... }})になっていないので追加が要る 
3. パイプライン定義を更新
編集したJSONファイルを使って、パイプラインを更新する
```
aws --profile tokyo codepipeline update-pipeline --cli-input-json file://pipeline.json
```

# push時にCodePipelineをトリガーする
[Create an EventBridge rule for a CodeCommit source](https://docs.aws.amazon.com/codepipeline/latest/userguide/pipelines-trigger-source-repo-changes-console.html)

## EventBridgeに与えるロールを作成
```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Statement1",
            "Effect": "Allow",
            "Action": "codepipeline:StartPipelineExecution",
            "Resource": "arn:aws:codepipeline:us-east-1:123456789012:TestSitePipeline"
        }
    ]
}
```

## EventBridgeを作成
イベントパターン:対象ブランチのpushイベントを指定(下記)
ターゲット:CodePipelineのARNを指定
```
{
  "source": ["aws.codecommit"],
  "detail-type": ["CodeCommit Repository State Change"],
  "resources": ["arn:aws:codecommit:us-east-1:123456789012:repos_tmp"],
  "detail": {
    "event": ["referenceUpdated"],
    "referenceType": ["branch"],
    "referenceName": ["master"]
  }
}
```

0 件のコメント:

コメントを投稿

人気の投稿