【AWS】ECRリソースをCloudFormationで作成する
2022-11-19
Content
💫 はじめに
この記事では、templateを用いてECRをCloudFormationで作成する方法を紹介します。
各手順のスクリーンショットとかはないです。デザインが変わることがままあるので…
💫 ざっくり用語説明
⭐︎ AWS:
Amazon Web Servicesの略。
Amazonが提供するクラウドコンピューティングサービス。
クラウド上にインフラを(比較的)楽に作れる。
⭐︎ ECR:
Elastic Container Registryの略。
Dockerのコンテナイメージを保存するためによく使われる。
⭐︎ CloudFormation:
ソースコード(template)を利用してAWSリソースを自動で作成したり管理したりするために使うサービス。
いわゆるIaC(Infrastructure as Code)を目的とする。
templateさえあれば同じリソースを簡単に作ることができて便利。
⭐︎ IAM:
Identity and Access Managementの略。
認証やアクセス許可周りを管理するためのサービス。
💫 モチベーション
AWSのCloudFormationを使うにあたって少し手間がかかったため。
ブログ等もいろいろあるが、IAM周りやtemplateの作成周りまで言及している記事は少ないかも?
💫 公式ドキュメント
ECR: https://aws.amazon.com/jp/ecr/
CloudFormation: https://aws.amazon.com/jp/cloudformation/
💫 準備
- AWSアカウントの作成
💫 環境
- Windows11
💫 templateを作成
リソースを作るためにはtemplateが必要です。
templateを作るには、以下の2通りの方法があります。
- 公式が用意しているsampleをカスタマイズして作成する。
- GUI(コンソール)で一度リソースを作成し、そのリソースをもとにtemplateを作成する(3rd partyサービス)。
2番の方法では、former2 などのサービスを使います。
こちらの方法のほうが圧倒的に楽なのですが、セキュリティなどの観点から業務では推奨されないこともありそうです
お勉強になると自分に言い聞かせて今回は1番の方法でちまちまとtemplateを作成しましょう。
ECr template公式Doc (https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-ecr-repository.html
を参考にtemplateを作成していきます。
JSONでもYAMLでもよいのですが、書くのが楽でコメントもかけるのでYAMLを使います。
個人の見解ですが、JSONはあくまで機械同士が情報をやり取りするための記述様式だと考えています(なのでコメントを書けない)。
YAMLで書けるときは積極的にYAMLを使っていきましょう!!
今回作成したYAMLはこちら.
# ECR Repository for XXX
AWSTemplateFormatVersion: 2010-09-09
Description: sample ECR template
Resources:
SampleRepository:
Type: AWS::ECR::Repository
Properties:
RepositoryName: "sample-repository"
ImageScanningConfiguration:
ScanOnPush: true
ImageTagMutability: IMMUTABLE
RepositoryPolicyText: |
{
"Version": "2012-10-17"
"Statement": []
}
ECR templateの公式Docと違う部分を解説します。
- 先頭のコメント
CloudFormationを使用する際、ECRだけを作るということはあまりありません。
他リソースのYAMLファイルも多く管理することになるので、ソースコードを見てすぐにどのresourceに対応するかわかるようにしましょう。 -
templateバージョン等の記載
CloudFormationの公式Doc(https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-anatomy.html)にあるように、- AWSTemplateFormatVersion
- Description
- Resources
も記載しています。
書いたほうがより分かりやすくなりますね。
-
RepositoryPolicyTextの書き方
例ではpolicyもYAMLの形式にして書いてありましたが、policyはJSONで書かれることが多いので、今回はpolicy部分のみJSON形式で書きました。
他所でJSONにしているのをわざわざYAMLに変換するのは面倒です。
また、例にあるようにStatement: - Sid: AllowPushPull Effect: Allow Principal: ...
という書き方をしたらエラーになったことがあるので、このような書き方をしています。
”|“の代わりに”>“でも行けるかもしれない。
※今回はStatementの中身を書いていないので、RepositoryPolicyTextは何の意味も持っていません。不要ならば消してから使いましょう。
💫 CloudFormation用IAMロール作成
リソースを作ってもらうために、CloudFormationに権限を持たせてあげる必要があります。
IAMを使って、以下のような必要なポリシーを作成します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ecr:CreateRepository",
"ecr:DeleteRepository",
"ecr:SetRepositoryPolicy"
]
}
]
}
このポリシーで許可するアクションは3つです。
-
“ecr:CreateRepository”
- これがないとリポジトリを作れません。
-
“ecr:DeleteRepository”
- CloudFormationはロールバック機能を持たせることができます。これはリソース作成時に不備があったときに、できてしまったリソースを削除して元の状態に戻す機能です。ロールバックをONにするならばリポジトリを削除する権限も必要です。
-
“ecr:SetRepositoryPolicy”
- これがないとポリシーをセットできません。
ポリシーを作るにあたって、
「CloudFormationでOOを作りたいときに必要となるポリシー」
が書いてあるドキュメントはあまりなさそうです…
権限が足りない場合はCloudFormationでリソースを作成するときに「XXXのアクションが許可されてないよ」というエラーが出てくれるので、エラーがあったらその都度ポリシーを修正すれば良いので問題はないのですが少し面倒に感じます。
私がドキュメントを探すのが下手なだけかもしれませんが…
💫 CloudFormationを使ってECRリソースを作成
これまで作成したtemplateとポリシーを使って実行するだけです!
- 個人的にはロールバック機能を使うことをお勧めします。
- ポリシー不備の場合はどの権限が足りないかエラーメッセージで出てくれるので比較的わかりやすいです。
-
ただし、ほかのエラーの場合はどこに問題があるかわかりにくいです…
- 以下のトラブルシューティング公式Docを参考にしたりエラーメッセージを調べたりして頑張りましょう!
- 以下のトラブルシューティング公式Docを参考にしたりエラーメッセージを調べたりして頑張りましょう!
💫 (追記)最小限IAMポリシー作成
ECRに限らず最小限のIAMポリシーをより楽に作成する方法 について記事を書きました!
興味のある方はどうぞ!
💫 最後に
なぜ既存リソースからtemplateを作成する機能が公式から提供されないのでしょうか…
Microsoftが提供するAzureにはこの機能があるので、Azureを使う機会のほうが多かった私にしてみれば少し面倒に感じます。
また、AWSに慣れていないだけではあるのですが、CloudFormationに限らずIAM周りもちょっと面倒な感じがします。
AWS・Azure・GCPなどそれぞれの良さを知り、用途にあわせて最適なサービスヲ選択できるようになりたいですね。
それでは良きAWSライフを!!