ポーリングパイプラインをイベントベースの変更検出の使用に移行する - AWS CodePipeline

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

ポーリングパイプラインをイベントベースの変更検出の使用に移行する

AWS CodePipeline は、コードが変更されるたびにパイプラインを開始するなど、フルで end-to-end 継続的な配信をサポートします。コードの変更時にパイプラインを開始するために、イベントベースの変更検出とポーリングの 2 つの方法がサポートされています。パイプラインにはイベントベースの変更検出を使用することをお勧めします。

ここで説明する手順を使用して、ポーリングパイプラインからイベントベースの変更検出方法に移行 (更新) します。

パイプラインの推奨されるイベントベースの変更検出方法は、 などのパイプラインソースによって決定されます CodeCommit。例えば、ポーリングパイプラインは を使用してイベントベースの変更検出に移行する必要があります EventBridge。

ポーリングパイプラインを移行する方法

ポーリングパイプラインを移行するには、ポーリングパイプラインを選択した後、推奨されるイベントベースの変更検出方法を選択します。

  • アカウント内のポーリングパイプラインの表示 のステップを使用して、ポーリングパイプラインを選択します。

  • 表でパイプラインのソースタイプを見つけて、ポーリングパイプラインの移行に使用する実装の手順を選択します。各セクションには、 CLIまたは を使用するなど、複数の移行方法が含まれています AWS CloudFormation。

パイプラインを推奨される変更検出方法に移行する方法
パイプラインソース イベントベースの検出 (推奨方法) 移行手順
AWS CodeCommit EventBridge (推奨)。 ポーリングパイプラインを CodeCommit ソースに移行する」を参照してください。
Amazon S3 EventBridge および バケットは、イベント通知 (推奨) に対して有効になっています。 イベントに対応した S3 ソースを使用してポーリングパイプラインを移行する」を参照してください。
Amazon S3 EventBridge と証 AWS CloudTrail 跡。 S3 ソースと CloudTrail 証跡を使用してポーリングパイプラインを移行する」を参照してください。
GitHub バージョン 1 Connections (推奨) GitHub バージョン 1 のソースアクションのポーリングパイプラインを接続に移行する」を参照してください。
GitHub バージョン 1 ウェブフック GitHub バージョン 1 のソースアクションのポーリングパイプラインをウェブフックに移行する」を参照してください。
重要

バージョン 1 アクションの GitHubパイプラインなど、該当するパイプラインアクション設定の更新では、パイプラインのポーリングを停止するために、ソースアクションの設定内で PollForSourceChangesパラメータを false に明示的に設定する必要があります。その結果、 EventBridge ルールの設定 PollForSourceChangesパラメータの省略などによって、イベントベースの変更検出とポーリングの両方を使用してパイプラインを誤って設定する可能性があります。これにより、パイプラインが重複して実行される可能性があり、パイプラインはポーリング中のパイプラインの合計数の制限に対してカウントされます。この制限はデフォルトではイベントベースのパイプラインよりもかなり低くなっています。詳細については、「のクォータ AWS CodePipeline」を参照してください。

アカウント内のポーリングパイプラインの表示

最初のステップとして、以下のスクリプトのいずれかを使用して、アカウント内のどのパイプラインに対してポーリングが設定されているかを確認します。これらがイベントベースの変更検出に移行するパイプラインです。

アカウント内のポーリングパイプラインの表示 (スクリプト)

以下の手順でスクリプトを使用して、アカウントでポーリングを使用しているパイプラインを特定します。

  1. ターミナルウィンドウを開き、次のいずれかの操作を行います。

    • 次のコマンドを実行して、PollingPipelinesExtractor.sh という名前の新しいスクリプトを作成します。

      vi PollingPipelinesExtractor.sh
    • Python スクリプトを使用するには、次のコマンドを実行して、PollingPipelinesExtractor.py という名前の新しい Python スクリプトを作成します。

      vi PollingPipelinesExtractor.py
  2. 次のコードをコピーしてPollingPipelinesExtractorスクリプトに貼り付けます。次のいずれかを行います。

    • 次のコードをコピーして PollingPipelinesExtractor.sh スクリプトに貼り付けます。

      #!/bin/bash set +x POLLING_PIPELINES=() LAST_EXECUTED_DATES=() NEXT_TOKEN=null HAS_NEXT_TOKEN=true if [[ $# -eq 0 ]] ; then echo 'Please provide region name' exit 0 fi REGION=$1 while [ "$HAS_NEXT_TOKEN" != "false" ]; do if [ "$NEXT_TOKEN" != "null" ]; then LIST_PIPELINES_RESPONSE=$(aws codepipeline list-pipelines --region $REGION --next-token $NEXT_TOKEN) else LIST_PIPELINES_RESPONSE=$(aws codepipeline list-pipelines --region $REGION) fi LIST_PIPELINES=$(jq -r '.pipelines[].name' <<< "$LIST_PIPELINES_RESPONSE") NEXT_TOKEN=$(jq -r '.nextToken' <<< "$LIST_PIPELINES_RESPONSE") if [ "$NEXT_TOKEN" == "null" ]; then HAS_NEXT_TOKEN=false fi for pipline_name in $LIST_PIPELINES do PIPELINE=$(aws codepipeline get-pipeline --name $pipline_name --region $REGION) HAS_POLLABLE_ACTIONS=$(jq '.pipeline.stages[].actions[] | select(.actionTypeId.category == "Source") | select(.actionTypeId.owner == ("ThirdParty","AWS")) | select(.actionTypeId.provider == ("GitHub","S3","CodeCommit")) | select(.configuration.PollForSourceChanges == ("true",null))' <<< "$PIPELINE") if [ ! -z "$HAS_POLLABLE_ACTIONS" ]; then POLLING_PIPELINES+=("$pipline_name") PIPELINE_EXECUTIONS=$(aws codepipeline list-pipeline-executions --pipeline-name $pipline_name --region $REGION) LAST_EXECUTION=$(jq -r '.pipelineExecutionSummaries[0]' <<< "$PIPELINE_EXECUTIONS") if [ "$LAST_EXECUTION" != "null" ]; then LAST_EXECUTED_TIMESTAMP=$(jq -r '.startTime' <<< "$LAST_EXECUTION") LAST_EXECUTED_DATE="$(date -r ${LAST_EXECUTED_TIMESTAMP%.*})" else LAST_EXECUTED_DATE="Not executed in last year" fi LAST_EXECUTED_DATES+=("$LAST_EXECUTED_DATE") fi done done fileName=$REGION-$(date +%s) printf "| %-30s | %-30s |\n" "Polling Pipeline Name" "Last Executed Time" printf "| %-30s | %-30s |\n" "_____________________" "__________________" for i in "${!POLLING_PIPELINES[@]}"; do printf "| %-30s | %-30s |\n" "${POLLING_PIPELINES[i]}" "${LAST_EXECUTED_DATES[i]}" printf "${POLLING_PIPELINES[i]}," >> $fileName.csv done printf "\nSaving Polling Pipeline Names to file $fileName.csv."
    • 次のコードをコピーして PollingPipelinesExtractor.py スクリプトに貼り付けます。

      import boto3 import sys import time import math hasNextToken = True nextToken = "" pollablePipelines = [] lastExecutedTimes = [] if len(sys.argv) == 1: raise Exception("Please provide region name.") session = boto3.Session(profile_name='default', region_name=sys.argv[1]) codepipeline = session.client('codepipeline') def is_pollable_action(action): actionTypeId = action['actionTypeId'] configuration = action['configuration'] return actionTypeId['owner'] in {"AWS", "ThirdParty"} and actionTypeId['provider'] in {"GitHub", "CodeCommit", "S3"} and ('PollForSourceChanges' not in configuration or configuration['PollForSourceChanges'] == 'true') def has_pollable_actions(pipeline): hasPollableAction = False pipelineDefinition = codepipeline.get_pipeline(name=pipeline['name'])['pipeline'] for action in pipelineDefinition['stages'][0]['actions']: hasPollableAction = is_pollable_action(action) if hasPollableAction: break return hasPollableAction def get_last_executed_time(pipelineName): pipelineExecutions=codepipeline.list_pipeline_executions(pipelineName=pipelineName)['pipelineExecutionSummaries'] if pipelineExecutions: return pipelineExecutions[0]['startTime'].strftime("%A %m/%d/%Y, %H:%M:%S") else: return "Not executed in last year" while hasNextToken: if nextToken=="": list_pipelines_response = codepipeline.list_pipelines() else: list_pipelines_response = codepipeline.list_pipelines(nextToken=nextToken) if 'nextToken' in list_pipelines_response: nextToken = list_pipelines_response['nextToken'] else: hasNextToken= False for pipeline in list_pipelines_response['pipelines']: if has_pollable_actions(pipeline): pollablePipelines.append(pipeline['name']) lastExecutedTimes.append(get_last_executed_time(pipeline['name'])) fileName="{region}-{timeNow}.csv".format(region=sys.argv[1],timeNow=math.trunc(time.time())) file = open(fileName, 'w') print ("{:<30} {:<30} {:<30}".format('Polling Pipeline Name', '|','Last Executed Time')) print ("{:<30} {:<30} {:<30}".format('_____________________', '|','__________________')) for i in range(len(pollablePipelines)): print("{:<30} {:<30} {:<30}".format(pollablePipelines[i], '|', lastExecutedTimes[i])) file.write("{pipeline},".format(pipeline=pollablePipelines[i])) file.close() print("\nSaving Polling Pipeline Names to file {fileName}".format(fileName=fileName))
  3. パイプラインがあるリージョンごとに、そのリージョンに対してこのスクリプトを実行する必要があります。スクリプトを実行するには、以下のいずれかの操作を行います。

    • 次のコマンドを実行して、PollingPipelinesExtractor.sh という名前のスクリプトを実行します。この例では、リージョンは us-west-2 です。

      ./PollingPipelinesExtractor.sh us-west-2
    • Python スクリプトの場合は、次のコマンドを実行して、PollingPipelinesExtractor.py という名前の Python スクリプトを実行します。この例では、リージョンは us-west-2 です。

      python3 PollingPipelinesExtractor.py us-west-2

    スクリプトからの以下のサンプル出力では、リージョン us-west-2 からポーリングパイプラインのリストが返され、各パイプラインの最後の実行時間が表示されています。

    % ./pollingPipelineExtractor.sh us-west-2 | Polling Pipeline Name | Last Executed Time | | _____________________ | __________________ | | myCodeBuildPipeline | Wed Mar 8 09:35:49 PST 2023 | | myCodeCommitPipeline | Mon Apr 24 22:32:32 PDT 2023 | | TestPipeline | Not executed in last year | Saving list of polling pipeline names to us-west-2-1682496174.csv...%

    スクリプトの出力を分析し、リスト内のパイプラインごとに、ポーリングソースを推奨されるイベントベースの変更検出方法に更新します。

    注記

    ポーリングパイプラインは、PollForSourceChanges パラメータのパイプラインのアクション設定によって決まります。パイプラインソース設定で PollForSourceChangesパラメータが省略されている場合、 CodePipeline はデフォルトで、ソース変更のためにリポジトリをポーリングします。この動作は、PollForSourceChanges が含まれており、true に設定されている場合と同じです。詳細については、Amazon S3 ソースアクションリファレンス で「Amazon S3 のソースアクションの設定パラメータ」など、「パイプラインのソースアクションの設定パラメータ」を参照してください。

    このスクリプトは、アカウント内のポーリングパイプラインのリストを含む .csv ファイルも生成し、その .csv ファイルを現在の作業フォルダに保存します。

ポーリングパイプラインを CodeCommit ソースに移行する

ポーリングパイプラインを移行して、ソースリポジトリまたは Amazon S3 ソースバケットの変更 EventBridge CodeCommitを検出できます。

CodeCommit -- CodeCommit ソースを持つパイプラインの場合、変更検出が を通じて自動化されるようにパイプラインを変更します EventBridge。以下のいずれかの方法で移行を実装します。

ポーリングパイプライン (CodeCommit または Amazon S3 ソース) の移行 (コンソール)

CodePipeline コンソールを使用してパイプラインを更新し、 EventBridge を使用して CodeCommit ソースリポジトリまたは Amazon S3 ソースバケットの変更を検出できます。

注記

コンソールを使用して、 CodeCommit ソースリポジトリまたは Amazon S3 ソースバケットを持つパイプラインを編集すると、ルールとIAMロールが作成されます。を使用してパイプライン AWS CLI を編集する場合は、 EventBridge ルールとIAMロールを自分で作成する必要があります。詳細については、「 CodeCommit ソースアクションと EventBridge」を参照してください。

定期的なチェックを使用しているパイプラインを編集するには、これらの手順を使用します。パイプラインを作成する場合は、「パイプライン、ステージ、アクションを作成する」を参照してください。

パイプラインソースステージを編集するには
  1. にサインイン AWS Management Console し、http://console.aws.amazon.com/codesuite/codepipeline/home で CodePipeline コンソールを開きます。

    AWS アカウントに関連付けられているすべてのパイプラインの名前が表示されます。

  2. [Name] で、編集するパイプラインの名前を選択します。これにより、パイプラインの詳細ビューが開いて、パイプラインの各ステージの各アクションの状態などがわかります。

  3. パイプライン詳細ページで、[編集] を選択します。

  4. [Edit (編集)] ステージで、ソースアクションの編集アイコンを選択します。

  5. 変更検出オプションを展開し、 CloudWatch イベントの使用を選択して、変更が発生したときにパイプラインを自動的に開始します (推奨)

    このパイプライン用に作成される EventBridge ルールを示すメッセージが表示されます。[Update] (更新) を選択します。

    Amazon S3 ソースを含むパイプラインを更新する場合は、以下のメッセージが表示されます。[Update] (更新) を選択します。

  6. パイプラインの編集が終わったら、[パイプラインの変更を保存] を選択して概要ページに戻ります。

    メッセージには、パイプライン用に作成する EventBridge ルールの名前が表示されます。[Save and continue] を選択します。

  7. アクションをテストするには、 を使用して変更をリリース AWS CLI し、パイプラインのソースステージで指定されたソースに変更をコミットします。

ポーリングパイプラインの移行 (CodeCommit ソース) (CLI)

EventBridge ルールを使用してパイプラインを起動するためにポーリング (定期チェック) を使用しているパイプラインを編集するには、次の手順に従います。パイプラインを作成する場合は、「パイプライン、ステージ、アクションを作成する」を参照してください。

