【CloudFormation】ECRをデプロイしてみる
1. はじめに
こんにちわ、Mitsuoです。
今回はCloudFormationを用いてAmazon Elastic Container Registry(ECR)をデプロイしてみました。
ECRとは、フルマネージドなコンテナレジストリサービスで、ECS、EKSの様なコンテナオーケストレーションサービスを利用する場合は、合わせて作成するかと思います。
また、レジストリサービスではありますが、レジストリ内にリポジトリも作成可能です。
リポジトリについても、ある程度標準化が出来ると思うので、良ければ参考にしてみてください。
なお、テンプレートに関連して一部の機能の説明はありますが、ECRの概要に関しては解説していないため、公式ドキュメントや他の技術ブログを参照してください。
参考:What is Amazon Elastic Container Registry?
参考:AWS再入門ブログリレー2022 Amazon ECR編
2. 作成したリソース
テンプレートで作成するリソースは以下の通りです。
- ECRリポジトリ
3 テンプレート情報
作成したテンプレートになります。
AWSTemplateFormatVersion: '2010-09-09'
Description: Deploy a ECR repository.
# ------------------------------------------------------------#
# Caution:
# This template is for deploying ECR repository.
# Make sure you confirm which the region you set up in advance.
# ------------------------------------------------------------#
# Metadata:
# This can privide details about the template.
# For more information, see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/metadata-section-structure.html.
# As Metadata Keys, AWS::CloudFormation::Interface can Defines the grouping and ordering of input parameters
# when they are displayed in the AWS CloudFormation console.
# For more information, see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-interface.html.
# ------------------------------------------------------------#
Metadata:
"AWS::CloudFormation::Interface":
ParameterGroups:
-
Parameters:
- SystemName
- EnvType
- Tagprefix
- Owner
ParameterLabels:
SystemName:
default: "Type the Systemname"
EnvType:
default: "Select the environment in which you deploy resources"
Tagprefix:
default: "Type the Tagprefix which is logical unit name about this stack(e.g. Webserver,Monitoring,Logging)"
Owner:
default: "Type who owns these resources (e.g. project name or worker, whether this purpose is just verification or not)"
# ------------------------------------------------------------#
# Parameters
# This Can enable templates to input custom values each time you create or update a stack.
# For more information, see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html.
# ------------------------------------------------------------#
Parameters:
SystemName:
Type: String
EnvType:
Type: String
Default: "dev"
AllowedValues:
- dev
- prod
Tagprefix:
Type: String
Owner:
Type: String
# ------------------------------------------------------------#
# Resources
# This can declare the AWS resources that you want to include in the stack.
# For more information, see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/resources-section-structure.html.
# ------------------------------------------------------------#
Resources:
# ------------------------------------------------------------#
# Create ECR Repository
# ------------------------------------------------------------#
ECRRepository1:
Type: AWS::ECR::Repository
Properties:
RepositoryName: !Sub ${SystemName}-${EnvType}-${Tagprefix}-ecr-repository
RepositoryPolicyText:
Version: "2012-10-17"
Statement:
-
Sid: AllowPushPull
Effect: Allow
Principal:
AWS:
- !Sub 'arn:aws:iam::${AWS::AccountId}:root'
Action:
- ecr:GetAuthorizationToken
- ecr:BatchCheckLayerAvailability
- ecr:GetDownloadUrlForLayer
- ecr:GetRepositoryPolicy
- ecr:DescribeRepositories
- ecr:ListImages
- ecr:DescribeImages
- ecr:BatchGetImage
- ecr:GetLifecyclePolicy
- ecr:GetLifecyclePolicyPreview
- ecr:ListTagsForResource
- ecr:DescribeImageScanFindings
ImageScanningConfiguration:
ScanOnPush: true
EncryptionConfiguration:
EncryptionType: AES256
ImageTagMutability: IMMUTABLE
LifecyclePolicy:
LifecyclePolicyText: >
{
"rules": [
{
"action": {
"type": "expire"
},
"selection": {
"countType": "imageCountMoreThan",
"countNumber": 10,
"tagStatus": "any"
},
"description": "delete old images more than 10 images",
"rulePriority": 1
}
]
}
RegistryId: !Ref AWS::AccountId
Tags:
- Key: Name
Value: !Sub ${SystemName}-${EnvType}-${Tagprefix}-ecr-repository
- Key: Owner
Value: !Ref Owner
# ------------------------------------------------------------#
# Outputs
# This can output each value specified as output section.
# For more information, see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/resources-section-structure.html.
# ------------------------------------------------------------#
Outputs:
ECRRepository1:
Description: ECRRepository1
Value: !Ref ECRRepository1
4. テンプレートの補足
テンプレートに関して、以下の通り補足します。
4.1 Metadata/Parameters
メタデータおよびパラメターセクションで、以下の値を定義します。
項目 | 備考 |
---|---|
SystemName |
プロジェクト名や利用目的等を入力する |
EnvType |
デプロイする環境を選択する 検証、ステージング、本番の3点 |
Tagprefix |
任意で入力するPrefix値 |
Owner |
作業者、所有者、コスト管理用に入力する |
4.2 想定ユースケース
今回のテンプレートは、次の様なユースケースを想定して作成しました。
- ECRのリポジトリポリシーはリソース作成したPrincipal(アカウント)から指定したアクションのみ許可する
- リポジトリのPush時におけるスキャン機能を有効化にする
- タグのイミュータビリティは有効化にする
- 同じタグのイメージ上書きを防ぐ
- ライフサイクルポリシーを適用する
- リポジトリ内の全てのイメージに対して適用する
- 10世代以上前のイメージは削除する
- レジストリに対する設定は行わない
4.3 動作確認
実際に動作を確認してみます。
上記のテンプレートを用いてECRリポジトリを作成します。
スタック名:ECR
項目 | 備考 |
---|---|
SystemName |
mitsuopj |
EnvType |
dev |
Tagprefix |
image |
Owner |
mitsuo |
スタックを作成します。
リポジトリが作成されたことを確認します。
4.4 留意事項
留意事項は以下の通りです。
- レジストリに対するポリシーが設定出来ますが、これはレジストリに対して包括的なポリシー制御を行う物では無く、レプリケーションやキャッシュ機能の許可に使用されます
公式ドキュメントにも記載がありました、ご参考まで。
レジストリレベルのPrincipalに対する許可を付与するポリシーである。
レプリケーションやキャッシュのアクセス範囲を決めるために使われる。
Amazon ECR uses a registry policy to grant permissions to an AWS principal at the private registry level.
These permissions are used to scope access to the replication and pull through cache features.
参考:Private registry permissions
別アカウントに対して許可を指定するために使用される。
クロスアカウントレプリケーションを設定する時に使用される。
ここでも上記のリンクに飛んでいるのが分かりますね。
A private registry policy is used to specify permissions for another AWS account and is used when configuring cross-account replication.
For more information, see Registry permissions in the Amazon Elastic Container Registry User Guide.
-
テンプレートではイメージスキャンを有効化しているが、現在は非推奨になっています
-
公式ドキュメントで見つけれていないですが、コンソール上にはっきりと確認出来ました
-
レジストリ単位でのイメージスキャンが推奨されており、設定が優先されるようです
-
CloudFormationではみた限り、レジストリに対するスキャン機能を有効化出来ない様に見えます
-
代替手段として、コンソールやCLIを利用ください
-
参考:put-registry-scanning-configuration
5 まとめ
という事でECRリポジトリを作成してみました。検証が進めばCloud9やECSからECRを利用してみる記事を書いてみようと思います。
テンプレートは自己責任でご自由にお使いください。
このブログが誰かの役に立てばと思います。Mituoでした!!
6 参考資料
What is Amazon Elastic Container Registry?
AWS再入門ブログリレー2022 Amazon ECR編
AWS::ECR::Repository
Private registry permissions
put-registry-scanning-configuration
Discussion