【AWS】CodePipeline未サポートの大阪リージョンにCodePipelineでデプロイする方法

# はじめに

本記事では、CodePipelineがサポートされていない大阪リージョンにCodePipelineを用いてデプロイする方法を紹介します。

* **サマリ**
  * **大阪リージョンはCodePipeline未サポート（2022/04/10時点）**
  * **クロスリージョンアクションは対象リージョンがCodePipelineをサポートしている必要がある**
  * **大阪リージョンにデプロイする場合、CodeBuildを介してデプロイする**


# 大阪リージョンはCodePipeline未サポート

2021年3月に大阪リージョンがフルリージョン化されました。

https://aws.amazon.com/jp/local/osaka-region/

これにより、**国内リージョンのみでDR (Disaster Recovery) サイトの構築が可能**となりました。
海外リージョンの使用が禁止されている、かつ、DRサイトの構築が求められる要件等においては、ありがたい話です。

しかし、フルリージョン化と言っても、すべてのサービスが提供されているわけではありません。
**東京リージョンでは提供されているが、大阪リージョンでは提供されていないサービスは意外とたくさんあります。**
以下の記事に比較的新しい情報が掲載されています。（感謝）

https://dev.classmethod.jp/articles/list-of-service-differences-between-tokyo-region-and-osaka-region/

残念ながら、本記事のテーマである**CodePipelineも大阪リージョンでは提供されていません。**（2022/04/10時点）


# 解決案

大阪リージョンはCodePipeline未サポートですが、DR (Disaster Recovery) サイトの構築等、東京リージョンと同等の環境を大阪リージョンにもデプロイしたいケースはあります。

そこで解決案を考えてみました。

* **案①：大阪リージョンにCodePipelineを構築する**
* **案②：東京リージョンのCodePipelineから大阪リージョンにクロスリージョンデプロイする**
* **案③：東京リージョンのCodePipelineからCodeBuildを介して大阪リージョンにデプロイする**


## 案①：大阪リージョンにCodePipelineを構築する

前述のとおり、大阪リージョンはCodePipeline未サポートのため、この案は実現不可です。
ただし、今後、サポートされる可能性はあるため、案として挙げておきます。


## 案②：東京リージョンのCodePipelineから大阪リージョンにクロスリージョンデプロイする

CodePipelineには**クロスリージョンアクション**という機能があります。
名前が示すとおり、パイプラインを作成したリージョンとは別のリージョンに対してアクションを実行する機能です。

https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/actions-create-cross-region.html

結論から言うと、**この方法では大阪リージョンにデプロイすることはできません。**
CodePipelineのクロスリージョンアクションは、アクションを実行するリージョンがCodePipelineをサポートしている必要があるため、**CodePipelineをサポートしていない大阪リージョンを対象とした場合、エラーになります。**

### 検証してみた

#### CodePipelineがサポートされているリージョンの場合（バージニア北部リージョン）

デプロイ先リージョンがCodePipelineをサポートしているバージニア北部リージョンの場合、パイプラインを作成することができ、期待通りにデプロイもできました。

![cross_region_deploy_virsinia.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2443303/4636d1ad-86f9-131d-bae6-1334df907e85.png)


#### CodePipelineがサポートされていないリージョンの場合（大阪リージョン）

マネジメントコンソールからデプロイ先リージョンの変更しようとしたところ、**選択肢に大阪リージョンがありません。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2443303/df3c2c61-c5ee-9ebf-6986-b58740bc28ea.png)

CLIではどうでしょうか？
[update-pipeline](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/codepipeline/update-pipeline.html)コマンドを用いて、デプロイ先リージョンを大阪リージョンに変更しようとしたところ、**以下のエラーが発生しました。**

```The region ap-northeast-3 specified in 'pipeline.artifactStores' is not a valid AWS Region.```

やはり、CodePipelineをサポートしていないリージョンに対するクロスリージョンアクションは設定できないようです。


## 案③：東京リージョンのCodePipelineからCodeBuildを介して大阪リージョンにデプロイする

残念ながら案①と案②もNGでした。
案③は、東京リージョンのCodePipelineからCodeBuildを介してCLIでデプロイする案です。
**この案は実現可能です。**

### 検証してみた

方法はシンプルです。
CodeBuildを介して、[cloudformation deploy](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/cloudformation/deploy/index.html)コマンドにより、リージョンを指定してCloudFormationをデプロイするだけです。
以下のbuildspecでは、対象リージョン、スタック名、バケット名をパラメータとして、環境変数から取得しています。

```yaml:buildspec.yaml
version: 0.2

phases:
  install:
    runtime-versions:
      python: 3.8

  build:
    commands:
      - echo ${TARGET_REGION}
      - echo ${STACK_NAME}
      - echo ${BUCKET_NAME}

      # Deploy CloudFormation
      - |
        aws cloudformation deploy \
          --template-file ./cloudformation/template/main.yaml \
          --stack-name ${STACK_NAME} \
          --s3-bucket ${BUCKET_NAME} \
          --region ${TARGET_REGION}
```

![cross_region_deploy_osaka.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2443303/3ee5c9aa-ccae-cca1-3859-fcf1e15bbd91.png)

CodeBuildを介して、大阪リージョンにデプロイすることができました。


# まとめ

* **大阪リージョンはCodePipeline未サポート（2022/04/10時点）**
* **クロスリージョンアクションは対象リージョンがCodePipelineをサポートしている必要がある**
* **大阪リージョンにデプロイする場合、CodeBuildを介してデプロイする**

というわけで、CodePipelineから大阪リージョンにデプロイするには、CodeBuildを介してCLIでデプロイする必要がある、という話でした。
もしくは、別のCI/CDツールを使用するか、ですね。

なかなかニッチな内容、かつ、今後、CodePipelineが大阪リージョンでもサポートされたらお役御免になる内容でしたが、少しでもどなたかの役に立てば幸いです。