を使用してイベント駆動型パイプラインを構築するには CodeCommit、パイプラインの PollForSourceChangesパラメータを編集し、次のリソースを作成します。

  • EventBridge イベント

  • IAM このイベントがパイプラインを開始することを許可する ロール

パイプラインの PollForSourceChangesパラメータを編集するには
重要

このメソッドを使用してパイプラインを作成すると、PollForSourceChanges パラメータはデフォルトで true になります (ただし、明示的に false に設定した場合は除きます)。イベントベースの変更検出を追加する場合は、このパラメータを出力に追加する必要があります。ポーリングを無効にするには、このパラメータを false に設定します。そうしないと、1 つのソース変更に対してパイプラインが 2 回起動されます。詳細については、「PollForSourceChanges パラメータの有効な設定」を参照してください。

  1. get-pipeline コマンドを実行して、パイプライン構造を JSON ファイルにコピーします。例えば、MyFirstPipeline という名前のパイプラインに対して、以下のコマンドを実行します。

    aws codepipeline get-pipeline --name MyFirstPipeline >pipeline.json

    このコマンドは何も返しませんが、作成したファイルは、コマンドを実行したディレクトリにあります。

  2. この例に示すように、プレーンテキストエディタでJSONファイルを開きfalsePollForSourceChangesパラメータを に変更してソースステージを編集します。

    この変更を行う理由 このパラメータを false に変更すると、定期的チェックがオフになるため、イベントベースの変更検出のみ使用することができます。

    "configuration": { "PollForSourceChanges": "false", "BranchName": "main", "RepositoryName": "MyTestRepo" },
  3. get-pipeline コマンドを使用して取得したパイプライン構造を使用している場合は、JSONファイルからmetadata行を削除します。それ以外の場合は、update-pipeline コマンドで使用することはできません。"metadata": { } 行と、"created""pipelineARN""updated" フィールドを削除します。

    例えば、構造から以下の行を削除します。

    "metadata": { "pipelineArn": "arn:aws:codepipeline:region:account-ID:pipeline-name", "created": "date", "updated": "date" },

    ファイルを保存します。

  4. 変更を適用するには、 update-pipeline コマンドを実行し、パイプラインJSONファイルを指定します。

    重要

    ファイル名の前に必ず file:// を含めてください。このコマンドでは必須です。

    aws codepipeline update-pipeline --cli-input-json file://pipeline.json

    このコマンドは、編集したパイプラインの構造全体を返します。

    注記

    update-pipeline コマンドは、パイプラインを停止します。update-pipeline コマンドを実行したときにパイプラインによりリビジョンが実行されている場合、その実行は停止します。更新されたパイプラインによりそのリビジョンを実行するには、パイプラインを手動で開始する必要があります。パイプラインを手動で開始するには start-pipeline-execution コマンドを使用します。

をイベントソース CodeCommit として、 をターゲット CodePipeline として EventBridge ルールを作成するには
  1. ルール EventBridge の呼び出し CodePipeline に使用する のアクセス許可を追加します。詳細については、「Amazon のリソースベースのポリシーの使用 EventBridge」を参照してください。

    1. 次のサンプルを使用して、 がサービスロールを EventBridge 引き受けることができる信頼ポリシーを作成します。信頼ポリシーに trustpolicyforEB.json と名前を付けます。

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "events.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
    2. 次のコマンドを使用して、Role-for-MyRule ロールを作成し、信頼ポリシーをアタッチします。

      aws iam create-role --role-name Role-for-MyRule --assume-role-policy-document file://trustpolicyforEB.json
    3. このサンプルに示すようにJSON、 という名前のパイプラインのアクセス許可ポリシー を作成しますMyFirstPipeline。アクセス権限ポリシーに permissionspolicyforEB.json と名前を付けます。

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "codepipeline:StartPipelineExecution" ], "Resource": [ "arn:aws:codepipeline:us-west-2:80398EXAMPLE:MyFirstPipeline" ] } ] }
    4. 次のコマンドを使用して、Role-for-MyRule ロールに CodePipeline-Permissions-Policy-for-EB アクセス権限ポリシーをアタッチします。

      この変更を行う理由 このポリシーをロールに追加すると、 のアクセス許可が作成されます EventBridge。

      aws iam put-role-policy --role-name Role-for-MyRule --policy-name CodePipeline-Permissions-Policy-For-EB --policy-document file://permissionspolicyforEB.json
  2. put-rule コマンドを呼び出し、--name--event-pattern--role-arn パラメータを含めます。

    この変更を行う理由 このコマンドでは、 AWS CloudFormation でイベントを作成することができます。

    次のサンプルコマンドは、MyCodeCommitRepoRule というルールを作成します。

    aws events put-rule --name "MyCodeCommitRepoRule" --event-pattern "{\"source\":[\"aws.codecommit\"],\"detail-type\":[\"CodeCommit Repository State Change\"],\"resources\":[\"repository-ARN\"],\"detail\":{\"referenceType\":[\"branch\"],\"referenceName\":[\"main\"]}}" --role-arn "arn:aws:iam::ACCOUNT_ID:role/Role-for-MyRule"
  3. をターゲット CodePipeline として追加するには、 put-targets コマンドを呼び出し、次のパラメータを含めます。

    • --rule パラメータは、put-rule を使用して作成した rule_name で使用されます。

    • --targets パラメータは、ターゲットリストのリスト Id とターゲットパイプラインの ARN で使用されます。

    次のサンプルコマンドでは、MyCodeCommitRepoRule と呼ばれるルールに対して指定し、ターゲット Id は 1 番で構成されています。これは、ルールのターゲットのリストが何であるかを示し、この場合は ターゲット 1 です。このサンプルコマンドでは、パイプラインのサンプルの ARN も指定されます。パイプラインは、リポジトリ内に変更が加えられると開始します。

    aws events put-targets --rule MyCodeCommitRepoRule --targets Id=1,Arn=arn:aws:codepipeline:us-west-2:80398EXAMPLE:TestPipeline

ポーリングパイプラインの移行 (CodeCommit ソース) (AWS CloudFormation テンプレート)

を使用してイベント駆動型パイプラインを構築するには AWS CodeCommit、パイプラインの PollForSourceChangesパラメータを編集し、次のリソースをテンプレートに追加します。

  • EventBridge ルール

  • EventBridge ルールのIAMロール

AWS CloudFormation を使用してパイプラインを作成および管理する場合、テンプレートには次のようなコンテンツが含まれます。

注記

PollForSourceChanges と呼ばれるソースステージの Configuration プロパティ。プロパティがテンプレートに含まれていない場合、PollForSourceChanges はデフォルトで true に設定されます。

YAML
Resources: AppPipeline: Type: AWS::CodePipeline::Pipeline Properties: Name: codecommit-polling-pipeline RoleArn: !GetAtt CodePipelineServiceRole.Arn Stages: - Name: Source Actions: - Name: SourceAction ActionTypeId: Category: Source Owner: AWS Version: 1 Provider: CodeCommit OutputArtifacts: - Name: SourceOutput Configuration: BranchName: !Ref BranchName RepositoryName: !Ref RepositoryName PollForSourceChanges: true RunOrder: 1
JSON
"Stages": [ { "Name": "Source", "Actions": [{ "Name": "SourceAction", "ActionTypeId": { "Category": "Source", "Owner": "AWS", "Version": 1, "Provider": "CodeCommit" }, "OutputArtifacts": [{ "Name": "SourceOutput" }], "Configuration": { "BranchName": { "Ref": "BranchName" }, "RepositoryName": { "Ref": "RepositoryName" }, "PollForSourceChanges": true }, "RunOrder": 1 }] },
パイプライン AWS CloudFormation テンプレートを更新して EventBridge ルールを作成するには
  1. テンプレートの でResourcesAWS::IAM::Role AWS CloudFormation リソースを使用して、イベントがパイプラインを開始できるようにするIAMロールを設定します。このエントリによって、2 つのポリシーを使用するロールが作成されます。

    • 最初のポリシーでは、ロールを引き受けることを許可します。

    • 2 つめのポリシーでは、パイプラインを開始するアクセス権限が付与されます。

    この変更を行う理由 AWS::IAM::Role リソースを追加する AWS CloudFormation と、 は のアクセス許可を作成できます EventBridge。このリソースは AWS CloudFormation スタックに追加されます。

    YAML
    EventRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Principal: Service: - events.amazonaws.com Action: sts:AssumeRole Path: / Policies: - PolicyName: eb-pipeline-execution PolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Action: codepipeline:StartPipelineExecution Resource: !Join [ '', [ 'arn:aws:codepipeline:', !Ref 'AWS::Region', ':', !Ref 'AWS::AccountId', ':', !Ref AppPipeline ] ]
    JSON
    "EventRole": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "events.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] }, "Path": "/", "Policies": [ { "PolicyName": "eb-pipeline-execution", "PolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "codepipeline:StartPipelineExecution", "Resource": { "Fn::Join": [ "", [ "arn:aws:codepipeline:", { "Ref": "AWS::Region" }, ":", { "Ref": "AWS::AccountId" }, ":", { "Ref": "AppPipeline" } ] ...
  2. テンプレートの でResourcesAWS::Events::Rule AWS CloudFormation リソースを使用して EventBridge ルールを追加します。このイベントパターンは、リポジトリへの変更のプッシュをモニタリングするイベントを作成します。がリポジトリの状態の変更 EventBridge を検出すると、ルールはターゲットパイプラインStartPipelineExecutionで を呼び出します。

    この変更を行う理由 AWS::Events::Rule リソースを追加する AWS CloudFormation と、 はイベントを作成します。このリソースは AWS CloudFormation スタックに追加されます。

    YAML
    EventRule: Type: AWS::Events::Rule Properties: EventPattern: source: - aws.codecommit detail-type: - 'CodeCommit Repository State Change' resources: - !Join [ '', [ 'arn:aws:codecommit:', !Ref 'AWS::Region', ':', !Ref 'AWS::AccountId', ':', !Ref RepositoryName ] ] detail: event: - referenceCreated - referenceUpdated referenceType: - branch referenceName: - main Targets: - Arn: !Join [ '', [ 'arn:aws:codepipeline:', !Ref 'AWS::Region', ':', !Ref 'AWS::AccountId', ':', !Ref AppPipeline ] ] RoleArn: !GetAtt EventRole.Arn Id: codepipeline-AppPipeline
    JSON
    "EventRule": { "Type": "AWS::Events::Rule", "Properties": { "EventPattern": { "source": [ "aws.codecommit" ], "detail-type": [ "CodeCommit Repository State Change" ], "resources": [ { "Fn::Join": [ "", [ "arn:aws:codecommit:", { "Ref": "AWS::Region" }, ":", { "Ref": "AWS::AccountId" }, ":", { "Ref": "RepositoryName" } ] ] } ], "detail": { "event": [ "referenceCreated", "referenceUpdated" ], "referenceType": [ "branch" ], "referenceName": [ "main" ] } }, "Targets": [ { "Arn": { "Fn::Join": [ "", [ "arn:aws:codepipeline:", { "Ref": "AWS::Region" }, ":", { "Ref": "AWS::AccountId" }, ":", { "Ref": "AppPipeline" } ] ] }, "RoleArn": { "Fn::GetAtt": [ "EventRole", "Arn" ] }, "Id": "codepipeline-AppPipeline" } ] } },
  3. 更新したテンプレートをローカルコンピュータに保存し、 AWS CloudFormation コンソールを開きます。

  4. スタックを選択し、[既存スタックの変更セットの作成] を選択します。

  5. テンプレートをアップロードし、 AWS CloudFormationに示された変更を表示します。これらがスタックに加えられる変更です。新しいリソースがリストに表示されています。

  6. [実行] を選択します。

パイプラインの PollForSourceChangesパラメータを編集するには
重要

多くの場合、パイプラインの作成時に PollForSourceChanges パラメータはデフォルトで true になります。イベントベースの変更検出を追加する場合は、このパラメータを出力に追加する必要があります。ポーリングを無効にするには、このパラメータを false に設定します。そうしないと、1 つのソース変更に対してパイプラインが 2 回起動されます。詳細については、「PollForSourceChanges パラメータの有効な設定」を参照してください。

  • テンプレートで、PollForSourceChangesfalse に変更します。パイプライン定義に PollForSourceChanges が含まれていなかった場合は、追加して false に設定します。

    この変更を行う理由 このパラメータを false に変更すると、定期的チェックがオフになるため、イベントベースの変更検出のみ使用することができます。

    YAML
    Name: Source Actions: - Name: SourceAction ActionTypeId: Category: Source Owner: AWS Version: 1 Provider: CodeCommit OutputArtifacts: - Name: SourceOutput Configuration: BranchName: !Ref BranchName RepositoryName: !Ref RepositoryName PollForSourceChanges: false RunOrder: 1
    JSON
    { "Name": "Source", "Actions": [ { "Name": "SourceAction", "ActionTypeId": { "Category": "Source", "Owner": "AWS", "Version": 1, "Provider": "CodeCommit" }, "OutputArtifacts": [ { "Name": "SourceOutput" } ], "Configuration": { "BranchName": { "Ref": "BranchName" }, "RepositoryName": { "Ref": "RepositoryName" }, "PollForSourceChanges": false }, "RunOrder": 1 } ] },

を使用してこれらのリソースを作成すると AWS CloudFormation、リポジトリ内のファイルが作成または更新されると、パイプラインがトリガーされます。以下に示しているのは、最終的なテンプレートスニペットです。

YAML
Resources: EventRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Principal: Service: - events.amazonaws.com Action: sts:AssumeRole Path: / Policies: - PolicyName: eb-pipeline-execution PolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Action: codepipeline:StartPipelineExecution Resource: !Join [ '', [ 'arn:aws:codepipeline:', !Ref 'AWS::Region', ':', !Ref 'AWS::AccountId', ':', !Ref AppPipeline ] ] EventRule: Type: AWS::Events::Rule Properties: EventPattern: source: - aws.codecommit detail-type: - 'CodeCommit Repository State Change' resources: - !Join [ '', [ 'arn:aws:codecommit:', !Ref 'AWS::Region', ':', !Ref 'AWS::AccountId', ':', !Ref RepositoryName ] ] detail: event: - referenceCreated - referenceUpdated referenceType: - branch referenceName: - main Targets: - Arn: !Join [ '', [ 'arn:aws:codepipeline:', !Ref 'AWS::Region', ':', !Ref 'AWS::AccountId', ':', !Ref AppPipeline ] ] RoleArn: !GetAtt EventRole.Arn Id: codepipeline-AppPipeline AppPipeline: Type: AWS::CodePipeline::Pipeline Properties: Name: codecommit-events-pipeline RoleArn: !GetAtt CodePipelineServiceRole.Arn Stages: - Name: Source Actions: - Name: SourceAction ActionTypeId: Category: Source Owner: AWS Version: 1 Provider: CodeCommit OutputArtifacts: - Name: SourceOutput Configuration: BranchName: !Ref BranchName RepositoryName: !Ref RepositoryName PollForSourceChanges: false RunOrder: 1 ...
JSON
"Resources": { ... "EventRole": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "events.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] }, "Path": "/", "Policies": [ { "PolicyName": "eb-pipeline-execution", "PolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "codepipeline:StartPipelineExecution", "Resource": { "Fn::Join": [ "", [ "arn:aws:codepipeline:", { "Ref": "AWS::Region" }, ":", { "Ref": "AWS::AccountId" }, ":", { "Ref": "AppPipeline" } ] ] } } ] } } ] } }, "EventRule": { "Type": "AWS::Events::Rule", "Properties": { "EventPattern": { "source": [ "aws.codecommit" ], "detail-type": [ "CodeCommit Repository State Change" ], "resources": [ { "Fn::Join": [ "", [ "arn:aws:codecommit:", { "Ref": "AWS::Region" }, ":", { "Ref": "AWS::AccountId" }, ":", { "Ref": "RepositoryName" } ] ] } ], "detail": { "event": [ "referenceCreated", "referenceUpdated" ], "referenceType": [ "branch" ], "referenceName": [ "main" ] } }, "Targets": [ { "Arn": { "Fn::Join": [ "", [ "arn:aws:codepipeline:", { "Ref": "AWS::Region" }, ":", { "Ref": "AWS::AccountId" }, ":", { "Ref": "AppPipeline" } ] ] }, "RoleArn": { "Fn::GetAtt": [ "EventRole", "Arn" ] }, "Id": "codepipeline-AppPipeline" } ] } }, "AppPipeline": { "Type": "AWS::CodePipeline::Pipeline", "Properties": { "Name": "codecommit-events-pipeline", "RoleArn": { "Fn::GetAtt": [ "CodePipelineServiceRole", "Arn" ] }, "Stages": [ { "Name": "Source", "Actions": [ { "Name": "SourceAction", "ActionTypeId": { "Category": "Source", "Owner": "AWS", "Version": 1, "Provider": "CodeCommit" }, "OutputArtifacts": [ { "Name": "SourceOutput" } ], "Configuration": { "BranchName": { "Ref": "BranchName" }, "RepositoryName": { "Ref": "RepositoryName" }, "PollForSourceChanges": false }, "RunOrder": 1 } ] }, ...

イベントに対応した S3 ソースを使用してポーリングパイプラインを移行する

Amazon S3 ソースを持つパイプラインの場合、変更検出が を介して、 EventBridge およびイベント通知が有効になっているソースバケットを使用して自動化されるようにパイプラインを変更します。これは、 CLIまたは を使用してパイプラインを移行する場合 AWS CloudFormation に推奨される方法です。

注記

これには、個別の CloudTrail 証跡を作成する必要がないイベント通知で有効になっているバケットの使用が含まれます。コンソールを使用している場合は、イベントルールと CloudTrail 証跡が設定されます。これらの手順については、「S3 ソースと CloudTrail 証跡を使用してポーリングパイプラインを移行する」を参照してください。

イベントに対して S3 ソースを有効にしたポーリングパイプラインの移行 (CLI)

ポーリング (定期チェック) を使用して イベントを EventBridge 代わりに使用しているパイプラインを編集するには、次の手順に従います。パイプラインを作成する場合は、「パイプライン、ステージ、アクションを作成する」を参照してください。

Amazon S3 でイベント駆動型パイプラインを構築するには、パイプラインの PollForSourceChanges パラメータを編集してから、以下のリソースを作成します。

  • EventBridge イベントルール

  • IAM EventBridge イベントがパイプラインを開始できるようにするロール

Amazon S3 をイベントソースおよびターゲット CodePipeline として EventBridge ルールを作成し、アクセス許可ポリシーを適用するには
  1. ルールの呼び出し EventBridge に使用する CodePipeline のアクセス許可を付与します。詳細については、「Amazon のリソースベースのポリシーの使用 EventBridge」を参照してください。

    1. 次のサンプルを使用して、 がサービスロールを EventBridge引き受けるように信頼ポリシーを作成します。このスクリプトに trustpolicyforEB.json という名前を付けます。

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "events.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
    2. 次のコマンドを使用して、Role-for-MyRule ロールを作成し、信頼ポリシーをアタッチします。

      この変更を行う理由 この信頼ポリシーをロールに追加すると、 のアクセス許可が作成されます EventBridge。

      aws iam create-role --role-name Role-for-MyRule --assume-role-policy-document file://trustpolicyforEB.json
    3. JSON「」という名前のパイプラインのアクセス許可ポリシーを作成しますMyFirstPipeline。アクセス権限ポリシーに permissionspolicyforEB.json と名前を付けます。

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "codepipeline:StartPipelineExecution" ], "Resource": [ "arn:aws:codepipeline:us-west-2:80398EXAMPLE:MyFirstPipeline" ] } ] }
    4. 次のコマンドを実行して、作成した Role-for-MyRule ロールに新しい CodePipeline-Permissions-Policy-for-EB アクセス権限ポリシーをアタッチします。

      aws iam put-role-policy --role-name Role-for-MyRule --policy-name CodePipeline-Permissions-Policy-For-EB --policy-document file://permissionspolicyforEB.json
  2. put-rule コマンドを呼び出し、--name--event-pattern--role-arn パラメータを含めます。

    次のサンプルコマンドでは、EnabledS3SourceRule という名前のルールが作成されます。

    aws events put-rule --name "EnabledS3SourceRule" --event-pattern "{\"source\":[\"aws.s3\"],\"detail-type\":[\"Object Created\"],\"detail\":{\"bucket\":{\"name\":[\"amzn-s3-demo-source-bucket\"]}}}" --role-arn "arn:aws:iam::ACCOUNT_ID:role/Role-for-MyRule"
  3. をターゲット CodePipeline として追加するには、 put-targets コマンドを呼び出し、 --rule および --targetsパラメータを含めます。

    次のコマンドでは、EnabledS3SourceRule という名前のルールに対して指定し、ターゲット Id は 1 番で構成されています。これは、ルールのターゲットのリストが何であるかを示し、この場合は ターゲット 1 です。このコマンドでは、パイプラインのサンプルの ARN も指定されます。パイプラインは、リポジトリ内に変更が加えられると開始します。

    aws events put-targets --rule EnabledS3SourceRule --targets Id=codepipeline-AppPipeline,Arn=arn:aws:codepipeline:us-west-2:80398EXAMPLE:TestPipeline
