codepipelineのwebhook機能の調査

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131136/f29faa08-a413-60d9-c495-f61559452d77.png)

`フィルターなし`がポーリング式。`フィルターを指定`がwebhook式らしい。勘違いをしていた。いつもwebhookで動作していると思っていたが、実はポーリング式だった。`任意のpushでパイプラインを起動し`という説明でwebhook式だと思っていた。これをポーリング式だと思う人はいるのだろうか？

設定画面の項目の説明からはわからないので注意である。
デフォルトはポーリングである。そして古いパイプラインはこの機能しか対応してないよ。明確な年月は不明。

## ポーリング方式
仕組み: CodePipeline が定期的にソースリポジトリをチェックし、変更があるかどうかを確認します。GitHub や CodeCommit のリポジトリをソースとして使用する場合に、このポーリングがデフォルトで適用されます。
特長: 追加の設定なしで、一定間隔でソースの更新を確認してパイプラインを実行します。
メリット: シンプルで、特別な設定を必要としません。
デメリット: 変更が発生した直後にはパイプラインが開始されない場合があり、即時性に欠けることがあります。トリガーにわずかな遅延があるため、リアルタイムでのパイプライン実行が求められる場合には不向きです​


## Webhook 方式
仕組み: Webhook は、リポジトリ（例：GitHub、GitHub Enterprise）での変更が発生した直後に、HTTP POST リクエストが自動的に CodePipeline に送信され、パイプラインが即時に実行されます。
特長: 特定のイベント（例：ブランチへのプッシュ）を条件に、リアルタイムでパイプラインをトリガーします。Webhook は、CloudFormation の AWS::CodePipeline::Webhook リソースや CLI/API を使用して設定します。
メリット: 変更が検出された瞬間にパイプラインを開始でき、即時性が非常に高いです。
デメリット: 設定が少し複雑であり、CloudFormation テンプレートや CLI での設定が必要です。UI での設定ができないため、利用がやや難しく感じる場合もあります​


## Webhook とポーリングの違い
Webhook は外部からのイベント通知による即時トリガーを実現するのに対し、ポーリング は CodePipeline が内部的にソースの更新を定期的に確認する方式です。
Webhook は設定が必要ですが、ポーリングは 設定不要 で利用でき、簡便さを重視する場合にはポーリングが選ばれやすいです。
Webhook を使用する場合は GitHub などのリポジトリ側での設定も必要で、GITHUB_HMAC のような認証設定を含む高度なセキュリティ構成が可能です。
このように、ポーリングは汎用的で簡単な方法、Webhook は即時性を求める場合に便利な方法として使い分けられます


## v1とv2
最近のパイプラインはv2しか作れない。v1からv2にアップグレードはできる。方法が提供されているらしい

v1はwebhook式は使えない。v2からサポートされる

## v1とv2の確認方法
コマンド使うと全パイプラインの状態が簡単にわかる。UI上でも１つずつならわかる。
```json
PS C:\Users\tsuyoshi> aws codepipeline list-pipelines
{
    "pipelines": [ 
        {
            "name": "CodePipelineSample",
            "version": 1,
            "pipelineType": "V1",
            "executionMode": "SUPERSEDED",
            "created": "2022-01-29T17:37:29.758000+09:00",
            "updated": "2022-01-29T17:37:29.758000+09:00"
        },
        {
            "name": "test-codepipeline-zangief",
            "version": 3,
            "pipelineType": "V2",
            "executionMode": "QUEUED",
            "created": "2024-09-24T20:57:08.166000+09:00",
            "updated": "2024-09-24T21:42:18.474000+09:00"
        },
        {
            "name": "v2test",
            "version": 1,
            "pipelineType": "V2",
            "executionMode": "SUPERSEDED",
            "created": "2024-10-31T21:26:44.282000+09:00",
            "updated": "2024-10-31T21:26:44.282000+09:00"
        }
    ]
}
```

## v2のパイプライン作ってみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131136/f74a41fc-472c-5aa5-23de-af8c9e5fd0ef.png)

フィルターの設定の詳細は冒頭の画像です

