[AWS][CI/CD]BitbucketからビルドしてS3への自動デプロイ

CodePipelineを使ってBitbucketからS3への自動デプロイした手順の忘備録。
あとソースファイルがGitHubでもデプロイ先がEC2でもそんなに手順変わらないと思う。

公式のチュートリアル↓
[チュートリアル 使用するパイプラインを作成する Amazon S3 導入プロバイダーとして - AWS CodePipeline](https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/tutorials-s3deploy.html)

## 事前準備

- Bitbucketレポジトリの作成
- S3バケットの作成

## CodePipelineの作成

### CodePipelineにアクセスしてパイプライを作成をクリック
サービス > [CodePipeline]
(https://ap-northeast-1.console.aws.amazon.com/codesuite/codepipeline/pipelines?region=ap-northeast-1) へアクセス
リージョンを**東京**に選択したのち、パイプラインを作成をクリックする。
(ここでリージョンを選択し忘れて再作成したら、ロールのリージョンが違って権限拒否されたりして酷い目にあった・・・)
![スクリーンショット 2020-12-25 17.43.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140953/d1642021-36ac-df3d-7938-993656697496.png)

### パイプラインの設定を選択する
パイプライン名を入力する。
それ以外はデフォルトで次に。
![スクリーンショット 2020-12-25 17.45.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140953/7256bded-bbeb-f50e-dc2d-9b3429d7ba50.png)


### ソースステージを追加する
Bitbucketを選択すると、以下のような画面が表示される。
Bitbucketに接続をクリック。
![スクリーンショット 2020-12-25 17.17.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140953/e4b7fb08-a702-26f7-73a8-d33a6f6a1ecf.png)

### Bitbucketに接続する
接続名を入力して、Bitbucketに接続をクリック。
![スクリーンショット 2020-12-25 17.56.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140953/f8dc214e-abda-91e0-7ffa-ba37ed81c175.png)
ローディング表示がされないけど(多分バグだと思う)、しばらく経つと次の画面に行く。

![スクリーンショット 2020-12-25 17.56.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140953/f115ef73-2be9-e33a-b1d4-cad3559cd018.png)
新しいアプリをインストールするをクリック。

### 新しいアプリをインストールする
接続したいワークスペース管理者の名前を選択して、アクセスを許可するをクリック。
(ワークスペース管理者じゃないとリポジトリ接続できない)
![スクリーンショット 2020-12-25 17.58.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140953/3d9eb4c7-8dae-c397-370c-9cd229f1f1e9.png)

前の画面に戻るので、必要な情報を入力する。
リポジトリ名に候補が表示されない場合、手打ちで入力すると接続できたりする。(しばらくこれに気づかなくて試行錯誤してた・・・)
![スクリーンショット 2020-12-25 18.03.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140953/0a433781-3767-78e1-6f7f-e7e1b52bceb1.png)

次にをクリック。

### ビルドステージを追加する
**※特にビルドするものがない場合、ビルドステージはスキップできる。**

AWS CodeBuildを選択すると、以下のような画面が表示される。
プロジェクトを作成するをクリック。
![スクリーンショット 2020-12-25 18.04.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140953/67e470f7-e500-53ae-083b-122f58f327f0.png)

### CodeBuildの作成
プロジェクト名を入力する。
![スクリーンショット 2020-12-25 18.07.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140953/7f0d36f9-f4da-2212-8665-02f7762b6b86.png)

ビルドを実行するためのイメージを選択する。
OSは執筆時点でAmazon Linux2とubuntuが選べる。好きなの選べばいいと思う。
![スクリーンショット 2020-12-25 18.09.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140953/0a761aa1-af8b-cc9a-5201-c446b5a00a35.png)

それ以外はデフォルト。

![スクリーンショット 2020-12-25 18.11.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140953/47e9cc6a-306b-25b3-7aa8-8a2523b7fe26.png)
![スクリーンショット 2020-12-25 18.11.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140953/4ad2434f-73eb-0b08-e065-0ecc729c56ed.png)

CodePipelineに進むをクリック。
すると前の画面に戻るので次にをクリック。

### デプロイステージを追加する
Amazon S3、リージョン、バケットを入力して**デプロイする前にファイルを抽出するをチェック**する。(これをチェックしないと展開されずにzipファイルが出力されてしまう)
次にをクリック。
![スクリーンショット 2020-12-25 18.15.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140953/dad40492-40bf-8454-05fa-042225bd2e42.png)

確認画面が表示される。
パイプラインを作成するをクリック。
![スクリーンショット 2020-12-25 18.17.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140953/80678472-04e6-9e2d-1268-4e21a2271d10.png)

# ビルド&デプロイしてみる

## ビルド設定ファイルの作成

ビルドのための設定ファイル**buildspec.yml**をプロジェクトのルートディレクトリに作成する。
記事では省略したけど、実際にはCloudFrontも使ってたのでディストリビューションのキャッシュ削除の処理を入れた。

ファイルの書き方は一般的なCI設定と同じような感じ。
artifactsでデプロイしたいファイルを指定する。今回は全てのファイル。
環境変数はAWSコンソールのCodePipelineもしくはCodeBuildの画面から設定できる。

```buildspec.yml
version: 0.2

phases:
  build:
    commands:
      - echo Build started on `date`
      - aws cloudfront create-invalidation --distribution-id ${DISTRIBUTION_ID} --paths "/*"
artifacts:
  files:
    - '**/*'
```

## リモートリポジトリにPush

上記をコミットしてGitbuketのリモートリポジトリにgit pushする。

## デプロイされているかを確認
[CodePipeline]
(https://ap-northeast-1.console.aws.amazon.com/codesuite/codepipeline/pipelines?region=ap-northeast-1) へアクセスし、履歴を確認する。
![スクリーンショット 2020-12-25 18.57.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140953/f9bd2203-354e-f21f-49fb-3d6089f190ff.png)

成功したら、[S3](https://s3.console.aws.amazon.com/s3/buckets/test-pipeline-bitbucket?region=ap-northeast-1&tab=objects)へデプロイされているか確認。

![スクリーンショット 2020-12-25 18.58.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140953/6616e700-762c-bdc7-36e1-c2320c660856.png)
OK。

これでgit pushするたびにビルド&デプロイされるようになります。

おしまい。

## 追記
なんか情報少ないなーと思ったら、2020/11に機能追加したばっかりだったみたいです。
[AWS CodeCommit の AWS CodePipeline ソースアクションで git クローンのサポートを開始](https://aws.amazon.com/jp/about-aws/whats-new/2020/11/aws-codepipeline-source-action-aws-codecommit-supports-git-clone/)