パイプラインの PollForSourceChangesパラメータを編集するには
重要

このメソッドを使用してパイプラインを作成すると、PollForSourceChanges パラメータはデフォルトで true になります (ただし、明示的に false に設定した場合は除きます)。イベントベースの変更検出を追加する場合は、このパラメータを出力に追加する必要があります。ポーリングを無効にするには、このパラメータを false に設定します。そうしないと、1 つのソース変更に対してパイプラインが 2 回起動されます。詳細については、「PollForSourceChanges パラメータの有効な設定」を参照してください。

  1. get-pipeline コマンドを実行して、パイプライン構造を JSON ファイルにコピーします。例えば、MyFirstPipeline という名前のパイプラインに対して、以下のコマンドを実行します。

    aws codepipeline get-pipeline --name MyFirstPipeline >pipeline.json

    このコマンドは何も返しませんが、作成したファイルは、コマンドを実行したディレクトリにあります。

  2. この例に示すように、任意のプレーンテキストエディタでJSONファイルを開きfalse、 という名前のバケットの PollForSourceChangesパラメータamzn-s3-demo-source-bucketを に変更してソースステージを編集します。

    この変更を行う理由 このパラメータを false に設定すると、定期的チェックがオフになるため、イベントベースの変更検出のみ使用することができます。

    "configuration": { "S3Bucket": "amzn-s3-demo-source-bucket", "PollForSourceChanges": "false", "S3ObjectKey": "index.zip" },
  3. get-pipeline コマンドを使用して取得したパイプライン構造を使用している場合は、JSONファイルからmetadata行を削除する必要があります。それ以外の場合は、update-pipeline コマンドで使用することはできません。"metadata": { } 行と、"created""pipelineARN""updated" フィールドを削除します。

    例えば、構造から以下の行を削除します。

    "metadata": { "pipelineArn": "arn:aws:codepipeline:region:account-ID:pipeline-name", "created": "date", "updated": "date" },

    ファイルを保存します。

  4. 変更を適用するには、 update-pipeline コマンドを実行し、パイプラインJSONファイルを指定します。

    重要

    ファイル名の前に必ず file:// を含めてください。このコマンドでは必須です。

    aws codepipeline update-pipeline --cli-input-json file://pipeline.json

    このコマンドは、編集したパイプラインの構造全体を返します。

    注記

    update-pipeline コマンドは、パイプラインを停止します。update-pipeline コマンドを実行したときにパイプラインによりリビジョンが実行されている場合、その実行は停止します。更新されたパイプラインによりそのリビジョンを実行するには、パイプラインを手動で開始する必要があります。パイプラインを手動で開始するには start-pipeline-execution コマンドを使用します。

イベントに対して S3 ソースを有効にしたポーリングパイプラインを移行する (AWS CloudFormation テンプレート)

この手順は、ソースバケットでイベントが有効になっているパイプライン用です。

以下の手順を使用して、Amazon S3 ソースを含むパイプラインを、ポーリングからイベントベースの変更検出に編集します。

Amazon S3 でイベント駆動型パイプラインを構築するには、パイプラインの PollForSourceChanges パラメータを編集してから、以下のリソースをテンプレートに追加します。

  • EventBridge このイベントがパイプラインを開始できるようにするルールとIAMロール。

AWS CloudFormation を使用してパイプラインを作成および管理する場合、テンプレートには次のようなコンテンツが含まれます。

注記

PollForSourceChanges と呼ばれるソースステージの Configuration プロパティ。テンプレートにプロパティが含まれていない場合、PollForSourceChanges はデフォルトで true に設定されます。

