【備忘録】JAWS DAYS ハンズオンコーナー「コンテナサービスをCI/CDパイプラインでデプロイしよう」をやってみての気づき・学び

[**JAWS-UG**](https://jaws-ug.jp/) の最大のイベントである [**JAWS DAYS 2022**](https://jawsdays2022.jaws-ug.jp/) ではハンズオンも開催されており、3種類のハンズオンがありました

その中でも個人的に一番気になっていたのが「コンテナサービスをCI/CDパイプラインでデプロイしよう」です

https://twitter.com/OutputSeq/status/1578639548850274304?s=20&t=Ce8nGU-AX5d1wQdIqw9HEA

私は今回ボランティアスタッフとして参加したため、イベントの次の日を丸一日使ってハンズオンをやりました

内容や構成を理解することを重視してハンズオンを進めましたが、これがかなり濃密なハンズオンなのです
私にアプリケーション開発の経験がないことも相まってかなり大変でした・・・
ただ、非常に勉強になったため学びを残しておこうと思います

# タグの付け方によってコマンドの形態が違う

まず前提として、CLI でのタグ付け操作の方法は以下の2パターンによって異なります
- リソース作成時にタグも一緒に作る
- 既存のリソースへにタグを追加する

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/Using_Tags.html#Using_Tags_CLI

ハンズオンでは「リソース作成時にタグを一緒に作る」手順を踏んでいましたが、コマンド形態に注意が必要だと思いました

具体的にそう思ったのは以下の点です

- オプションには、`--tags` ではなく `--tag-specifications` を使う
- タグの Key-Value 以外に `ResourceType=xxxx` も指定する必要がある

例えば、EBS volume 作成時は以下のようなコマンドになります

```Bash:リソース作成時にタグも一緒に作る
aws ec2 create-volume \
    --availability-zone us-east-1a \
    --volume-type gp2 \
    --size 80 \
    --tag-specifications 'ResourceType=volume,Tags=[{Key=purpose,Value=production},{Key=cost-center,Value=cc123}]'
```

対して、AMI にタグを後付けする場合は以下のようなコマンドになります


```Bash:既存のリソースへにタグを追加する
aws ec2 create-tags \
    --resources ami-78a54011 \
    --tags Key=Stack,Value=production
```



# ログインしているIAMユーザーとは別に、cloud9にはAWS Managed Temporary Credentialsというポリシーがついている

ハンズオンの中に、cloud9のクレデンシャル情報を編集する手順が出てきました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1471959/a7b24919-810a-4a9b-4316-2135161af120.png)
（画像はハンズオンシナリオから引用しています）

この AWS Managed Temporary Credentials（長いので、以下 AMTC と略します）は cloud9 を作成したときに自動的に作成されるクレデンシャルです
コンソルにログインしている IAM ユーザーが持っている権限と AMTC、両方で許可されていないと AWS リソースに対するコマンドは実行できません

ただ注意点が一つあり、一部制約はあるものの AMTC は Administrator に近い権限を保有しています

https://docs.aws.amazon.com/cloud9/latest/user-guide/security-iam.html#auth-and-access-control-temporary-managed-credentials

https://dev.classmethod.jp/articles/aws-cloud9-aws-managed-temporary-credentials/#toc-2

ゆえに、セキュリティを考えると AMTC はハンズオンシナリオの通り無効化し、cloud9 のインスタンスに適切な権限を与えた IAM ロールをアタッチすることがベストプラクティスと思われます

https://hideharaaws.hatenablog.com/entry/2020/09/24/200000

ちなみに、[CLI 専門支部](https://jawsug-cli.connpass.com/)で使っている cloud9 を確認したら、同じく AMTC はオフになっていました
設定したことを完全に忘れていました。。。

# AWS CLI で ECR にログインする時のベストプラクティス

ハンズオンシナリオで ECR にログインする手順があるのですが、ちょっと一工夫加えたコマンドでした

```Bash
aws ecr get-login-password \
  --region ap-northeast-1 | \
  docker login \
  --username AWS \
  --password-stdin `echo ${AccountID}`.dkr.ecr.ap-northeast-1.amazonaws.com
```

調べてみると、標準出力にパスワードを表示させないために工夫されたコマンドでした

https://qiita.com/hayao_k/items/3e4c822425b7b72e7fd0

ざっと説明すると、`docker login` コマンドには `--password-stdin` というオプションがあります
これはパスワードを標準出力に表示させず、ファイルなどからパスワードを取得するためのオプションです

https://docs.docker.com/engine/reference/commandline/login/#provide-a-password-using-stdin

ハンズオンでは `ecr get-login-password` コマンドでパスワードを取得し、パイプで `docker login` コマンドにパスワードを渡しています
こうすることで、標準出力にパスワードを表示させずに済みます

# ECR の VPC エンドポイント作る時は、3種類のエンドポイントが必要

プライベートサブネットなどから ECR リポジトリにアクセスするためには、以下の3種類の VCP エンドポイントが必要です
 
- com.amazonaws.<region>.ecr.dkr
- com.amazonaws.<region>.ecr.api
- com.amazonaws.<region>.s3（ゲートウェイ型）

https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/vpc-endpoints.html

ECR のエンドポイントは `dkr` と `api` の2種類が必要なこと、S3のゲートウェイ型エンドポイントも必要なこと、このあたりで引っかかりそうだと思いました

# 最後に
AWS CLI、コンテナ、CI/CDパイプライン、Blue/Green デプロイ、このあたりの単語が「完全に理解した」状態な方にとって、理解を深めるのにうってつけのハンズオンだと思いました

この記事が誰かの助けになれば幸いです