## パイプラインの設定内容を見てみると
```json
PS C:\Users\tsuyoshi> aws codepipeline get-pipeline --name v2test 
{
    "pipeline": {
        "name": "v2test",
        "roleArn": "arn:aws:iam::XXXXXXXXX:role/service-role/AWSCodePipelineServiceRole-ap-northeast-1-v2test",
        "artifactStore": {
            "type": "S3",
            "location": "codepipeline-ap-northeast-1-79205639103"
        },
        "stages": [
            {
                "name": "Source",
                "actions": [
                    {
                        "name": "Source",
                        "actionTypeId": {
                            "category": "Source",
                            "owner": "AWS",
                            "provider": "CodeStarSourceConnection",
                            "version": "1"
                        },
                        "runOrder": 1,
                        "configuration": {
                            "BranchName": "main",
                            "ConnectionArn": "arn:aws:codeconnections:ap-northeast-1:XXXXXXXXX:connection/8ab1f05c-5a7e-45a9-bcf8-516fc5fbbb6c",
                            "DetectChanges": "false",
                            "FullRepositoryId": "hello512737/test",
                            "OutputArtifactFormat": "CODE_ZIP"
                        },
                        "outputArtifacts": [
                            {
                                "name": "SourceArtifact"
                            }
                        ],
                        "inputArtifacts": [],
                        "region": "ap-northeast-1",
                        "namespace": "SourceVariables"
                    }
                ],
                "onFailure": {
                    "result": "RETRY"
                }
            },
            {
                "name": "Build",
                "actions": [
                    {
                        "name": "Build",
                        "actionTypeId": {
                            "category": "Build",
                            "owner": "AWS",
                            "provider": "CodeBuild",
                            "version": "1"
                        },
                        "runOrder": 1,
                        "configuration": {
                            "ProjectName": "test-codebuild-zangief"
                        },
                        "outputArtifacts": [
                            {
                                "name": "BuildArtifact"
                            }
                        ],
                        "inputArtifacts": [
                            {
                                "name": "SourceArtifact"
                            }
                        ],
                        "region": "ap-northeast-1",
                        "namespace": "BuildVariables"
                    }
                ],
                "onFailure": {
                    "result": "RETRY"
                }
            }
        ],
        "version": 1,
        "executionMode": "SUPERSEDED",
        "pipelineType": "V2",
        "triggers": [
            {
                "providerType": "CodeStarSourceConnection",
                "gitConfiguration": {
                    "sourceActionName": "Source",
                    "push": [
                        {
                            "branches": {
                                "includes": [
                                    "main"
                                ]
                            }
                        }
                    ]
                }
            }
        ]
    },
    "metadata": {
        "pipelineArn": "arn:aws:codepipeline:ap-northeast-1:XXXXXXXXX:v2test",
        "created": "2024-10-31T21:26:44.282000+09:00",
        "updated": "2024-10-31T21:26:44.282000+09:00"
    }
}
```

## この部分がwebhook式の設定と思われる
```json
        "triggers": [
            {
                "providerType": "CodeStarSourceConnection",
                "gitConfiguration": {
                    "sourceActionName": "Source",
                    "push": [
                        {
                            "branches": {
                                "includes": [
                                    "main"
                                ]
                            }
                        }
                    ]
                }
            }
        ]
```
CLIじゃないと無理という記事もあったが、自動で設定された

## AIに聞いた
ChatGPT:
CodePipeline の V2 パイプラインでは、CodeStarSourceConnection を使用することで Webhook ベースのトリガーがコンソールや AWS CLI を通じて設定可能です。この CodeStarSourceConnection を使ったトリガー設定により、GitHub や Bitbucket からのプッシュイベントを自動的に検出し、即時にパイプラインが起動するようになっています​


V2 パイプラインでの Webhook 動作
V2 パイプラインでは、CodeStarSourceConnection が Webhook トリガーを設定するデフォルトの方法としてサポートされているため、コンソールでも容易に設定可能です。特に、DetectChanges パラメータを true に設定することで、特定のブランチ（この例では「main」）での変更検知が可能になります。この設定により、プッシュのたびに即座にパイプラインが動作するため、リアルタイム性が高まります​

結論
CLI のみでなく、コンソールでも V2 パイプラインにおける Webhook トリガー設定は可能です。


## CLIでしかwebhookができないという回答があったが、それはなぜか？

ChatGPT:
以前は、AWS CodePipeline の Webhook トリガーを設定するには、CloudFormation テンプレートや AWS CLI、API などを使用する方法しかありませんでした。これは、当初 CodePipeline の管理コンソールで直接 Webhook の設定を行う機能が提供されていなかったためです。このため、「CLI または CloudFormation でしか設定できない」といった情報が一部のドキュメントや記事に残っている可能性があります。

現在の V2 パイプラインでは CodeStarSourceConnection というサービスが標準で統合されており、コンソールからも簡単に Webhook トリガーを設定できるようになっています。CodeStarSourceConnection は AWS の他のサービスと連携して GitHub や Bitbucket などのリポジトリに接続し、即時の変更検出を可能にします。

## このドキュメントは古いのかな？
https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-webhook.html

ChatGPT:
AWS のドキュメントページ「AWS::CodePipeline::Webhook」が古いように見える理由は、近年 CodePipeline の仕様がアップデートされたためです。以前は、CloudFormation で AWS::CodePipeline::Webhook リソースを定義するか、AWS CLI や API で PutWebhook コマンドを使用して Webhook トリガーを設定する必要がありました。これが「CLI でしか設定できない」という情報の由来です。

現在では、CodePipeline の V2 パイプラインと CodeStarSourceConnection を使用することで、GitHub や Bitbucket などのリポジトリに対して自動的に Webhook 接続を設定できます。このため、コンソールからも簡単に Webhook ベースの変更検出が可能になりました。以前のドキュメントの内容が完全に反映されていない部分もあり、現在の CodePipeline 環境では特に V2 パイプラインでコンソール対応が強化されています