CodePipelineの環境設定の備忘録

タイトルははじめてのCodePiplineでもよかったです。
cloudformationでは初回はWebhookが失敗するのでawscliでTorken差し変えが要るようでした。
全体的に初回だけ必要な作業で、次回からはpushするだけで動くように。

SourceはGithubでCodeBuildでビルドしたアーティファクトをecrに置いてそれをECSにデプロイするという流れのPiplineです。

#####・awsのクレデンシャルを用意する

```
# vi ~/.aws/config 
[profile myaccount]
output = json
region = ap-northeast-1
# vi ~/.aws/credentials 
[myaccount]
aws_access_key_id = **************
aws_secret_access_key = **************
```
#####・dockerいれて起動しておく

```
# yum install docker
# systemctl start docker
# systemctl status docker
```
※ビルド環境はCentOS7でawscliは導入済み

#####・ecrリポジトリを用意してアドレスを控え、ログインしておく

リポジトリ自体はCloudFormationでつくっておいた。

```
# aws ecr describe-repositories --profile myaccount|grep stg
            "repositoryName": "ecr-prj1-nginx-stg", 
            "repositoryArn": "arn:aws:ecr:ap-northeast-1:<awsaccount-num>:repository/ecr-prj1-nginx-stg", 
            "repositoryUri": "<awsaccount-num>.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-prj1-nginx-stg"
            "repositoryName": "ecr-myaccount-fluentd-prj2-stg", 
            "repositoryArn": "arn:aws:ecr:ap-northeast-1:<awsaccount-num>:repository/ecr-myaccount-fluentd-prj2-stg", 
            "repositoryUri": "<awsaccount-num>.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-myaccount-fluentd-prj2-stg"
            "repositoryName": "ecr-prj1-php-stg", 
            "repositoryArn": "arn:aws:ecr:ap-northeast-1:<awsaccount-num>:repository/ecr-prj1-php-stg", 
            "repositoryUri": "<awsaccount-num>.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-prj1-php-stg"
            "repositoryName": "ecr-prj2-nginx-stg", 
            "repositoryArn": "arn:aws:ecr:ap-northeast-1:<awsaccount-num>:repository/ecr-prj2-nginx-stg", 
            "repositoryUri": "<awsaccount-num>.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-prj2-nginx-stg"
            "repositoryName": "ecr-myaccount-fluentd-prj1-stg", 
            "repositoryArn": "arn:aws:ecr:ap-northeast-1:<awsaccount-num>:repository/ecr-myaccount-fluentd-prj1-stg", 
            "repositoryUri": "<awsaccount-num>.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-myaccount-fluentd-prj1-stg"
            "repositoryName": "ecr-prj2-php-stg", 
            "repositoryArn": "arn:aws:ecr:ap-northeast-1:<awsaccount-num>:repository/ecr-prj2-php-stg", 
            "repositoryUri": "<awsaccount-num>.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-prj2-php-stg"
```
```
# aws ecr get-login --no-include-email --region ap-northeast-1 --profile myaccount
# docker login -u AWS -p eyJwYX******TU5fQ== https://<awsaccount-num>.dkr.ecr.ap-northeast-1.amazonaws.com
```
でてきたdockerコマンドをそのまま実行


#####・ビルドしてecrにアップ

ビルドコマンドはbuildspec.ymlに書いてあるので大体はそのとおりにする
（Codebuild側の環境変数のことは初回のpush時は気にしないことにする）

そのほかの参考
https://techblog.lclco.com/entry/2018/10/12/170000
https://dev.classmethod.jp/cloud/aws/cfn-github-fargate-codepipeline/
https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/tutorials-cloudformation-github.html
https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/GitHub-create-personal-token-CLI.html

とりあえずfluentdのリポジトリからcloneしてbuildする

```
# git clone https://github.com/myaccount/xxxxxxx.git
# cd xxxxxx/

# docker build -t <awsaccount-num>.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-myaccount-fluentd-prj2-stg:latest .
# docker push <awsaccount-num>.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-myaccount-fluentd-prj2-stg:latest

# docker build -t <awsaccount-num>.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-myaccount-fluentd-prj1-stg:latest .
# docker push <awsaccount-num>.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-myaccount-fluentd-prj1-stg:latest
```

#####・ECSのサービスを作る

fluentdはサービス作るのに失敗はしてないので、もう一回パイプラインのテンプレートをCLIで流すだけにする
ほかの失敗してるものはECRにデータがあるとサービス作れるのでもう一回CFテンプレートを流す

