Codepipeline クロスアカウント 対応 Ch.1


## これは何?

最近複数アカウントでのCodeSeriesの導入方法を個人的にまとめてみました。
シリーズものであり、クロスアカウントから始まり、マルチアカウント・マルチリージョンにも適応したものを共有していく予定です。



本日のゴールとしては、**クロスアカウントでのCI/CDパイプラインの構築**となります. 

完成予想図は以下の通り.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872532/0738182b-31e5-a86c-e74b-1028c439f20e.png)


また、シリーズものなので以下の内容についてもよろしければチェックのほどお願いします！

- Codepipeline クロスリージョン対応 Ch.2  
- Codepipeline マルチアカウント & マルチリージョン対応 Ch.3  

## シナリオ

今回は以下のシナリオで実行したいと思います。

### アカウントについて

アカウントは、以下2つのアカウントを用意。それぞれの役割は以下の通り。
- **開発者向けアカウント(Developer Account)** ... 開発者がよく使うアカウント。リポジトリなどを配置。
- **サービス用アカウント(Account A)** ... サービスを実行するアカウント. Codepipeline を実行し, 各種リソースにデプロイする.


### 各種リソース

各種リソースでは以下の内容を最低限設定する必要があります。
IAMやS3、KMSについてはクロスアカウントの設定を忘れずに。

- **開発者向けアカウント(Developer Account)**

| リソース | 役割 |
| --- | --- |
|CodeCommit | 開発者向けアカウント上で作成. |
|アーティファクト格納用IAMロール | Account AのCodepipeline用ロールからAssumeRoleされる. CodeCommit のソースを アーティファクト用S3バケットにPutObjectする権限を付与.|

- **サービス用アカウント(Account A)**

| リソース | 役割 |
| --- | --- |
|Codepipeline |Account A上で作成. CLIで作成(後述). |
|Codebuild  |Codebuild プロジェクトをAccount A上で作成.デフォルト設定. |
|S3バケット |Source & Build アーティファクト用. バケットポリシーでDeveloper Accountからのアクセスを許可. |
|KMSキー | KMSキー. キーポリシーでDeveloper Accountからのアクセスを許可. |
|Codepipeline用IAMロール |デフォルで設定するポリシー + アーティファクト格納用ロールへAssumeRole権限. KMSへのアクセス権限. |
|CodeBuild用IAMロール |デフォルで設定するポリシー + KMSへのアクセス権限. |



## 構築テンプレート


### codepipelineの作成
Codepipeline用のjsonファイルは以下の通りとなります。
json内の「<< 〇〇 >>」で始まる部分をそれぞれ設定したパイプライン名に置き換えてください。

```json:pipeline.json
 {
     "pipeline": {
         "name": "<<Codepipeline名>>",
         "roleArn": "<<Codepipeline用IAMロール>>",
         "artifactStores": {
             "ap-northeast-1": {
                 "type": "S3",
                 "location": "<<S3バケット>>",
                 "encryptionKey": {
                     "id": "<<KMSキーArn>>", 
                     "type": "KMS"
                 }
             }
         },
         "stages": [
             {
                 "name": "Source",
                 "actions": [
                     {
                         "name": "Source",
                         "actionTypeId": {
                             "category": "Source",
                             "owner": "AWS",
                             "provider": "CodeCommit",
                             "version": "1"
                         },
                         "runOrder": 1,
                         "configuration": {
                             "OutputArtifactFormat": "CODE_ZIP",
                             "PollForSourceChanges": "true",
                             "RepositoryName": "<<CodeCommitリポジトリ名>>"
                         },
                         "outputArtifacts": [
                             {
                                 "name": "SourceArtifact"
                             }
                         ],
                         "inputArtifacts": [],
                         "roleArn": "<<アーティファクト格納用IAMロール>>",
                         "region": "ap-northeast-1",
                         "namespace": "SourceVariables"
                     }
                 ]
             },
             {
                 "name": "Build",
                 "actions": [
                     {
                         "name": "Build",
                         "actionTypeId": {
                             "category": "Build",
                             "owner": "AWS",
                             "provider": "CodeBuild",
                             "version": "1"
                         },
                         "runOrder": 1,
                         "configuration": {
                             "PrimarySource": "SourceArtifact",
                             "ProjectName": "<<Codebuild名>>",
                             "EnvironmentVariables": "[]" 
                         },
                         "outputArtifacts": [
                             {
                                 "name": "BuildArtifact"
                             }
                         ],
                         "inputArtifacts": [
                             {
                                 "name": "SourceArtifact"
                             }
                         ],
                         "region": "ap-northeast-1",
                         "namespace": "BuildVariables"
                     }
                 ]
             }
         ]
     }
 }
```

修正が完了したらCLIで以下のコマンドを実行します。
```bash 
aws codepipeline create-pipeline --pipeline file://pipeline.json
```
また、上記ではなく手動で設定してみて[get-pipeline](https://docs.aws.amazon.com/cli/latest/reference/codepipeline/get-pipeline.html)コマンドでjson出力してから各種設定を加える方も楽かもしれません。

これでクロスアカウント経由でCI/CDパイプラインを実行することができます。


## 終わりに
今回はクロスアカウントでのCI/CDパイプラインの構築を実施しました。
後続のクロスリージョンなどのch2, ch3 の記事もよろしければ確認いただければ幸いです。

- Codepipeline クロスリージョン対応 Ch.2  
- Codepipeline マルチアカウント & マルチリージョン対応 Ch.3