YAML
AppPipeline: Type: AWS::CodePipeline::Pipeline Properties: RoleArn: !GetAtt CodePipelineServiceRole.Arn Stages: - Name: Source Actions: - Name: SourceAction ActionTypeId: Category: Source Owner: AWS Version: 1 Provider: S3 OutputArtifacts: - Name: SourceOutput Configuration: S3Bucket: !Ref SourceBucket S3ObjectKey: !Ref S3SourceObjectKey PollForSourceChanges: true RunOrder: 1 ...
JSON
"AppPipeline": { "Type": "AWS::CodePipeline::Pipeline", "Properties": { "RoleArn": { "Fn::GetAtt": ["CodePipelineServiceRole", "Arn"] }, "Stages": [ { "Name": "Source", "Actions": [ { "Name": "SourceAction", "ActionTypeId": { "Category": "Source", "Owner": "AWS", "Version": 1, "Provider": "S3" }, "OutputArtifacts": [ { "Name": "SourceOutput" } ], "Configuration": { "S3Bucket": { "Ref": "SourceBucket" }, "S3ObjectKey": { "Ref": "SourceObjectKey" }, "PollForSourceChanges": true }, "RunOrder": 1 } ] }, ...
Amazon S3 をイベントソースおよびターゲット CodePipeline として EventBridge ルールを作成し、アクセス許可ポリシーを適用するには
  1. テンプレートの でResourcesAWS::IAM::Role AWS CloudFormation リソースを使用して、イベントがパイプラインを開始できるようにするIAMロールを設定します。このエントリによって、2 つのポリシーを使用するロールが作成されます。

    • 最初のポリシーでは、ロールを引き受けることを許可します。

    • 2 つめのポリシーでは、パイプラインを開始するアクセス権限が付与されます。

    この変更を行う理由 AWS::IAM::Role リソースを追加する AWS CloudFormation と、 は のアクセス許可を作成できます EventBridge。このリソースは AWS CloudFormation スタックに追加されます。

    YAML
    EventRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Principal: Service: - events.amazonaws.com Action: sts:AssumeRole Path: / Policies: - PolicyName: eb-pipeline-execution PolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Action: codepipeline:StartPipelineExecution Resource: !Join [ '', [ 'arn:aws:codepipeline:', !Ref 'AWS::Region', ':', !Ref 'AWS::AccountId', ':', !Ref AppPipeline ] ] ...
    JSON
    "EventRole": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "events.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] }, "Path": "/", "Policies": [ { "PolicyName": "eb-pipeline-execution", "PolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "codepipeline:StartPipelineExecution", "Resource": { "Fn::Join": [ "", [ "arn:aws:codepipeline:", { "Ref": "AWS::Region" }, ":", { "Ref": "AWS::AccountId" }, ":", { "Ref": "AppPipeline" } ] ] ...
  2. AWS::Events::Rule AWS CloudFormation リソースを使用して EventBridge ルールを追加します。このイベントパターンは、Amazon S3 ソースバケット内のオブジェクトの作成または削除をモニタリングするイベントを作成します。さらに、パイプラインのターゲットも含めます。オブジェクトが作成されると、このルールによりターゲットパイプラインで StartPipelineExecution が呼び出されます。

    この変更を行う理由 AWS::Events::Rule リソースを追加する AWS CloudFormation と、 はイベントを作成します。このリソースは AWS CloudFormation スタックに追加されます。

    YAML
    EventRule: Type: AWS::Events::Rule Properties: EventBusName: default EventPattern: source: - aws.s3 detail-type: - Object Created detail: bucket: name: - !Ref SourceBucket Name: EnabledS3SourceRule State: ENABLED Targets: - Arn: !Join [ '', [ 'arn:aws:codepipeline:', !Ref 'AWS::Region', ':', !Ref 'AWS::AccountId', ':', !Ref AppPipeline ] ] RoleArn: !GetAtt EventRole.Arn Id: codepipeline-AppPipeline ...
    JSON
    "EventRule": { "Type": "AWS::Events::Rule", "Properties": { "EventBusName": "default", "EventPattern": { "source": [ "aws.s3" ], "detail-type": [ "Object Created" ], "detail": { "bucket": { "name": [ "s3-pipeline-source-fra-bucket" ] } } }, "Name": "EnabledS3SourceRule", "State": "ENABLED", "Targets": [ { "Arn": { "Fn::Join": [ "", [ "arn:aws:codepipeline:", { "Ref": "AWS::Region" }, ":", { "Ref": "AWS::AccountId" }, ":", { "Ref": "AppPipeline" } ] ] }, "RoleArn": { "Fn::GetAtt": [ "EventRole", "Arn" ] }, "Id": "codepipeline-AppPipeline" } ] } } }, ...
  3. 更新したテンプレートをローカルコンピュータに保存し、 AWS CloudFormation コンソールを開きます。

  4. スタックを選択し、[既存スタックの変更セットの作成] を選択します。

  5. 更新されたテンプレートをアップロードし、 AWS CloudFormationに示された変更を表示します。これらがスタックに加えられる変更です。新しいリソースがリストに表示されています。

  6. [実行] を選択します。

パイプラインの PollForSourceChangesパラメータを編集するには
重要

このメソッドを使用してパイプラインを作成すると、PollForSourceChanges パラメータはデフォルトで true になります (ただし、明示的に false に設定した場合は除きます)。イベントベースの変更検出を追加する場合は、このパラメータを出力に追加する必要があります。ポーリングを無効にするには、このパラメータを false に設定します。そうしないと、1 つのソース変更に対してパイプラインが 2 回起動されます。詳細については、「PollForSourceChanges パラメータの有効な設定」を参照してください。

  • テンプレートで、PollForSourceChangesfalse に変更します。パイプライン定義に PollForSourceChanges が含まれていなかった場合は、追加して false に設定します。

    この変更を行う理由 PollForSourceChanges パラメータを false に変更すると、定期的チェックがオフになるため、イベントベースの変更検出のみ使用することができます。

    YAML
    Name: Source Actions: - Name: SourceAction ActionTypeId: Category: Source Owner: AWS Version: 1 Provider: S3 OutputArtifacts: - Name: SourceOutput Configuration: S3Bucket: !Ref SourceBucket S3ObjectKey: !Ref SourceObjectKey PollForSourceChanges: false RunOrder: 1
    JSON
    { "Name": "SourceAction", "ActionTypeId": { "Category": "Source", "Owner": "AWS", "Version": 1, "Provider": "S3" }, "OutputArtifacts": [ { "Name": "SourceOutput" } ], "Configuration": { "S3Bucket": { "Ref": "SourceBucket" }, "S3ObjectKey": { "Ref": "SourceObjectKey" }, "PollForSourceChanges": false }, "RunOrder": 1 }

AWS CloudFormation を使用してこれらのリソースを作成すると、リポジトリ内のファイルが作成または更新されたときにパイプラインがトリガーされます。

注記

ここで手順は終わりではありません。パイプラインは作成されますが、Amazon S3 パイプライン用の 2 番目の AWS CloudFormation テンプレートを作成する必要があります。2 番目のテンプレートを作成しない場合、パイプラインに変更検出機能はありません。

YAML
Parameters: SourceObjectKey: Description: 'S3 source artifact' Type: String Default: SampleApp_Linux.zip ApplicationName: Description: 'CodeDeploy application name' Type: String Default: DemoApplication BetaFleet: Description: 'Fleet configured in CodeDeploy' Type: String Default: DemoFleet Resources: SourceBucket: Type: AWS::S3::Bucket Properties: NotificationConfiguration: EventBridgeConfiguration: EventBridgeEnabled: true VersioningConfiguration: Status: Enabled CodePipelineArtifactStoreBucket: Type: AWS::S3::Bucket CodePipelineArtifactStoreBucketPolicy: Type: AWS::S3::BucketPolicy Properties: Bucket: !Ref CodePipelineArtifactStoreBucket PolicyDocument: Version: 2012-10-17 Statement: - Sid: DenyUnEncryptedObjectUploads Effect: Deny Principal: '*' Action: s3:PutObject Resource: !Join [ '', [ !GetAtt CodePipelineArtifactStoreBucket.Arn, '/*' ] ] Condition: StringNotEquals: s3:x-amz-server-side-encryption: aws:kms - Sid: DenyInsecureConnections Effect: Deny Principal: '*' Action: s3:* Resource: !Sub ${CodePipelineArtifactStoreBucket.Arn}/* Condition: Bool: aws:SecureTransport: false CodePipelineServiceRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Principal: Service: - codepipeline.amazonaws.com Action: sts:AssumeRole Path: / Policies: - PolicyName: AWS-CodePipeline-Service-3 PolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Action: - codecommit:CancelUploadArchive - codecommit:GetBranch - codecommit:GetCommit - codecommit:GetUploadArchiveStatus - codecommit:UploadArchive Resource: 'resource_ARN' - Effect: Allow Action: - codedeploy:CreateDeployment - codedeploy:GetApplicationRevision - codedeploy:GetDeployment - codedeploy:GetDeploymentConfig - codedeploy:RegisterApplicationRevision Resource: 'resource_ARN' - Effect: Allow Action: - codebuild:BatchGetBuilds - codebuild:StartBuild Resource: 'resource_ARN' - Effect: Allow Action: - devicefarm:ListProjects - devicefarm:ListDevicePools - devicefarm:GetRun - devicefarm:GetUpload - devicefarm:CreateUpload - devicefarm:ScheduleRun Resource: 'resource_ARN' - Effect: Allow Action: - lambda:InvokeFunction - lambda:ListFunctions Resource: 'resource_ARN' - Effect: Allow Action: - iam:PassRole Resource: 'resource_ARN' - Effect: Allow Action: - elasticbeanstalk:* - ec2:* - elasticloadbalancing:* - autoscaling:* - cloudwatch:* - s3:* - sns:* - cloudformation:* - rds:* - sqs:* - ecs:* Resource: 'resource_ARN' AppPipeline: Type: AWS::CodePipeline::Pipeline Properties: Name: s3-events-pipeline RoleArn: !GetAtt CodePipelineServiceRole.Arn Stages: - Name: Source Actions: - Name: SourceAction ActionTypeId: Category: Source Owner: AWS Version: 1 Provider: S3 OutputArtifacts: - Name: SourceOutput Configuration: S3Bucket: !Ref SourceBucket S3ObjectKey: !Ref SourceObjectKey PollForSourceChanges: false RunOrder: 1 - Name: Beta Actions: - Name: BetaAction InputArtifacts: - Name: SourceOutput ActionTypeId: Category: Deploy Owner: AWS Version: 1 Provider: CodeDeploy Configuration: ApplicationName: !Ref ApplicationName DeploymentGroupName: !Ref BetaFleet RunOrder: 1 ArtifactStore: Type: S3 Location: !Ref CodePipelineArtifactStoreBucket EventRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Principal: Service: - events.amazonaws.com Action: sts:AssumeRole Path: / Policies: - PolicyName: eb-pipeline-execution PolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Action: codepipeline:StartPipelineExecution Resource: !Join [ '', [ 'arn:aws:codepipeline:', !Ref 'AWS::Region', ':', !Ref 'AWS::AccountId', ':', !Ref AppPipeline ] ] EventRule: Type: AWS::Events::Rule Properties: EventBusName: default EventPattern: source: - aws.s3 detail-type: - Object Created detail: bucket: name: - !Ref SourceBucket Name: EnabledS3SourceRule State: ENABLED Targets: - Arn: !Join [ '', [ 'arn:aws:codepipeline:', !Ref 'AWS::Region', ':', !Ref 'AWS::AccountId', ':', !Ref AppPipeline ] ] RoleArn: !GetAtt EventRole.Arn Id: codepipeline-AppPipeline
JSON
{ "Parameters": { "SourceObjectKey": { "Description": "S3 source artifact", "Type": "String", "Default": "SampleApp_Linux.zip" }, "ApplicationName": { "Description": "CodeDeploy application name", "Type": "String", "Default": "DemoApplication" }, "BetaFleet": { "Description": "Fleet configured in CodeDeploy", "Type": "String", "Default": "DemoFleet" } }, "Resources": { "SourceBucket": { "Type": "AWS::S3::Bucket", "Properties": { "NotificationConfiguration": { "EventBridgeConfiguration": { "EventBridgeEnabled": true } }, "VersioningConfiguration": { "Status": "Enabled" } } }, "CodePipelineArtifactStoreBucket": { "Type": "AWS::S3::Bucket" }, "CodePipelineArtifactStoreBucketPolicy": { "Type": "AWS::S3::BucketPolicy", "Properties": { "Bucket": { "Ref": "CodePipelineArtifactStoreBucket" }, "PolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Sid": "DenyUnEncryptedObjectUploads", "Effect": "Deny", "Principal": "*", "Action": "s3:PutObject", "Resource": { "Fn::Join": [ "", [ { "Fn::GetAtt": [ "CodePipelineArtifactStoreBucket", "Arn" ] }, "/*" ] ] }, "Condition": { "StringNotEquals": { "s3:x-amz-server-side-encryption": "aws:kms" } } }, { "Sid": "DenyInsecureConnections", "Effect": "Deny", "Principal": "*", "Action": "s3:*", "Resource": { "Fn::Join": [ "", [ { "Fn::GetAtt": [ "CodePipelineArtifactStoreBucket", "Arn" ] }, "/*" ] ] }, "Condition": { "Bool": { "aws:SecureTransport": false } } } ] } } }, "CodePipelineServiceRole": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "codepipeline.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] }, "Path": "/", "Policies": [ { "PolicyName": "AWS-CodePipeline-Service-3", "PolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "codecommit:CancelUploadArchive", "codecommit:GetBranch", "codecommit:GetCommit", "codecommit:GetUploadArchiveStatus", "codecommit:UploadArchive" ], "Resource": "resource_ARN" }, { "Effect": "Allow", "Action": [ "codedeploy:CreateDeployment", "codedeploy:GetApplicationRevision", "codedeploy:GetDeployment", "codedeploy:GetDeploymentConfig", "codedeploy:RegisterApplicationRevision" ], "Resource": "resource_ARN" }, { "Effect": "Allow", "Action": [ "codebuild:BatchGetBuilds", "codebuild:StartBuild" ], "Resource": "resource_ARN" }, { "Effect": "Allow", "Action": [ "devicefarm:ListProjects", "devicefarm:ListDevicePools", "devicefarm:GetRun", "devicefarm:GetUpload", "devicefarm:CreateUpload", "devicefarm:ScheduleRun" ], "Resource": "resource_ARN" }, { "Effect": "Allow", "Action": [ "lambda:InvokeFunction", "lambda:ListFunctions" ], "Resource": "resource_ARN" }, { "Effect": "Allow", "Action": [ "iam:PassRole" ], "Resource": "resource_ARN" }, { "Effect": "Allow", "Action": [ "elasticbeanstalk:*", "ec2:*", "elasticloadbalancing:*", "autoscaling:*", "cloudwatch:*", "s3:*", "sns:*", "cloudformation:*", "rds:*", "sqs:*", "ecs:*" ], "Resource": "resource_ARN" } ] } } ] } }, "AppPipeline": { "Type": "AWS::CodePipeline::Pipeline", "Properties": { "Name": "s3-events-pipeline", "RoleArn": { "Fn::GetAtt": [ "CodePipelineServiceRole", "Arn" ] }, "Stages": [ { "Name": "Source", "Actions": [ { "Name": "SourceAction", "ActionTypeId": { "Category": "Source", "Owner": "AWS", "Version": 1, "Provider": "S3" }, "OutputArtifacts": [ { "Name": "SourceOutput" } ], "Configuration": { "S3Bucket": { "Ref": "SourceBucket" }, "S3ObjectKey": { "Ref": "SourceObjectKey" }, "PollForSourceChanges": false }, "RunOrder": 1 } ] }, { "Name": "Beta", "Actions": [ { "Name": "BetaAction", "InputArtifacts": [ { "Name": "SourceOutput" } ], "ActionTypeId": { "Category": "Deploy", "Owner": "AWS", "Version": 1, "Provider": "CodeDeploy" }, "Configuration": { "ApplicationName": { "Ref": "ApplicationName" }, "DeploymentGroupName": { "Ref": "BetaFleet" } }, "RunOrder": 1 } ] } ], "ArtifactStore": { "Type": "S3", "Location": { "Ref": "CodePipelineArtifactStoreBucket" } } } }, "EventRole": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "events.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] }, "Path": "/", "Policies": [ { "PolicyName": "eb-pipeline-execution", "PolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "codepipeline:StartPipelineExecution", "Resource": { "Fn::Join": [ "", [ "arn:aws:codepipeline:", { "Ref": "AWS::Region" }, ":", { "Ref": "AWS::AccountId" }, ":", { "Ref": "AppPipeline" } ] ] } } ] } } ] } }, "EventRule": { "Type": "AWS::Events::Rule", "Properties": { "EventBusName": "default", "EventPattern": { "source": [ "aws.s3" ], "detail-type": [ "Object Created" ], "detail": { "bucket": { "name": [ { "Ref": "SourceBucket" } ] } } }, "Name": "EnabledS3SourceRule", "State": "ENABLED", "Targets": [ { "Arn": { "Fn::Join": [ "", [ "arn:aws:codepipeline:", { "Ref": "AWS::Region" }, ":", { "Ref": "AWS::AccountId" }, ":", { "Ref": "AppPipeline" } ] ] }, "RoleArn": { "Fn::GetAtt": [ "EventRole", "Arn" ] }, "Id": "codepipeline-AppPipeline" } ] } } } } }

S3 ソースと CloudTrail 証跡を使用してポーリングパイプラインを移行する

Amazon S3 ソースを持つパイプラインの場合は、 を介して変更検出が自動化されるようにパイプラインを変更します EventBridge。以下のいずれかの方法で移行を実装します。

S3 ソースと CloudTrail 証跡を使用してポーリングパイプラインを移行する (CLI)

ポーリング (定期チェック) を使用して イベントを EventBridge 代わりに使用しているパイプラインを編集するには、次の手順に従います。パイプラインを作成する場合は、「パイプライン、ステージ、アクションを作成する」を参照してください。

Amazon S3 でイベント駆動型パイプラインを構築するには、パイプラインの PollForSourceChanges パラメータを編集してから、以下のリソースを作成します。

  • AWS CloudTrail Amazon S3 がイベントのログ記録に使用できる証跡、バケット、バケットポリシー。

  • EventBridge イベント

  • IAM EventBridge イベントがパイプラインを開始できるようにするロール

AWS CloudTrail 証跡を作成し、ログ記録を有効にするには

を使用して証跡 AWS CLI を作成するには、 create-trail コマンドを呼び出し、以下を指定します。

  • 証跡名。

  • AWS CloudTrailにバケットポリシーをすでに適用しているバケットです。

詳細については、AWS 「コマンドラインインターフェイス を使用した証跡の作成」を参照してください。

  1. create-trail コマンドを呼び出し、--name および --s3-bucket-name パラメータを含めます。

    この変更を行う理由 これにより、 CloudTrailS3 ソースバケットに必要な証跡が作成されます。

    次のコマンドでは、--name および --s3-bucket-name を使用して、my-trail という名前の証跡と、amzn-s3-demo-source-bucket という名前のバケットを作成します。

    aws cloudtrail create-trail --name my-trail --s3-bucket-name amzn-s3-demo-source-bucket
  2. start-logging コマンドを呼び出し、--name パラメータを含めます。

    この変更を行う理由 このコマンドは、ソースバケットの CloudTrail ログ記録を開始し、イベントを に送信します EventBridge。

    例:

    次のコマンドでは、--name を使用して、my-trail という名前の証跡のログ記録を開始します。

    aws cloudtrail start-logging --name my-trail
  3. put-event-selectors コマンドを呼び出し、--trail-name および --event-selectors パラメータを含めます。イベントセレクタを使用して、証跡がソースバケットのデータイベントを記録し、イベントを EventBridge ルールに送信するように指定します。

    この変更を行う理由 このコマンドはイベントをフィルタ処理します。

    例:

    次のサンプルコマンドでは、--trail-name および --event-selectors を使用してソースバケットと amzn-s3-demo-source-bucket/myFolder という名前のプレフィックスにデータイベントの管理を指定します。

    aws cloudtrail put-event-selectors --trail-name my-trail --event-selectors '[{ "ReadWriteType": "WriteOnly", "IncludeManagementEvents":false, "DataResources": [{ "Type": "AWS::S3::Object", "Values": ["arn:aws:s3:::amzn-s3-demo-source-bucket/myFolder/file.zip"] }] }]'
Amazon S3 をイベントソースおよびターゲット CodePipeline として EventBridge ルールを作成し、アクセス許可ポリシーを適用するには
  1. ルールの呼び出し EventBridge に使用する CodePipeline のアクセス許可を付与します。詳細については、「Amazon のリソースベースのポリシーの使用 EventBridge」を参照してください。

    1. 次のサンプルを使用して、 がサービスロールを EventBridge 引き受けるように信頼ポリシーを作成します。このスクリプトに trustpolicyforEB.json という名前を付けます。

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "events.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
    2. 次のコマンドを使用して、Role-for-MyRule ロールを作成し、信頼ポリシーをアタッチします。

      この変更を行う理由 この信頼ポリシーをロールに追加すると、 のアクセス許可が作成されます EventBridge。

      aws iam create-role --role-name Role-for-MyRule --assume-role-policy-document file://trustpolicyforEB.json
    3. JSON「」という名前のパイプラインのアクセス許可ポリシー を作成しますMyFirstPipeline。アクセス権限ポリシーに permissionspolicyforEB.json と名前を付けます。

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "codepipeline:StartPipelineExecution" ], "Resource": [ "arn:aws:codepipeline:us-west-2:80398EXAMPLE:MyFirstPipeline" ] } ] }
    4. 次のコマンドを実行して、作成した Role-for-MyRule ロールに新しい CodePipeline-Permissions-Policy-for-EB アクセス権限ポリシーをアタッチします。

      aws iam put-role-policy --role-name Role-for-MyRule --policy-name CodePipeline-Permissions-Policy-For-EB --policy-document file://permissionspolicyforEB.json
  2. put-rule コマンドを呼び出し、--name--event-pattern--role-arn パラメータを含めます。

    次のサンプルコマンドでは、MyS3SourceRule という名前のルールが作成されます。

    aws events put-rule --name "MyS3SourceRule" --event-pattern "{\"source\":[\"aws.s3\"],\"detail-type\":[\"AWS API Call via CloudTrail\"],\"detail\":{\"eventSource\":[\"s3.amazonaws.com\"],\"eventName\":[\"CopyObject\",\"PutObject\",\"CompleteMultipartUpload\"],\"requestParameters\":{\"bucketName\":[\"amzn-s3-demo-source-bucket\"],\"key\":[\"my-key\"]}}} --role-arn "arn:aws:iam::ACCOUNT_ID:role/Role-for-MyRule"
  3. をターゲット CodePipeline として追加するには、 put-targets コマンドを呼び出し、 --rule および --targetsパラメータを含めます。

    次のコマンドでは、MyS3SourceRule という名前のルールに対して指定し、ターゲット Id は 1 番で構成されています。これは、ルールのターゲットのリストが何であるかを示し、この場合は ターゲット 1 です。このコマンドでは、パイプラインのサンプルの ARN も指定されます。パイプラインは、リポジトリ内に変更が加えられると開始します。

    aws events put-targets --rule MyS3SourceRule --targets Id=1,Arn=arn:aws:codepipeline:us-west-2:80398EXAMPLE:TestPipeline
パイプラインの PollForSourceChangesパラメータを編集するには
重要

このメソッドを使用してパイプラインを作成すると、PollForSourceChanges パラメータはデフォルトで true になります (ただし、明示的に false に設定した場合は除きます)。イベントベースの変更検出を追加する場合は、このパラメータを出力に追加する必要があります。ポーリングを無効にするには、このパラメータを false に設定します。そうしないと、1 つのソース変更に対してパイプラインが 2 回起動されます。詳細については、「PollForSourceChanges パラメータの有効な設定」を参照してください。

  1. get-pipeline コマンドを実行して、パイプライン構造を JSON ファイルにコピーします。例えば、MyFirstPipeline という名前のパイプラインに対して、以下のコマンドを実行します。

    aws codepipeline get-pipeline --name MyFirstPipeline >pipeline.json

    このコマンドは何も返しませんが、作成したファイルは、コマンドを実行したディレクトリにあります。

  2. この例に示すように、プレーンテキストエディタで JSON ファイルを開きfalse、 という名前のバケットの PollForSourceChangesパラメータamzn-s3-demo-source-bucketを に変更してソースステージを編集します。

    この変更を行う理由 このパラメータを false に設定すると、定期的チェックがオフになるため、イベントベースの変更検出のみ使用することができます。

    "configuration": { "S3Bucket": "amzn-s3-demo-source-bucket", "PollForSourceChanges": "false", "S3ObjectKey": "index.zip" },
  3. get-pipeline コマンドを使用して取得したパイプライン構造を使用している場合は、JSONファイルからmetadata行を削除する必要があります。それ以外の場合は、update-pipeline コマンドで使用することはできません。"metadata": { } 行と、"created""pipelineARN""updated" フィールドを削除します。

    例えば、構造から以下の行を削除します。

    "metadata": { "pipelineArn": "arn:aws:codepipeline:region:account-ID:pipeline-name", "created": "date", "updated": "date" },

    ファイルを保存します。

  4. 変更を適用するには、 update-pipeline コマンドを実行し、パイプラインJSONファイルを指定します。

    重要

    ファイル名の前に必ず file:// を含めてください。このコマンドでは必須です。

    aws codepipeline update-pipeline --cli-input-json file://pipeline.json

    このコマンドは、編集したパイプラインの構造全体を返します。

    注記

    update-pipeline コマンドは、パイプラインを停止します。update-pipeline コマンドを実行したときにパイプラインによりリビジョンが実行されている場合、その実行は停止します。更新されたパイプラインによりそのリビジョンを実行するには、パイプラインを手動で開始する必要があります。パイプラインを手動で開始するには start-pipeline-execution コマンドを使用します。

S3 ソースと CloudTrail 証跡を使用してポーリングパイプラインを移行する (AWS CloudFormation テンプレート)

以下の手順を使用して、Amazon S3 ソースを含むパイプラインを、ポーリングからイベントベースの変更検出に編集します。

Amazon S3 でイベント駆動型パイプラインを構築するには、パイプラインの PollForSourceChanges パラメータを編集してから、以下のリソースをテンプレートに追加します。

  • EventBridge では、すべての Amazon S3 イベントをログに記録する必要があります。発生するイベントのロク記録に Amazon S3 が使用できる AWS CloudTrail 証跡、バケット、バケットポリシーを作成する必要があります。詳細については、「 証跡のデータイベント 」と「 管理イベントのログ記録 」を参照してください。

  • EventBridge このイベントがパイプラインを開始できるようにするルールとIAMロール。

AWS CloudFormation を使用してパイプラインを作成および管理する場合、テンプレートには次のようなコンテンツが含まれます。

注記

PollForSourceChanges と呼ばれるソースステージの Configuration プロパティ。テンプレートにプロパティが含まれていない場合、PollForSourceChanges はデフォルトで true に設定されます。

YAML
AppPipeline: Type: AWS::CodePipeline::Pipeline Properties: RoleArn: !GetAtt CodePipelineServiceRole.Arn Stages: - Name: Source Actions: - Name: SourceAction ActionTypeId: Category: Source Owner: AWS Version: 1 Provider: S3 OutputArtifacts: - Name: SourceOutput Configuration: S3Bucket: !Ref SourceBucket S3ObjectKey: !Ref S3SourceObjectKey PollForSourceChanges: true RunOrder: 1 ...
JSON
"AppPipeline": { "Type": "AWS::CodePipeline::Pipeline", "Properties": { "RoleArn": { "Fn::GetAtt": ["CodePipelineServiceRole", "Arn"] }, "Stages": [ { "Name": "Source", "Actions": [ { "Name": "SourceAction", "ActionTypeId": { "Category": "Source", "Owner": "AWS", "Version": 1, "Provider": "S3" }, "OutputArtifacts": [ { "Name": "SourceOutput" } ], "Configuration": { "S3Bucket": { "Ref": "SourceBucket" }, "S3ObjectKey": { "Ref": "SourceObjectKey" }, "PollForSourceChanges": true }, "RunOrder": 1 } ] }, ...
Amazon S3 をイベントソースおよびターゲット CodePipeline として EventBridge ルールを作成し、アクセス許可ポリシーを適用するには
  1. テンプレートの でResourcesAWS::IAM::Role AWS CloudFormation リソースを使用して、イベントがパイプラインを開始できるようにするIAMロールを設定します。このエントリによって、2 つのポリシーを使用するロールが作成されます。

    • 最初のポリシーでは、ロールを引き受けることを許可します。

    • 2 つめのポリシーでは、パイプラインを開始するアクセス権限が付与されます。

    この変更を行う理由 AWS::IAM::Role リソースを追加する AWS CloudFormation と、 は のアクセス許可を作成できます EventBridge。このリソースは AWS CloudFormation スタックに追加されます。

    YAML
    EventRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Principal: Service: - events.amazonaws.com Action: sts:AssumeRole Path: / Policies: - PolicyName: eb-pipeline-execution PolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Action: codepipeline:StartPipelineExecution Resource: !Join [ '', [ 'arn:aws:codepipeline:', !Ref 'AWS::Region', ':', !Ref 'AWS::AccountId', ':', !Ref AppPipeline ] ] ...
    JSON
    "EventRole": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "events.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] }, "Path": "/", "Policies": [ { "PolicyName": "eb-pipeline-execution", "PolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "codepipeline:StartPipelineExecution", "Resource": { "Fn::Join": [ "", [ "arn:aws:codepipeline:", { "Ref": "AWS::Region" }, ":", { "Ref": "AWS::AccountId" }, ":", { "Ref": "AppPipeline" } ] ] ...
  2. AWS::Events::Rule AWS CloudFormation リソースを使用して EventBridge ルールを追加します。このイベントパターンは、Amazon S3 ソースバケットでの CopyObjectPutObject、および CompleteMultipartUpload をモニタリングするイベントを作成します。さらに、パイプラインのターゲットも含めます。CopyObjectPutObject、または CompleteMultipartUpload が発生すると、このルールは、ターゲットパイプラインで StartPipelineExecution を呼び出します。

    この変更を行う理由 AWS::Events::Rule リソースを追加する AWS CloudFormation と、 はイベントを作成します。このリソースは AWS CloudFormation スタックに追加されます。

    YAML
    EventRule: Type: AWS::Events::Rule Properties: EventPattern: source: - aws.s3 detail-type: - 'AWS API Call via CloudTrail' detail: eventSource: - s3.amazonaws.com eventName: - CopyObject - PutObject - CompleteMultipartUpload requestParameters: bucketName: - !Ref SourceBucket key: - !Ref SourceObjectKey Targets: - Arn: !Join [ '', [ 'arn:aws:codepipeline:', !Ref 'AWS::Region', ':', !Ref 'AWS::AccountId', ':', !Ref AppPipeline ] ] RoleArn: !GetAtt EventRole.Arn Id: codepipeline-AppPipeline ...
    JSON
    "EventRule": { "Type": "AWS::Events::Rule", "Properties": { "EventPattern": { "source": [ "aws.s3" ], "detail-type": [ "AWS API Call via CloudTrail" ], "detail": { "eventSource": [ "s3.amazonaws.com" ], "eventName": [ "CopyObject", "PutObject", "CompleteMultipartUpload" ], "requestParameters": { "bucketName": [ { "Ref": "SourceBucket" } ], "key": [ { "Ref": "SourceObjectKey" } ] } } }, "Targets": [ { "Arn": { "Fn::Join": [ "", [ "arn:aws:codepipeline:", { "Ref": "AWS::Region" }, ":", { "Ref": "AWS::AccountId" }, ":", { "Ref": "AppPipeline" } ] ] }, "RoleArn": { "Fn::GetAtt": [ "EventRole", "Arn" ] }, "Id": "codepipeline-AppPipeline" } ] } } }, ...
  3. このスニペットを最初のテンプレートに追加して、クロススタック機能を有効にします。

    YAML
    Outputs: SourceBucketARN: Description: "S3 bucket ARN that Cloudtrail will use" Value: !GetAtt SourceBucket.Arn Export: Name: SourceBucketARN
    JSON
    "Outputs" : { "SourceBucketARN" : { "Description" : "S3 bucket ARN that Cloudtrail will use", "Value" : { "Fn::GetAtt": ["SourceBucket", "Arn"] }, "Export" : { "Name" : "SourceBucketARN" } } ...
  4. 更新されたテンプレートをローカルコンピュータに保存し、 AWS CloudFormation コンソールを開きます。

  5. スタックを選択し、[既存スタックの変更セットの作成] を選択します。

  6. 更新されたテンプレートをアップロードし、 AWS CloudFormationに示された変更を表示します。これらがスタックに加えられる変更です。新しいリソースがリストに表示されています。

  7. [実行] を選択します。

パイプラインの PollForSourceChangesパラメータを編集するには
重要

このメソッドを使用してパイプラインを作成すると、PollForSourceChanges パラメータはデフォルトで true になります (ただし、明示的に false に設定した場合は除きます)。イベントベースの変更検出を追加する場合は、このパラメータを出力に追加する必要があります。ポーリングを無効にするには、このパラメータを false に設定します。そうしないと、1 つのソース変更に対してパイプラインが 2 回起動されます。詳細については、「PollForSourceChanges パラメータの有効な設定」を参照してください。

  • テンプレートで、PollForSourceChangesfalse に変更します。パイプライン定義に PollForSourceChanges が含まれていなかった場合は、追加して false に設定します。

    この変更を行う理由 PollForSourceChanges パラメータを false に変更すると、定期的チェックがオフになるため、イベントベースの変更検出のみ使用することができます。

    YAML
    Name: Source Actions: - Name: SourceAction ActionTypeId: Category: Source Owner: AWS Version: 1 Provider: S3 OutputArtifacts: - Name: SourceOutput Configuration: S3Bucket: !Ref SourceBucket S3ObjectKey: !Ref SourceObjectKey PollForSourceChanges: false RunOrder: 1
    JSON
    { "Name": "SourceAction", "ActionTypeId": { "Category": "Source", "Owner": "AWS", "Version": 1, "Provider": "S3" }, "OutputArtifacts": [ { "Name": "SourceOutput" } ], "Configuration": { "S3Bucket": { "Ref": "SourceBucket" }, "S3ObjectKey": { "Ref": "SourceObjectKey" }, "PollForSourceChanges": false }, "RunOrder": 1 }
Amazon S3 パイプラインの CloudTrail リソース用に 2 番目のテンプレートを作成するには
  • 別のテンプレートの でResources、、AWS::S3::BucketPolicy、および AWS::S3::BucketAWS::CloudTrail::Trail AWS CloudFormation リソースを使用して、 のシンプルなバケット定義と証跡を提供します CloudTrail。

    この変更を行う理由 現在のアカウントあたり 5 つの証跡の制限を考慮すると、 CloudTrail 証跡は個別に作成および管理する必要があります。(「」の「 の制限 AWS CloudTrail」を参照してください。) ただし、1 つの証跡に複数の Amazon S3 バケットを含めることができるため、いったん証跡を作成してから、必要に応じて他のパイプライン用に Amazon S3 バケットを追加できます。2 番目のサンプルテンプレートファイルに以下のコードを貼り付けます。

    YAML
    ################################################################################### # Prerequisites: # - S3 SourceBucket and SourceObjectKey must exist ################################################################################### Parameters: SourceObjectKey: Description: 'S3 source artifact' Type: String Default: SampleApp_Linux.zip Resources: AWSCloudTrailBucketPolicy: Type: AWS::S3::BucketPolicy Properties: Bucket: !Ref AWSCloudTrailBucket PolicyDocument: Version: 2012-10-17 Statement: - Sid: AWSCloudTrailAclCheck Effect: Allow Principal: Service: - cloudtrail.amazonaws.com Action: s3:GetBucketAcl Resource: !GetAtt AWSCloudTrailBucket.Arn - Sid: AWSCloudTrailWrite Effect: Allow Principal: Service: - cloudtrail.amazonaws.com Action: s3:PutObject Resource: !Join [ '', [ !GetAtt AWSCloudTrailBucket.Arn, '/AWSLogs/', !Ref 'AWS::AccountId', '/*' ] ] Condition: StringEquals: s3:x-amz-acl: bucket-owner-full-control AWSCloudTrailBucket: Type: AWS::S3::Bucket DeletionPolicy: Retain AwsCloudTrail: DependsOn: - AWSCloudTrailBucketPolicy Type: AWS::CloudTrail::Trail Properties: S3BucketName: !Ref AWSCloudTrailBucket EventSelectors: - DataResources: - Type: AWS::S3::Object Values: - !Join [ '', [ !ImportValue SourceBucketARN, '/', !Ref SourceObjectKey ] ] ReadWriteType: WriteOnly IncludeManagementEvents: false IncludeGlobalServiceEvents: true IsLogging: true IsMultiRegionTrail: true ...
    JSON
    { "Parameters": { "SourceObjectKey": { "Description": "S3 source artifact", "Type": "String", "Default": "SampleApp_Linux.zip" } }, "Resources": { "AWSCloudTrailBucket": { "Type": "AWS::S3::Bucket", "DeletionPolicy": "Retain" }, "AWSCloudTrailBucketPolicy": { "Type": "AWS::S3::BucketPolicy", "Properties": { "Bucket": { "Ref": "AWSCloudTrailBucket" }, "PolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Sid": "AWSCloudTrailAclCheck", "Effect": "Allow", "Principal": { "Service": [ "cloudtrail.amazonaws.com" ] }, "Action": "s3:GetBucketAcl", "Resource": { "Fn::GetAtt": [ "AWSCloudTrailBucket", "Arn" ] } }, { "Sid": "AWSCloudTrailWrite", "Effect": "Allow", "Principal": { "Service": [ "cloudtrail.amazonaws.com" ] }, "Action": "s3:PutObject", "Resource": { "Fn::Join": [ "", [ { "Fn::GetAtt": [ "AWSCloudTrailBucket", "Arn" ] }, "/AWSLogs/", { "Ref": "AWS::AccountId" }, "/*" ] ] }, "Condition": { "StringEquals": { "s3:x-amz-acl": "bucket-owner-full-control" } } } ] } } }, "AwsCloudTrail": { "DependsOn": [ "AWSCloudTrailBucketPolicy" ], "Type": "AWS::CloudTrail::Trail", "Properties": { "S3BucketName": { "Ref": "AWSCloudTrailBucket" }, "EventSelectors": [ { "DataResources": [ { "Type": "AWS::S3::Object", "Values": [ { "Fn::Join": [ "", [ { "Fn::ImportValue": "SourceBucketARN" }, "/", { "Ref": "SourceObjectKey" } ] ] } ] } ], "ReadWriteType": "WriteOnly", "IncludeManagementEvents": false } ], "IncludeGlobalServiceEvents": true, "IsLogging": true, "IsMultiRegionTrail": true } } } } ...

AWS CloudFormation を使用してこれらのリソースを作成すると、リポジトリ内のファイルが作成または更新されたときにパイプラインがトリガーされます。

注記

ここで手順は終わりではありません。パイプラインは作成されますが、Amazon S3 パイプライン用の 2 番目の AWS CloudFormation テンプレートを作成する必要があります。2 番目のテンプレートを作成しない場合、パイプラインに変更検出機能はありません。

YAML
Resources: SourceBucket: Type: AWS::S3::Bucket Properties: VersioningConfiguration: Status: Enabled CodePipelineArtifactStoreBucket: Type: AWS::S3::Bucket CodePipelineArtifactStoreBucketPolicy: Type: AWS::S3::BucketPolicy Properties: Bucket: !Ref CodePipelineArtifactStoreBucket PolicyDocument: Version: 2012-10-17 Statement: - Sid: DenyUnEncryptedObjectUploads Effect: Deny Principal: '*' Action: s3:PutObject Resource: !Join [ '', [ !GetAtt CodePipelineArtifactStoreBucket.Arn, '/*' ] ] Condition: StringNotEquals: s3:x-amz-server-side-encryption: aws:kms - Sid: DenyInsecureConnections Effect: Deny Principal: '*' Action: s3:* Resource: !Join [ '', [ !GetAtt CodePipelineArtifactStoreBucket.Arn, '/*' ] ] Condition: Bool: aws:SecureTransport: false CodePipelineServiceRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Principal: Service: - codepipeline.amazonaws.com Action: sts:AssumeRole Path: / Policies: - PolicyName: AWS-CodePipeline-Service-3 PolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Action: - codecommit:CancelUploadArchive - codecommit:GetBranch - codecommit:GetCommit - codecommit:GetUploadArchiveStatus - codecommit:UploadArchive Resource: 'resource_ARN' - Effect: Allow Action: - codedeploy:CreateDeployment - codedeploy:GetApplicationRevision - codedeploy:GetDeployment - codedeploy:GetDeploymentConfig - codedeploy:RegisterApplicationRevision Resource: 'resource_ARN' - Effect: Allow Action: - codebuild:BatchGetBuilds - codebuild:StartBuild Resource: 'resource_ARN' - Effect: Allow Action: - devicefarm:ListProjects - devicefarm:ListDevicePools - devicefarm:GetRun - devicefarm:GetUpload - devicefarm:CreateUpload - devicefarm:ScheduleRun Resource: 'resource_ARN' - Effect: Allow Action: - lambda:InvokeFunction - lambda:ListFunctions Resource: 'resource_ARN' - Effect: Allow Action: - iam:PassRole Resource: 'resource_ARN' - Effect: Allow Action: - elasticbeanstalk:* - ec2:* - elasticloadbalancing:* - autoscaling:* - cloudwatch:* - s3:* - sns:* - cloudformation:* - rds:* - sqs:* - ecs:* Resource: 'resource_ARN' AppPipeline: Type: AWS::CodePipeline::Pipeline Properties: Name: s3-events-pipeline RoleArn: !GetAtt CodePipelineServiceRole.Arn Stages: - Name: Source Actions: - Name: SourceAction ActionTypeId: Category: Source Owner: AWS Version: 1 Provider: S3 OutputArtifacts: - Name: SourceOutput Configuration: S3Bucket: !Ref SourceBucket S3ObjectKey: !Ref SourceObjectKey PollForSourceChanges: false RunOrder: 1 - Name: Beta Actions: - Name: BetaAction InputArtifacts: - Name: SourceOutput ActionTypeId: Category: Deploy Owner: AWS Version: 1 Provider: CodeDeploy Configuration: ApplicationName: !Ref ApplicationName DeploymentGroupName: !Ref BetaFleet RunOrder: 1 ArtifactStore: Type: S3 Location: !Ref CodePipelineArtifactStoreBucket EventRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Principal: Service: - events.amazonaws.com Action: sts:AssumeRole Path: / Policies: - PolicyName: eb-pipeline-execution PolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Action: codepipeline:StartPipelineExecution Resource: !Join [ '', [ 'arn:aws:codepipeline:', !Ref 'AWS::Region', ':', !Ref 'AWS::AccountId', ':', !Ref AppPipeline ] ] EventRule: Type: AWS::Events::Rule Properties: EventPattern: source: - aws.s3 detail-type: - 'AWS API Call via CloudTrail' detail: eventSource: - s3.amazonaws.com eventName: - PutObject - CompleteMultipartUpload resources: ARN: - !Join [ '', [ !GetAtt SourceBucket.Arn, '/', !Ref SourceObjectKey ] ] Targets: - Arn: !Join [ '', [ 'arn:aws:codepipeline:', !Ref 'AWS::Region', ':', !Ref 'AWS::AccountId', ':', !Ref AppPipeline ] ] RoleArn: !GetAtt EventRole.Arn Id: codepipeline-AppPipeline Outputs: SourceBucketARN: Description: "S3 bucket ARN that Cloudtrail will use" Value: !GetAtt SourceBucket.Arn Export: Name: SourceBucketARN
JSON
"Resources": { "SourceBucket": { "Type": "AWS::S3::Bucket", "Properties": { "VersioningConfiguration": { "Status": "Enabled" } } }, "CodePipelineArtifactStoreBucket": { "Type": "AWS::S3::Bucket" }, "CodePipelineArtifactStoreBucketPolicy": { "Type": "AWS::S3::BucketPolicy", "Properties": { "Bucket": { "Ref": "CodePipelineArtifactStoreBucket" }, "PolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Sid": "DenyUnEncryptedObjectUploads", "Effect": "Deny", "Principal": "*", "Action": "s3:PutObject", "Resource": { "Fn::Join": [ "", [ { "Fn::GetAtt": [ "CodePipelineArtifactStoreBucket", "Arn" ] }, "/*" ] ] }, "Condition": { "StringNotEquals": { "s3:x-amz-server-side-encryption": "aws:kms" } } }, { "Sid": "DenyInsecureConnections", "Effect": "Deny", "Principal": "*", "Action": "s3:*", "Resource": { "Fn::Join": [ "", [ { "Fn::GetAtt": [ "CodePipelineArtifactStoreBucket", "Arn" ] }, "/*" ] ] }, "Condition": { "Bool": { "aws:SecureTransport": false } } } ] } } }, "CodePipelineServiceRole": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "codepipeline.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] }, "Path": "/", "Policies": [ { "PolicyName": "AWS-CodePipeline-Service-3", "PolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "codecommit:CancelUploadArchive", "codecommit:GetBranch", "codecommit:GetCommit", "codecommit:GetUploadArchiveStatus", "codecommit:UploadArchive" ], "Resource": "resource_ARN" }, { "Effect": "Allow", "Action": [ "codedeploy:CreateDeployment", "codedeploy:GetApplicationRevision", "codedeploy:GetDeployment", "codedeploy:GetDeploymentConfig", "codedeploy:RegisterApplicationRevision" ], "Resource": "resource_ARN" }, { "Effect": "Allow", "Action": [ "codebuild:BatchGetBuilds", "codebuild:StartBuild" ], "Resource": "resource_ARN" }, { "Effect": "Allow", "Action": [ "devicefarm:ListProjects", "devicefarm:ListDevicePools", "devicefarm:GetRun", "devicefarm:GetUpload", "devicefarm:CreateUpload", "devicefarm:ScheduleRun" ], "Resource": "resource_ARN" }, { "Effect": "Allow", "Action": [ "lambda:InvokeFunction", "lambda:ListFunctions" ], "Resource": "resource_ARN" }, { "Effect": "Allow", "Action": [ "iam:PassRole" ], "Resource": "resource_ARN" }, { "Effect": "Allow", "Action": [ "elasticbeanstalk:*", "ec2:*", "elasticloadbalancing:*", "autoscaling:*", "cloudwatch:*", "s3:*", "sns:*", "cloudformation:*", "rds:*", "sqs:*", "ecs:*" ], "Resource": "resource_ARN" } ] } } ] } }, "AppPipeline": { "Type": "AWS::CodePipeline::Pipeline", "Properties": { "Name": "s3-events-pipeline", "RoleArn": { "Fn::GetAtt": [ "CodePipelineServiceRole", "Arn" ] }, "Stages": [ { "Name": "Source", "Actions": [ { "Name": "SourceAction", "ActionTypeId": { "Category": "Source", "Owner": "AWS", "Version": 1, "Provider": "S3" }, "OutputArtifacts": [ { "Name": "SourceOutput" } ], "Configuration": { "S3Bucket": { "Ref": "SourceBucket" }, "S3ObjectKey": { "Ref": "SourceObjectKey" }, "PollForSourceChanges": false }, "RunOrder": 1 } ] }, { "Name": "Beta", "Actions": [ { "Name": "BetaAction", "InputArtifacts": [ { "Name": "SourceOutput" } ], "ActionTypeId": { "Category": "Deploy", "Owner": "AWS", "Version": 1, "Provider": "CodeDeploy" }, "Configuration": { "ApplicationName": { "Ref": "ApplicationName" }, "DeploymentGroupName": { "Ref": "BetaFleet" } }, "RunOrder": 1 } ] } ], "ArtifactStore": { "Type": "S3", "Location": { "Ref": "CodePipelineArtifactStoreBucket" } } } }, "EventRole": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "events.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] }, "Path": "/", "Policies": [ { "PolicyName": "eb-pipeline-execution", "PolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "codepipeline:StartPipelineExecution", "Resource": { "Fn::Join": [ "", [ "arn:aws:codepipeline:", { "Ref": "AWS::Region" }, ":", { "Ref": "AWS::AccountId" }, ":", { "Ref": "AppPipeline" } ] ] } } ] } } ] } }, "EventRule": { "Type": "AWS::Events::Rule", "Properties": { "EventPattern": { "source": [ "aws.s3" ], "detail-type": [ "AWS API Call via CloudTrail" ], "detail": { "eventSource": [ "s3.amazonaws.com" ], "eventName": [ "PutObject", "CompleteMultipartUpload" ], "resources": { "ARN": [ { "Fn::Join": [ "", [ { "Fn::GetAtt": [ "SourceBucket", "Arn" ] }, "/", { "Ref": "SourceObjectKey" } ] ] } ] } } }, "Targets": [ { "Arn": { "Fn::Join": [ "", [ "arn:aws:codepipeline:", { "Ref": "AWS::Region" }, ":", { "Ref": "AWS::AccountId" }, ":", { "Ref": "AppPipeline" } ] ] }, "RoleArn": { "Fn::GetAtt": [ "EventRole", "Arn" ] }, "Id": "codepipeline-AppPipeline" } ] } } }, "Outputs" : { "SourceBucketARN" : { "Description" : "S3 bucket ARN that Cloudtrail will use", "Value" : { "Fn::GetAtt": ["SourceBucket", "Arn"] }, "Export" : { "Name" : "SourceBucketARN" } } } } ...

GitHub バージョン 1 のソースアクションのポーリングパイプラインを接続に移行する

GitHub バージョン 1 のソースアクションを移行して、外部リポジトリの接続を使用できます。これは、バージョン 1 のソースアクションを持つ GitHubパイプラインに推奨される変更検出方法です。

GitHub バージョン 1 のソースアクションを持つパイプラインでは、 を介して変更検出が自動化されるように、 GitHub バージョン 2 アクションを使用するようにパイプラインを変更することをお勧めします AWS CodeConnections。接続の使用の詳細については、「GitHub 接続」を参照してください。

への接続を作成する GitHub (コンソール)

コンソールを使用して、 への接続を作成できます GitHub。

ステップ 1: バージョン 1 GitHub アクションを置き換える

パイプライン編集ページを使用して、バージョン 1 GitHub アクションをバージョン 2 GitHub アクションに置き換えます。

バージョン 1 GitHub アクションを置き換えるには
  1. CodePipeline コンソールにサインインします。

  2. パイプラインを選択し、[編集] を選択します。ソースステージで、[ステージを編集] を選択します。アクションを更新することを推奨するメッセージが表示されます。

  3. アクションプロバイダー で、 GitHub (バージョン 2) を選択します。

  4. 次のいずれかを行います。

    • 接続 で、プロバイダーへの接続をまだ作成していない場合は、 に接続 GitHubを選択します。ステップ 2: への接続を作成します GitHub。

    • [接続] でプロバイダへの接続を既に作成している場合は、その接続を選択します。ステップ 3: 接続のソースアクションを保存するに進みます。

ステップ 2: への接続を作成する GitHub

接続の作成を選択すると、Connect to GitHub ページが表示されます。

への接続を作成するには GitHub
  1. GitHub 接続設定 では、接続名が接続名 に表示されます。

    GitHub Apps で、アプリのインストールを選択するか、新しいアプリのインストールを選択して作成します。

    注記

    特定のプロバイダーへのすべての接続に対してアプリを 1 つインストールします。 GitHub アプリを既にインストールしている場合は、アプリを選択してこのステップをスキップします。

  2. の承認ページ GitHub が表示された場合は、認証情報を使用してログインし、続行することを選択します。

  3. アプリのインストールページで、 AWS CodeStar アプリが GitHub アカウントに接続しようとしていることを示すメッセージが表示されます。

    注記

    アプリは GitHub 、アカウントごとに 1 回だけインストールします。アプリケーションをインストール済みである場合は、[Configure] (設定) を選択してアプリのインストールの変更ページに進むか、戻るボタンでコンソールに戻ることができます。

  4. [ AWS CodeStarのインストール] ページで、[インストール] を選択します。

  5. Connect to GitHub ページに、新しいインストールの接続 ID が表示されます。[接続]を選択します。

ステップ 3: GitHub ソースアクションを保存する

[アクションを編集] というページで更新を実行し、新しいソースアクションを保存します。

GitHub ソースアクションを保存するには
  1. [リポジトリ] で、サードパーティーのリポジトリの名前を入力します。[ブランチ] で、パイプラインでソースの変更を検出するブランチを入力します。

    注記

    [Repository] で、例に示すように owner-name/repository-name を入力します。

    my-account/my-repository
  2. [Output artifact format (出力アーティファクトのフォーマット)] で、アーティファクトのフォーマットを選択します。

    • デフォルトの メソッドを使用して GitHub アクションから出力アーティファクトを保存するには、CodePipelineデフォルトの を選択します。アクションは GitHub リポジトリからファイルにアクセスし、パイプラインアーティファクトストアのZIPファイルにアーティファクトを保存します。

    • リポジトリへのURL参照を含むJSONファイルを保存して、ダウンストリームアクションが Git コマンドを直接実行できるようにするには、フルクローン を選択します。このオプションは、 CodeBuild ダウンストリームアクションでのみ使用できます。

      このオプションを選択した場合は、「」に示すように、 CodeBuild プロジェクトサービスロールのアクセス許可を更新する必要がありますBitbucket、 GitHub Enterprise Server GitHub、または GitLab.com への接続 CodeBuild GitClone 許可を追加するフルクローン オプションの使い方を紹介したチュートリアルは、チュートリアル: GitHub パイプラインソースでフルクローンを使用する をご覧ください。

  3. 出力アーティファクト の場合、SourceArtifact のようにこのアクションの出力アーティファクトの名前を保持できます。[Done] を選択して、[アクションを編集] ページを閉じます。

  4. [Done] を選択して、ステージの編集ページを閉じます。[Save] を選択して、パイプラインの編集ページを閉じます。

GitHub (CLI) への接続を作成する

AWS Command Line Interface (AWS CLI) を使用して、 への接続を作成できます GitHub。

これを行うには、create-connection コマンドを使用します。

重要

AWS CLI または を通じて作成された接続 AWS CloudFormation は、デフォルトでPENDINGステータスになっています。CLI または との接続を作成したら AWS CloudFormation、コンソールを使用して接続を編集し、ステータスを にしますAVAILABLE

への接続を作成するには GitHub
  1. ターミナル (Linux/macOS/Unix) またはコマンドプロンプト (Windows) を開きます。 AWS CLI を使用して create-connection コマンドを実行し、接続--connection-name--provider-typeと を指定します。この例では、サードパーティープロバイダー名は GitHub で、指定された接続名は MyConnection です。

    aws codeconnections create-connection --provider-type GitHub --connection-name MyConnection

    成功すると、このコマンドは次のような接続ARN情報を返します。

    { "ConnectionArn": "arn:aws:codeconnections:us-west-2:account_id:connection/aEXAMPLE-8aad-4d5d-8878-dfcab0bc441f" }
  2. コンソールを使用して接続を完了します。

GitHub バージョン 1 のソースアクションのポーリングパイプラインをウェブフックに移行する

パイプラインを移行して、ウェブフックを使用して GitHub ソースリポジトリの変更を検出できます。このウェブフックへの移行は、 GitHub バージョン 1 アクション専用です。

重要

CodePipeline ウェブフックを作成するときは、独自の認証情報を使用したり、複数のウェブフックで同じシークレットトークンを再利用したりしないでください。セキュリティを最適化するには、作成するウェブフックごとに一意のシークレットトークンを生成します。シークレットトークンは、指定した任意の文字列で、 GitHub を使用して に送信されたウェブフックペイロードを計算して署名し CodePipeline、ウェブフックペイロードの整合性と信頼性を保護します。独自の認証情報を使用したり、複数のウェブフックで同じトークンを再利用したりすると、セキュリティの脆弱性が発生する可能性があります。

ポーリングパイプラインをウェブフックに移行する (GitHub バージョン 1 のソースアクション) (コンソール)

GitHub バージョン 1 のソースアクションでは、 CodePipeline コンソールを使用してパイプラインを更新し、ウェブフックを使用して GitHub ソースリポジトリの変更を検出できます。

ポーリング (定期チェック) を使用して EventBridge 代わりに使用するパイプラインを編集するには、次の手順に従います。パイプラインを作成する場合は、「パイプライン、ステージ、アクションを作成する」を参照してください。

コンソールを使用すると、パイプラインの PollForSourceChanges パラメータが変更されます。 GitHub ウェブフックが作成され、登録されます。

パイプラインソースステージを編集するには
  1. にサインイン AWS Management Console し、http://console.aws.amazon.com/codesuite/codepipeline/home で CodePipeline コンソールを開きます。

    AWS アカウントに関連付けられているすべてのパイプラインの名前が表示されます。

  2. [Name] で、編集するパイプラインの名前を選択します。これにより、パイプラインの詳細ビューが開いて、パイプラインの各ステージの各アクションの状態などがわかります。

  3. パイプライン詳細ページで、[編集] を選択します。

  4. [Edit (編集)] ステージで、ソースアクションの編集アイコンを選択します。

  5. 変更検出オプションを展開し、Amazon CloudWatch Events を使用して変更が発生したときに自動的にパイプラインを起動する (推奨) を選択します。

    ソースの変更を検出 GitHub するためのウェブフック CodePipeline を作成するためのメッセージが表示されます。 AWS CodePipeline はウェブフックを作成します。以下のオプションでオプトアウトできます。[Update] (更新) を選択します。ウェブフックに加えて、 は以下 CodePipeline を作成します。

    • シークレット。ランダムに生成され、 への接続を承認するために使用します GitHub。

    • リージョンのパブリックエンドポイントを使用してURL生成されたウェブフック。

    CodePipeline はウェブフックを に登録します GitHub。これにより、リポジトリイベントを受信するURLように がサブスクライブされます。

  6. パイプラインの編集が終わったら、[パイプラインの変更を保存] を選択して概要ページに戻ります。

    パイプラインに対して作成されるウェブフックの名前を示すメッセージが表示されます。[Save and continue] を選択します。

  7. アクションをテストするには、 を使用して変更をリリース AWS CLI し、パイプラインのソースステージで指定されたソースに変更をコミットします。

ポーリングパイプラインをウェブフックに移行する (GitHub バージョン 1 ソースアクション) (CLI)

ウェブフックを使用するために定期的なチェックを使用しているパイプラインを編集するには、次の手順を使用します。パイプラインを作成する場合は、「パイプライン、ステージ、アクションを作成する」を参照してください。

イベント駆動型パイプラインを構築するには、パイプラインの PollForSourceChanges パラメータを編集してから、以下のリソースを手動で作成します。

  • GitHub Webhook および認証パラメータ

ウェブフックを作成して登録するには
注記

CLI または を使用してパイプライン AWS CloudFormation を作成し、ウェブフックを追加する場合は、定期的なチェックを無効にする必要があります。定期的なチェックを無効にするには、以下の最終的な手順に詳述するとおり、PollForSourceChanges パラメータを明示的に追加して false に設定する必要があります。それ以外の場合、 CLIまたは AWS CloudFormation パイプラインのデフォルトは true にPollForSourceChangesデフォルト設定され、パイプライン構造の出力には表示されません。 PollForSourceChanges デフォルトの詳細については、「」を参照してくださいPollForSourceChanges パラメータの有効な設定

  1. テキストエディタで、作成するウェブフックのJSONファイルを作成して保存します。「my-webhook」という名前のウェブフックには、このサンプルを使用します。

    { "webhook": { "name": "my-webhook", "targetPipeline": "pipeline_name", "targetAction": "source_action_name", "filters": [{ "jsonPath": "$.ref", "matchEquals": "refs/heads/{Branch}" }], "authentication": "GITHUB_HMAC", "authenticationConfiguration": { "SecretToken": "secret" } } }
  2. put-webhook コマンドを呼び出し、--cli-input および --region パラメータを含めます。

    次のサンプルコマンドは、 webhook_json JSON ファイルを使用してウェブフックを作成します。

    aws codepipeline put-webhook --cli-input-json file://webhook_json.json --region "eu-central-1"
  3. この例では、 URL と ARNは という名前のウェブフックに対して返されますmy-webhook

    { "webhook": { "url": "https://webhooks.domain.com/trigger111111111EXAMPLE11111111111111111", "definition": { "authenticationConfiguration": { "SecretToken": "secret" }, "name": "my-webhook", "authentication": "GITHUB_HMAC", "targetPipeline": "pipeline_name", "targetAction": "Source", "filters": [ { "jsonPath": "$.ref", "matchEquals": "refs/heads/{Branch}" } ] }, "arn": "arn:aws:codepipeline:eu-central-1:ACCOUNT_ID:webhook:my-webhook" }, "tags": [{ "key": "Project", "value": "ProjectA" }] }

    この例では、ウェブフックにProjectタグキーとProjectA値を含めることで、ウェブフックにタグ付けを追加します。でのリソースのタグ付けの詳細については CodePipeline、「」を参照してくださいリソースのタグ付け

  4. register-webhook-with-third-party コマンドを呼び出し、--webhook-name パラメータを含めます。

    次のサンプルコマンドは、「my-webhook」という名前のウェブフックを登録します。

    aws codepipeline register-webhook-with-third-party --webhook-name my-webhook
パイプラインの PollForSourceChangesパラメータを編集するには
重要

このメソッドを使用してパイプラインを作成すると、PollForSourceChanges パラメータはデフォルトで true になります (ただし、明示的に false に設定した場合は除きます)。イベントベースの変更検出を追加する場合は、このパラメータを出力に追加する必要があります。ポーリングを無効にするには、このパラメータを false に設定します。そうしないと、1 つのソース変更に対してパイプラインが 2 回起動されます。詳細については、「PollForSourceChanges パラメータの有効な設定」を参照してください。

  1. get-pipeline コマンドを実行して、パイプライン構造を JSON ファイルにコピーします。例えば、MyFirstPipeline という名前のパイプラインの場合は、以下のコマンドを入力します。

    aws codepipeline get-pipeline --name MyFirstPipeline >pipeline.json

    このコマンドは何も返しませんが、作成したファイルは、コマンドを実行したディレクトリにあります。

  2. 任意のプレーンテキストエディタでJSONファイルを開き、 PollForSourceChangesパラメータを変更または追加してソースステージを編集します。この例では、UserGitHubRepo という名前のリポジトリで、パラメータを false に設定します。

    この変更を行う理由 このパラメータを変更すると、定期的なチェックがオフになるため、イベントベースの変更検出のみ使用することができます。

    "configuration": { "Owner": "name", "Repo": "UserGitHubRepo", "PollForSourceChanges": "false", "Branch": "main", "OAuthToken": "****" },
  3. get-pipeline コマンドを使用して取得したパイプライン構造を使用する場合は、JSONファイルからmetadata行を削除して、ファイル内の構造を編集する必要があります。それ以外の場合は、update-pipeline コマンドで使用することはできません。: { }および 、、 "updated"フィールドを含む"created""pipelineARN"、 JSON ファイル内のパイプライン構造から "metadata"セクションを削除します。

    例えば、構造から以下の行を削除します。

    "metadata": { "pipelineArn": "arn:aws:codepipeline:region:account-ID:pipeline-name", "created": "date", "updated": "date" },

    ファイルを保存します。

  4. 変更を適用するには、次のようなパイプラインJSONファイルを指定して update-pipeline コマンドを実行します。

    重要

    ファイル名の前に必ず file:// を含めてください。このコマンドでは必須です。

    aws codepipeline update-pipeline --cli-input-json file://pipeline.json

    このコマンドは、編集したパイプラインの構造全体を返します。

    注記

    update-pipeline コマンドは、パイプラインを停止します。update-pipeline コマンドを実行したときにパイプラインによりリビジョンが実行されている場合、その実行は停止します。更新されたパイプラインによりそのリビジョンを実行するには、パイプラインを手動で開始する必要があります。パイプラインを手動で開始するには start-pipeline-execution コマンドを使用します。

プッシュイベントのパイプラインを更新する (GitHub バージョン 1 ソースアクション) (AWS CloudFormation テンプレート)

以下の手順に従って、ウェブフックを使用してパイプライン ( GitHub ソースを含む) を定期的なチェック (ポーリング) からイベントベースの変更検出に更新します。

でイベント駆動型パイプラインを構築するには AWS CodeCommit、パイプラインの PollForSourceChangesパラメータを編集し、テンプレートに GitHub ウェブフックリソースを追加します。

AWS CloudFormation を使用してパイプラインを作成および管理する場合、テンプレートには次のようなコンテンツがあります。

注記

ソースステージ内の PollForSourceChanges 設定プロパティを書き留めます。テンプレートにプロパティが含まれていない場合、PollForSourceChanges はデフォルトで true に設定されます。

YAML
Resources: AppPipeline: Type: AWS::CodePipeline::Pipeline Properties: Name: github-polling-pipeline RoleArn: !GetAtt CodePipelineServiceRole.Arn Stages: - Name: Source Actions: - Name: SourceAction ActionTypeId: Category: Source Owner: ThirdParty Version: 1 Provider: GitHub OutputArtifacts: - Name: SourceOutput Configuration: Owner: !Ref GitHubOwner Repo: !Ref RepositoryName Branch: !Ref BranchName OAuthToken: {{resolve:secretsmanager:MyGitHubSecret:SecretString:token}} PollForSourceChanges: true RunOrder: 1 ...
JSON
"AppPipeline": { "Type": "AWS::CodePipeline::Pipeline", "Properties": { "Name": "github-polling-pipeline", "RoleArn": { "Fn::GetAtt": [ "CodePipelineServiceRole", "Arn" ] }, "Stages": [ { "Name": "Source", "Actions": [ { "Name": "SourceAction", "ActionTypeId": { "Category": "Source", "Owner": "ThirdParty", "Version": 1, "Provider": "GitHub" }, "OutputArtifacts": [ { "Name": "SourceOutput" } ], "Configuration": { "Owner": { "Ref": "GitHubOwner" }, "Repo": { "Ref": "RepositoryName" }, "Branch": { "Ref": "BranchName" }, "OAuthToken": "{{resolve:secretsmanager:MyGitHubSecret:SecretString:token}}", "PollForSourceChanges": true }, "RunOrder": 1 } ] }, ...
テンプレートにパラメータを追加してウェブフックを作成するには

認証情報の保存 AWS Secrets Manager には を使用することを強くお勧めします。Secrets Manager を使用する場合は、Secrets Manager でシークレットパラメータをすでに設定して保存しておく必要があります。この例では、 GitHubウェブフックの認証情報に Secrets Manager への動的参照を使用します。詳細については、「動的な参照を使用してテンプレート値を指定する」を参照してください。

重要

シークレットパラメータを渡すときは、値をテンプレートに直接入力しないでください。値はプレーンテキストとしてレンダリングされるため、読み取り可能です。セキュリティ上の理由から、テンプレートにプレーンテキストを使用して認証情報 AWS CloudFormation を保存しないでください。

CLI または を使用してパイプライン AWS CloudFormation を作成し、ウェブフックを追加する場合は、定期的なチェックを無効にする必要があります。

注記

定期的なチェックを無効にするには、以下の最終的な手順に詳述するとおり、PollForSourceChanges パラメータを明示的に追加して false に設定する必要があります。それ以外の場合、 CLIまたは AWS CloudFormation パイプラインのデフォルトはPollForSourceChangesデフォルトで true になり、パイプライン構造の出力には表示されません。 PollForSourceChanges デフォルトの詳細については、「」を参照してくださいPollForSourceChanges パラメータの有効な設定

  1. テンプレートの Resources に、パラメータを追加します。

    YAML
    Parameters: GitHubOwner: Type: String ...
    JSON
    { "Parameters": { "BranchName": { "Description": "GitHub branch name", "Type": "String", "Default": "main" }, "GitHubOwner": { "Type": "String" }, ...
  2. AWS::CodePipeline::Webhook AWS CloudFormation リソースを使用してウェブフックを追加します。

    注記

    指定した TargetAction は、パイプラインで定義したソースアクションの Name プロパティと一致する必要があります。

    RegisterWithThirdParty が に設定されている場合true、 に関連付けられたユーザーが で必要なスコープを設定OAuthTokenできることを確認します GitHub。トークンとウェブフックには、次の GitHub スコープが必要です。

    • repo - パブリックおよびプライベートリポジトリからパイプラインにアーティファクトを読み込んでプルする完全制御に使用されます。

    • admin:repo_hook - リポジトリフックの完全制御に使用されます。

    それ以外の場合、 は 404 GitHub を返します。返される 404 の詳細については、「https://help.github.com/articles/about-webhooks」を参照してください

    YAML
    AppPipelineWebhook: Type: AWS::CodePipeline::Webhook Properties: Authentication: GITHUB_HMAC AuthenticationConfiguration: SecretToken: {{resolve:secretsmanager:MyGitHubSecret:SecretString:token}} Filters: - JsonPath: "$.ref" MatchEquals: refs/heads/{Branch} TargetPipeline: !Ref AppPipeline TargetAction: SourceAction Name: AppPipelineWebhook TargetPipelineVersion: !GetAtt AppPipeline.Version RegisterWithThirdParty: true ...
    JSON
    "AppPipelineWebhook": { "Type": "AWS::CodePipeline::Webhook", "Properties": { "Authentication": "GITHUB_HMAC", "AuthenticationConfiguration": { "SecretToken": "{{resolve:secretsmanager:MyGitHubSecret:SecretString:token}}" }, "Filters": [{ "JsonPath": "$.ref", "MatchEquals": "refs/heads/{Branch}" }], "TargetPipeline": { "Ref": "AppPipeline" }, "TargetAction": "SourceAction", "Name": "AppPipelineWebhook", "TargetPipelineVersion": { "Fn::GetAtt": [ "AppPipeline", "Version" ] }, "RegisterWithThirdParty": true } }, ...
  3. 更新されたテンプレートをローカルコンピュータに保存し、 AWS CloudFormation コンソールを開きます。

  4. スタックを選択し、[既存スタックの変更セットの作成] を選択します。

  5. テンプレートをアップロードし、 AWS CloudFormationに示された変更を表示します。これらがスタックに加えられる変更です。新しいリソースがリストに表示されています。

  6. [実行] を選択します。

パイプラインの PollForSourceChangesパラメータを編集するには
重要

このメソッドを使用してパイプラインを作成すると、PollForSourceChanges パラメータはデフォルトで true になります (ただし、明示的に false に設定した場合は除きます)。イベントベースの変更検出を追加する場合は、このパラメータを出力に追加する必要があります。ポーリングを無効にするには、このパラメータを false に設定します。そうしないと、1 つのソース変更に対してパイプラインが 2 回起動されます。詳細については、「PollForSourceChanges パラメータの有効な設定」を参照してください。

  • テンプレートで、PollForSourceChangesfalse に変更します。パイプライン定義に PollForSourceChanges が含まれていなかった場合は、追加して false に設定します。

    この変更を行う理由 このパラメータを false に変更すると、定期的チェックがオフになるため、イベントベースの変更検出のみ使用することができます。

    YAML
    Name: Source Actions: - Name: SourceAction ActionTypeId: Category: Source Owner: ThirdParty Version: 1 Provider: GitHub OutputArtifacts: - Name: SourceOutput Configuration: Owner: !Ref GitHubOwner Repo: !Ref RepositoryName Branch: !Ref BranchName OAuthToken: {{resolve:secretsmanager:MyGitHubSecret:SecretString:token}} PollForSourceChanges: false RunOrder: 1
    JSON
    { "Name": "Source", "Actions": [{ "Name": "SourceAction", "ActionTypeId": { "Category": "Source", "Owner": "ThirdParty", "Version": 1, "Provider": "GitHub" }, "OutputArtifacts": [{ "Name": "SourceOutput" }], "Configuration": { "Owner": { "Ref": "GitHubOwner" }, "Repo": { "Ref": "RepositoryName" }, "Branch": { "Ref": "BranchName" }, "OAuthToken": "{{resolve:secretsmanager:MyGitHubSecret:SecretString:token}}", PollForSourceChanges: false }, "RunOrder": 1 }]

を使用してこれらのリソースを作成すると AWS CloudFormation、定義されたウェブフックが指定された GitHub リポジトリに作成されます。パイプラインはコミット時にトリガーされます。

YAML
Parameters: GitHubOwner: Type: String Resources: AppPipelineWebhook: Type: AWS::CodePipeline::Webhook Properties: Authentication: GITHUB_HMAC AuthenticationConfiguration: SecretToken: {{resolve:secretsmanager:MyGitHubSecret:SecretString:token}} Filters: - JsonPath: "$.ref" MatchEquals: refs/heads/{Branch} TargetPipeline: !Ref AppPipeline TargetAction: SourceAction Name: AppPipelineWebhook TargetPipelineVersion: !GetAtt AppPipeline.Version RegisterWithThirdParty: true AppPipeline: Type: AWS::CodePipeline::Pipeline Properties: Name: github-events-pipeline RoleArn: !GetAtt CodePipelineServiceRole.Arn Stages: - Name: Source Actions: - Name: SourceAction ActionTypeId: Category: Source Owner: ThirdParty Version: 1 Provider: GitHub OutputArtifacts: - Name: SourceOutput Configuration: Owner: !Ref GitHubOwner Repo: !Ref RepositoryName Branch: !Ref BranchName OAuthToken: {{resolve:secretsmanager:MyGitHubSecret:SecretString:token}} PollForSourceChanges: false RunOrder: 1 ...
JSON
{ "Parameters": { "BranchName": { "Description": "GitHub branch name", "Type": "String", "Default": "main" }, "RepositoryName": { "Description": "GitHub repository name", "Type": "String", "Default": "test" }, "GitHubOwner": { "Type": "String" }, "ApplicationName": { "Description": "CodeDeploy application name", "Type": "String", "Default": "DemoApplication" }, "BetaFleet": { "Description": "Fleet configured in CodeDeploy", "Type": "String", "Default": "DemoFleet" } }, "Resources": { ... }, "AppPipelineWebhook": { "Type": "AWS::CodePipeline::Webhook", "Properties": { "Authentication": "GITHUB_HMAC", "AuthenticationConfiguration": { "SecretToken": { "{{resolve:secretsmanager:MyGitHubSecret:SecretString:token}}" } }, "Filters": [ { "JsonPath": "$.ref", "MatchEquals": "refs/heads/{Branch}" } ], "TargetPipeline": { "Ref": "AppPipeline" }, "TargetAction": "SourceAction", "Name": "AppPipelineWebhook", "TargetPipelineVersion": { "Fn::GetAtt": [ "AppPipeline", "Version" ] }, "RegisterWithThirdParty": true } }, "AppPipeline": { "Type": "AWS::CodePipeline::Pipeline", "Properties": { "Name": "github-events-pipeline", "RoleArn": { "Fn::GetAtt": [ "CodePipelineServiceRole", "Arn" ] }, "Stages": [ { "Name": "Source", "Actions": [ { "Name": "SourceAction", "ActionTypeId": { "Category": "Source", "Owner": "ThirdParty", "Version": 1, "Provider": "GitHub" }, "OutputArtifacts": [ { "Name": "SourceOutput" } ], "Configuration": { "Owner": { "Ref": "GitHubOwner" }, "Repo": { "Ref": "RepositoryName" }, "Branch": { "Ref": "BranchName" }, "OAuthToken": "{{resolve:secretsmanager:MyGitHubSecret:SecretString:token}}", "PollForSourceChanges": false }, "RunOrder": 1 ...