CodePipelineによるlambdaの自動リリースのメモ(未来の自分のコピペ用)

# はじめに
自分用のメモとして作りました
python 3.8 の hello world を返す lambda を2つリリースします

# 手順
1. [githubのリポジトリ](https://github.com/lnsw/sample-lambda-release)をフォークする
2. AWSのマネジメントコンソールでパイプラインを作る
3. lambdaがリリースされるのを確認する

# 注意
CodePipelineは従量制の課金です！
無料枠でも100回を越えると課金されます

# 前提
AWSのアカウントがあること
githubのアカウントがあること

# 詳細
## 1. githubのリポジトリをフォークする
githubにログインして、赤線の所をクリックするとforkできます
https://github.com/lnsw/sample-lambda-release
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128663/4494d19f-29c7-ee5a-39bb-70f718af467f.png)

## 2. AWSのマネジメントコンソールでパイプラインを作る
下記の6つのステップがあります
1. 新規のパイプラインを作成する
2. ソースステージを追加する
3. ビルドステージを追加する
4. デプロイステージを追加する
5. レビュー
6. 調整

### 1. 新規のパイプラインを作成する
https://us-west-1.console.aws.amazon.com/codesuite/codepipeline/pipeline/new?region=us-west-1 (このリンクは北カルフォルニアです)

- パイプライン名に sample-lambda-release を入力します
- 次にを押します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128663/bbb1c51b-33c5-72ad-0e20-ae2faad592c0.png)

### 2.ソースステージを追加する
ソースは github になります
- GitHub (Version 1) を選択します
- GitHubに接続は、説明を省いてすいませんがなんとかうまいぐあいにやってください
- リポジトリはフォークした自分のsample-lambda-release を選択
- ブランチは master を選択
- 次にを押します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128663/69ef8263-3054-d34d-bc10-5e2af523e069.png)

### 3. ビルドステージを追加する
ここはプロジェクトの設定もあって少し長いです

- AWS CodeBuild を選択します
- リージョンは自動で入ります
- プロジェクト名は、プロジェクトを作成するを押して別のウィンドウに移ります

#### プロジェクトの設定
- sample-lambda-release を入力します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128663/dda5b7c3-ab09-f787-3f02-7e676eb9cd3d.png)

#### 環境
よくわからないですが最新のを選択するようです
- マネージド型イメージ
- ubuntu
- Standard
- aws/codebuild/standard:4.0
- aws/codebuild/standard:4.0-20.09.14 (最新の)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128663/e2eb8314-2321-77c2-c38f-68fccc82b571.png)

#### Buildspec、バッチ設定、ログ
- 特に何も入力せずに「CodePipelineに進む」を押します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128663/cc0f9e33-21f9-65a2-7db9-3ee6701baaca.png)

---
パイプラインの作成に戻ってきます
- S3バケットを1つ作ります。名前は何でもいいです。例)sample-lambda-release-backet-(ユーザー名)等(※1)
- 環境変数 - オプショナル で環境変数の追加を押します
- それから S3_ARTIFACT_BUCKET と作ったバケット名を入力します
- 次に を押します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128663/a3ede6f5-3fed-b7db-1eb9-694bb720490b.png)

### 4. デプロイステージを追加する
- デプロイステージの前にIAMでパイプライン用のロールを1つ作ります

1. ロールの作成 で ユースケースの選択でCloudFormationを選ぶ
2. Attach アクセス権限ポリシー で 4つのポリシーを `AWSCloudFormationFullAccess` `AWSLambdaFullAccess` `AmazonAPIGatewayAdministrator` `IAMFullAccess` をアタッチします (とりあえず動かすのを優先のためで、正式に利用するなら適切な権限にします)
3. 名前はsample-lambda-release-deploy-role として作成する

- デプロイステージに戻って デプロイプロバイダーに AWS Cloudformatin を選択します
- アクションモードは スタックを作成または更新する を選びます
- スタック名は sample-lambda-release
- テンプレートのアーティファクトは BuildArtifact 、ファイル名は packaged.yml を入力します
- 能力 - オプショナル は3つ選びます。CAPABILITY_IAM 、 CAPABILITY_NAMED_IAM 、 CAPABILITY_AUTO_EXPAND
- ロール名は、さきほど作ったパイプライン用のロールのARNを入力します(画面を表示した後に作ったロールは選択できないっぽいです)
- 次に を押します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128663/642c20bf-e7fb-cffb-5b98-e88bcebbef0f.png)


### 5. レビュー
- パイプラインを作成する を押します

### 6. 調整
このままだとビルドステージでエラーになるので1つ修正をします
<details><summary>こんなエラーです</summary><div>
ビルドログのエラー

```
Error: Unable to upload artifact hello_world/ referenced by CodeUri parameter of HelloWorldFunction resource.
An error occurred (AccessDenied) when calling the PutObject operation: Access Denied
```
</div>
フェーズ詳細のエラー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128663/fed94517-dcaf-23cf-e08f-f183298be655.png)

#### ビルドステージのロールの権限
ビルドステージで新規のロールを作成しましたが(sample-lambda-release で絞るとでてきます)
IAMでこのロールに「AmazonS3FullAccess」をアタッチします
(とりあえずリリースできる事を優先しました。※1で作ったS3バケットへの権限だけで設定するのが安全です)
<details><summary>こんな感じ</summary><div>

```CodeBuildで作成したRole
        {
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::codepipeline-us-west-1-*",
                "arn:aws:s3:::sample-lambda-release-backet-(ユーザー名)等",
                "arn:aws:s3:::sample-lambda-release-backet-(ユーザー名)等/*"
            ],
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:GetObjectVersion",
                "s3:GetBucketAcl",
                "s3:GetBucketLocation"
            ]
        },
```
</div>
<details>

## 3. lambdaがリリースされるのを確認する
- 変更をリリースする を押して待ちます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128663/281f8eda-653c-1d66-e2a3-a8432c417d28.png)

- 10分もしないうちに lambda がリリースされます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128663/6ced5261-169b-e41c-59b8-5e5ead211f5f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128663/7cce4da5-56ed-dc88-46a6-e6e09093e332.png)

---
以上です

あとは sample-lambda-releas リポジトリにある hello_worldの中のapp.py を変更したり、template.yml にAPIGateway や cloudfront や DynamoDB とかを追加して、リポジトリにプッシュすれば、自動でリリースされます

# 残課題
- APIGateway を追加する
- Deploy のロールを適切にする
- CodePipelineを作る、Cloudformation のテンプレートを作る