AWSアカウントをまたいで、CodePipelineを作成するときに必要な設定

# 目的
わからずにサポートに問い合わせをしたので、備忘録としてメモ。

# 経緯
こういうアカウントをまたいだCodePipelineを作成しようとしたときに、いくらGit PushしてもCodePipeLineが起動しなかった。
ググってでてきたサンプル通りに作ったのにだめでした・・・
![aaa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478113/62335eb1-1a16-f728-f342-86b49cd9389d.png)

# 解決
CloudWatch Events のイベントバスの機能を使用することで解決。
イベントバスを設定することでA環境とB環境がつながる。
※CodePipeLineは、ポーリングでCodePipelineの変更を検知するのではなく、CloudWatch Eventsを使用して検知することを推奨しているので、CloudWatch Eventsを使用して行う方法。
## CodePipeLineを作成する環境(B環境)
### イベントパスを追加
・CloudWatch コンソール画面左のメニューより [イベントバス] を選択。
・[アクセス許可を追加]ボタンを押下
![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478113/f6c1c3df-24ef-e05f-9df0-0db6e6960ad7.png)

・タイプにAWSアカウントを選択し、CodecommitがあるアカウントのIDを入力して、[追加]ボタンを押下。
![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478113/a1bf5510-8190-d255-54d6-cd27e1f62262.png)

### CloudWatch Eventsを追加
・下記のように入力して追加。
![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478113/cf18c51a-280c-32b4-d54b-fbd75d20f9c8.png)

2019/09/30 追記
上記のままだと、リポジトリに関係なくA環境のCodeCommitにpushされたらCodePipelineが動いてしまう。
イベントパターンを編集して、対象のリポジトリのARNを指定が必要です。
下記のようにresourcesに指定する。

```json
{
  "source": [
    "aws.codecommit"
  ],
  "resources": [
    "arn:aws:codecommit:ap-northeast-1:XXXXXXXXXXXX:XXXXXXXXX"
  ],
  "detail-type": [
    "CodeCommit Repository State Change"
  ]
}
```

2019/10/08 追記
ブランチ名も指定したい場合、下記のようにdetailを設定する。
「ブランチ名」の箇所に指定したいブランチ名を指定する。

```json
{
  "source": [
    "aws.codecommit"
  ],
  "resources": [
    "arn:aws:codecommit:ap-northeast-1:XXXXXXXXXXXX:XXXXXXXXX"
  ],
  "detail-type": [
    "CodeCommit Repository State Change"
  ],
  "detail": {
    "referenceType": [
      "branch"
    ],
    "referenceName": [
      "ブランチ名"
    ]
  }
}
```

## Codecommitがある環境(A環境)
### CloudWatch Eventsを追加
・下記のように入力して追加。アカウントIDは、CodePipeLineがある環境のアカウントIDを指定する。
![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478113/4b4bbee2-223a-cd52-19aa-bbef9cdcc4dc.png)

# 最後に
CodePipeLineの設定はセミナーとかで聞くと簡単そうですが、実際にやってみるとわからないことだらけで大変ですね・・・
CodeBuildの設定でも苦労してるのに・・・

# 参考資料(サポートが提供してくれたリンク)
[1] 定期的なチェックを使用してパイプラインを開始する - CodePipeline https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/run-automatically-polling.html
\===(抜粋)===========================================
リポジトリの変更が検出されると、パイプラインが自動的に開始されます。変更検出方法のひとつに、定期的なチェックがあります。PollForSourceChanges フラグを使用すると、定期的なチェックを有効あるいは無効にできます。CLI を使用して、パイプラインを作成または編集する場合、このパラメータはデフォルトで true に設定されます。この設定は推奨されません。代わりに、推奨される変更検出方法を使用するようにパイプラインを編集し、このパラメータを false に設定します。
\====================================================

[2] パイプラインを編集してプッシュイベントを使用する - CodePipeline https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/update-change-detection.html
\===(抜粋)===========================================
AWS CodePipeline は、完全なエンドツーエンドの継続的デリバリーをサポートしています。このサービスでは、コードの変更があると、パイプラインが開始されます。コードが変更されたときにパイプラインを開始する方法は 2 つあります。

・イベント (Amazon CloudWatch Events またはウェブフック)
・ポーリング (定期的に確認)

当初は、ポーリングのみがサポートされていました。イベントは、コードが変更されたときにパイプラインを開始するためのデフォルトの推奨方法です。
\====================================================

[3] AWS アカウント間のイベントの送受信 - Amazon CloudWatch Events https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/events/CloudWatchEvents-CrossAccountEventDelivery.html

[4] CodeCommit ソースの CloudWatch イベント ルールを作成する (コンソール) - CodePipeline https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/pipelines-trigger-source-repo-changes-console.html