😸

【CloudFormation】ECRをデプロイしてみる

2022/07/23に公開

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

スタックを作成します。

image

リポジトリが作成されたことを確認します。

image

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.

参考:AWS::ECR::RegistryPolicy

  • テンプレートではイメージスキャンを有効化しているが、現在は非推奨になっています

    • 公式ドキュメントで見つけれていないですが、コンソール上にはっきりと確認出来ました
      image

    • レジストリ単位でのイメージスキャンが推奨されており、設定が優先されるようです

    • 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