#####・awscliでcfテンプレートを用いてPiplineを作成する

cloudformationのテンプレートがあるディレクトリに移動

```
# aws cloudformation deploy --template-file pipeline-xxxxxx-fluentd-stg.yaml \
--stack-name pipeline-xxxxxx-fluentd-stg \
--profile=myaccount --region=ap-northeast-1 \
--capabilities CAPABILITY_IAM \
--parameter-overrides "OAuthToken=*********"
```
#####失敗したので以下確かめる方法を順次試す

自分で作ったTorkenをつかってやってみてうまくいったら権限が足りてるかどうかつくった方に確認
→だめだったのでIAMロールとかを見直してみるとか、
　個人用のAuthTorkenを対応させるやりかたが載っている教えてもらったURLみてなんかごにょごにょするやつをためす↓

https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/GitHub-create-personal-token-CLI.html

とりあえず、止まるwebhookのあたりをコメントに入れてからパイプラインをCloudFormationで作成する

SourceのGithubへの接続設定を手動で設定する。
![aws-codepipeline-source-connect-to-github1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25031/fc96939a-c2a9-9e1e-8b2d-57026954ddab.png)

![aws-codepipeline-source-connect-to-github2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25031/9732d5f4-2ced-7e0d-a0f5-b628199d2f3c.png)

そのあとに以下のようにパイプラインをdownloadしてから
cliでAuthTorkenをupdateする

```
# aws codepipeline get-pipeline --name pipeline-xxxxxx-fluentd-stg --profile myaccount >fluentd-pipeline.json
# vi fluentd-pipeline.json 
```
 OAuthTokenField をeditしGitHubのpersonalTorkenをinput
metadataのdateをdelete

```
# aws codepipeline update-pipeline --cli-input-json file://fluentd-pipeline.json --profile myaccount
```
次にパイプラインのAWSコンソールの「変更をリリースする」を押すと成功する。

つまりCloudFormationでWebhookの設定の部分までやるのはあきらめる。そこだけ手動。
https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/GitHub-create-personal-token-CLI.html

確かめたければ空コミットしてpushしてパイプラインが動くかを確認する。

#####流れとしては以下のとおり
　ビルドしてecrにpush
　　→ecsサービスを(cfで)つくる
　　　→webhook以外のCodePiplineを(cfで)つくる
　　　　→AWSコンソールからGithubにつなぐ
　　　　　→awscliでAuthTorkenをupdate
　　　　　　→へんこうをリリースをAWSコンソールからおす（or, commit/push）

感想をいうと、すべてをCloudFormationでやる必要性はないかもしれないけど、
資料や画面みるより俯瞰しやすくて楽な面はあり、慣れてくるとなんでこの環境はテンプレートがないのかと思うことも多分あるかもしれないですね。実体と乖離してるとアレですが。

#####そのほかのみたことがあるエラー

DBがつながってない、パスワードが違ってる
キャッシュがつながってない、設定がアレでエンドポイントが出現しない
SecurityGroupの設定間違えてる
コンソールからやったらパスワードがオートコレクトで違うの入ってた
EFS追加したけどVPC違うとピアリングするかVPC毎にするかしないとアレだった
パラメータストアだと環境変数取ってこれるリソースが限定的で物理的に使えない
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/dynamic-references.html#template-parameters-dynamic-patterns-resources

ログ見てググるかマニュアル見るか分かる人に聞くかサポート問い合わせか近所ならLoftに押しかけてアーキテクトの人を質問攻めにするなどの解決手段が。

#####あまり関係ないwsl的な解決してないやつ

以下、すごいどうでもいいwsl的な問題（※結果として解決してないというか、ローカルのWindowsでやろうとしてダメだったのでLAN内のESXi上のVMゲストのCentOS7使いました）

開発パッケージを入れる

```
sudo apt-get install gcc g++ make openssl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev build-essential 
```
awscliをつかうのにpython2系じゃだめだったのでpyenvでpython3をいれるために上記が要る

```
$ pyenv install 3.6.8
$ pyenv versions
* system (set by /home/komiyay/.pyenv/version)
  3.6.8
$ bash
$ python --version
Python 3.6.8

$ aws ecr describe-repositories --profile myaccount

An HTTP Client raised and unhandled exception: __init__() got an unexpected keyword argument 'ssl_context'
```
解決せず。。。あきらめてCentos7つかうことに。
（たぶんopenssl的なアレなのでUbuntuを18にするとかしないとだめかも