AWS CodePipeline が複数回実行される問題を修正したいです。
簡単な説明
AWS CodePipeline が複数回実行される一般的な理由は 2 つあります。
この問題を解決するには、まずパイプラインの履歴を調べ、パイプラインが 2 回実行される原因を確認します。
同じ CloudWatch Events のルールトリガーによるパイプラインの起動が複数ある場合は、重複するルールをすべて削除または無効化します。
ポーリングによってパイプラインが起動される場合は、「PollForSourceChanges パラメータのデフォルト動作について」セクションを参照してください。次にシナリオに基づき、以下のセクションのいずれかの手順を実行してください。
- AWS CloudFormation を使用してパイプラインを作成した場合は、「AWS CloudFormation テンプレートを更新する」セクションのステップを実行します。
- AWS コマンドラインインターフェイス (AWS CLI) を使用してパイプラインを作成した場合は、「JSON ファイルを使用してパイプラインを更新する」セクションのステップを実行します。
- AWS SDK を使用してパイプラインを作成した場合は、「使用する言語の設定構文に基づいてパイプラインを更新する」セクションのステップを実行します。
重要: パイプラインを作成したのと同じ方法でパイプラインを更新します。パイプラインに帯域外変更を加えることは避け、該当するシナリオに適用されるセクションの手順のみを完了させてください。たとえば、AWS CloudFormation を使用してパイプラインを作成した場合は、「AWS CloudFormation テンプレートを更新する」セクションの手順のみを実行します。
解決策
注: AWS CLI コマンドの実行中にエラーが発生した場合は、最新バージョンの AWS CLI を使用していることを確認してください。
エラーの原因を確認する
- CodePipeline コンソールを開きます。
- [名前] で、パイプラインの名前を選択します。
- [履歴を表示] を選択します。
- [トリガー] 列で、CloudWatch Events のルールトリガーまたはポーリングトリガーによるパイプラインの起動が重複していないか確認します。
- ルールでトリガーされた同じ CloudWatch Events の起動が複数ある場合は、重複するルールをすべて削除または無効化します。
ポーリングトリガーによるパイプラインの起動がある場合は、次のトラブルシューティングセクションに進みます。
PollForSourceChanges パラメータのデフォルト動作について
PollForSourceChanges ルールと CloudWatch Events ルールの動作は、次の要因で決まります。
- PollForSourceChanges パラメータのデフォルト動作は、パイプラインの作成に使用したメソッドによって決まります。
- 多くの場合、**PollForSourceChanges **の値はデフォルトで true に設定されているため、無効にする必要があります。
- CodePipeline コンソールを使用してパイプラインを作成する場合、ソース検出方法は自動的に Amazon CloudWatch Events に設定されます。
- AWS CloudFormation、AWS CLI、または AWS SDK を使用してパイプラインを作成し、変更検出方法を指定しなかった場合、PollForSourceChanges はデフォルトで true に設定されます (作成方法によって左右されます)。
- CodePipeline コンソール以外の方法を使用してパイプラインを作成し、そのコンソールを使用してパイプラインを帯域外で更新すると、CodePipeline は追加の CloudWatch Events ルールを自動的に作成します。
- AWS CloudFormation テンプレートで CloudWatch Events ルールを作成するか、GitHub バージョン 1 リポジトリ用のウェブフックを作成し、PollForSourceChanges パラメータを設定しなかった場合、2 通りの方法でソースの変更を検出することになります。これが原因で、パイプラインが 2 回実行されます。
設定がこれらのルールと一致していることを確認してください。
AWS クラウドフォーメーションテンプレートを更新する
AWS CloudFormation テンプレートまたはパイプライン設定ファイルで、PollForSourceChanges パラメータを false に設定します。
注: PollForSourceChanges パラメータは、デフォルトで true に設定されています。
GitHub バージョン 1 Webhook の詳細については、「ウェブフックを使用してパイプラインを開始する」を参照してください。
JSON ファイルを使用してパイプラインを更新する
-
パイプラインの構造を JSON ファイルにコピーします。
$ aws codepipeline get-pipeline --name NAME_OF_YOUR_PIPELINE > pipeline.json
-
pipeline.json ファイルをテキストエディタで開き、PollForSourceChanges パラメータをソースアクションの設定セクションに追加します。パラメータを false に設定します。
-
次のメタデータフィールドをファイルから削除します。
"metadata":{}
"created"
"pipelineARN"
"updated"
重要: 次の update-pipeline コマンドで使用できるようにするために、pipeline.json ファイルからはメタデータ行を削除する必要があります。
-
pipeline.json ファイルを保存し、次の update-pipeline コマンドを実行してファイルに変更を適用します。
$ aws codepipeline update-pipeline --cli-input-json file://pipeline.json
詳細については、「パイプラインを編集する (AWS CLI)」を参照してください。
使用している言語の構成構文に基づいてパイプラインを更新する
パイプラインを更新する手順については、お使いの言語の SDK ドキュメントを参照してください。
たとえば、Python を使用してパイプラインをデプロイした場合、パイプラインの設定セクションで PollForSourceChanges を false に設定します。