こんにちは。よっしーです(^^)
今日は、Terrafromを利用したECR環境の構築についてご紹介します。
前提
構築するECR環境は下記のサイトをベースにしています。
背景
ECS環境を構築する機会がありましたので、上記のサイトを参考にTerraformで構築してみました。ECS環境を構築するにあたり、ECRの作成が必要だったので、この記事ではECR環境の構築をご紹介しています。次回以降に、ECS環境の構築をご紹介したいと思います。
作業ディレクトリの作成
下記のコマンドで作業ディレクトリを作成します。
mkdir 20_learn_terraform-aws-ecr
cd 20_learn_terraform-aws-ecr
使用するコマンドのバージョン指定
下記のコマンドを実行します。
asdf local terraform 1.5.3
asdf local awscli 2.13.2
もし、指定のバージョンがインストールされていなければ、下記の手順でインストールできます。
# terraform
asdf install terraform 1.5.4
# awscli
asdf install awscli 2.13.7
詳しくは下記のサイトをご覧ください。
下記のコマンドで指定のバージョンが利用できることを確認します。
% terraform --version
Terraform v1.5.4
on darwin_arm64
% aws --version
aws-cli/2.13.7 Python/3.11.4 Darwin/22.5.0 exe/x86_64 prompt/off
ファイル作成
下記のファイルを新規作成します。
new file: main.tf
new file: output.tf
new file: variables.tf
new file: ecr/ecr.tf
new file: ecr/output.tf
new file: ecr/variables.tf
main.tf
下記の内容で新規作成します。
terraform {
cloud {
organization = "(自身の組織名を入力)"
workspaces {
name = "learn-aws-ecr"
}
}
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.16"
}
}
required_version = ">= 1.2.0"
}
provider "aws" {
region = "ap-northeast-1"
}
# ECR
module "ecr" {
source = "./ecr"
name_prefix = var.name_prefix
region = var.region
tag_name = var.tag_name
tag_group = var.tag_group
}
output.tf
下記の内容で新規作成します。
# ECRのURL
output "ecr_url" {
value = module.ecr.repository_url
}
variables.tf
下記の内容で新規作成します。
variable "region" {
default = "ap-northeast-1"
}
variable "name_prefix" {
default = "lae"
}
variable "tag_name" {
default = "learn-aws-ecr"
}
variable "tag_group" {
default = "learn-aws-ecr"
}
ecr/ecr.tf
下記の内容で新規作成します。
resource "aws_ecr_repository" "learn_aws_ecr" {
name = "learn_aws_ecr"
force_delete = true
}
ecr/output.tf
下記の内容で新規作成します。
output "repository_url" {
value = aws_ecr_repository.learn_aws_ecr.repository_url
}
ecr/variables.tf
下記の内容で新規作成します。
variable "name_prefix" {}
variable "region" {}
variable "tag_name" {}
variable "tag_group" {}
ECR作成
下記のコマンドを実行します。
terraform login
Yesで確認し、自動的に開くブラウザウィンドウでワークフローに従います。プロンプトが表示されたら、生成された API キーを Terminal に貼り付ける必要があります。
TerraformCloudで初めてワークスペースを利用する場合は、下記の環境変数を設定する必要があります。
- AWS_ACCESS_KEY_ID
- AWS_SECRET_ACCESS_KEY
詳しくは下記のサイトをご覧ください。
下記のコマンドを実行します。
# プロジェクトの初期化
terraform init
# フォーマット
terraform fmt
# バリデーション
terraform validate
# 作成内容の確認
terraform plan
ここまで特に問題なければ、下記のコマンドを実行します。
# AWSリソースの作成
terraform apply
下記のような出力なっていれば成功です。
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
Outputs:
ecr_url = "xxx.dkr.ecr.ap-northeast-1.amazonaws.com/learn_aws_ecr"
解説
main.tf
このTerraformコードは、AWSのECR(Elastic Container Registry)リソースを管理するための設定を含んでいます。ECRは、コンテナイメージを保存、管理、配布するための完全に管理型のDockerコンテナレジストリです。
コード全体の構造と目的を要約すると、以下のようになります。
terraform
ブロック: Terraformの設定を開始します。このブロック内では、Terraformのバージョンやプロバイダ、クラウド組織などの設定が行われます。cloud
ブロック: Terraform Cloudの組織情報を指定します。組織名とワークスペース名が定義されています。required_providers
ブロック: 使用するプロバイダの情報を指定します。ここでは、aws
プロバイダを使うことを宣言し、バージョンを指定しています。required_version
: Terraformの最低バージョン要件を指定しています。
provider "aws"
ブロック: AWSプロバイダの設定を行います。ここでは、リージョンを “ap-northeast-1″(東京リージョン)に設定しています。module "ecr"
ブロック: 別のTerraformモジュールである “ecr” モジュールを利用して、ECRリソースの設定を行います。source
: 使用するモジュールのソースパスを指定します。ここでは、カレントディレクトリの “ecr” ディレクトリにあるモジュールを使用しています。- モジュールの変数への引き渡し:
name_prefix
、region
、tag_name
、tag_group
という4つの変数を使って、モジュール内のリソース設定に値を渡しています。これにより、ECRリソースの詳細な設定を外部で指定できるようになります。
このコードの目的は、ECRリソースを管理するための基本的な設定を提供することです。モジュール内の具体的なリソース設定やロジックは、モジュール自体の定義で行われています。このコードを実行することで、指定されたECRリソースがTerraformで作成・管理されることになります。var.name_prefix
、var.region
、var.tag_name
、var.tag_group
といった変数がどのように定義されているかによって、動作を変更することができます。
ecr/ecr.tf
このTerraformコードは、AWSのECR(Elastic Container Registry)リソースを作成するための設定を含んでいます。ECRは、コンテナイメージを保存、管理、配布するための完全に管理型のDockerコンテナレジストリです。
コードの内容を解説すると以下の通りです:
resource "aws_ecr_repository" "learn_aws_ecr"
ブロック: これはTerraformによって管理されるECRリソースを定義しています。name
: ECRリポジトリの名前を指定します。ここでは “learn_aws_ecr” という名前を設定しています。force_delete
: このオプションをtrue
に設定することで、Terraformがリソースを削除する際に強制的に削除するよう指示しています。ECRリポジトリは通常、イメージが存在する場合には削除ができないため、このオプションを有効にすることで削除時にイメージがあってもリポジトリを削除できるようになります。
このコードを実行すると、指定された名前のECRリポジトリが作成されます。このリポジトリは、コンテナイメージを保存し、Dockerコンテナイメージをプッシュおよびプルするための場所として機能します。また、force_delete
オプションが true
に設定されているため、リソースを削除する際にイメージが存在していても、リポジトリは削除されるでしょう。
ECRとは
AWS ECR(Elastic Container Registry)は、Amazon Web Services(AWS)が提供する完全に管理されたDockerコンテナレジストリです。Dockerコンテナイメージを保存、管理、配布するためのプライベートなレジストリを提供するサービスです。以下にECRの主な特徴と利点を説明します。
- プライベートなコンテナレジストリ: ECRはプライベートなコンテナレジストリとして機能します。これにより、セキュリティ上の懸念やコンプライアンス要件を満たしながら、コンテナイメージを保存できます。
- 完全に管理されたサービス: ECRはAWSによって管理されており、スケーリング、バックアップ、アップデートなどの面倒な管理タスクを気にすることなく利用できます。
- 高い可用性と信頼性: ECRはAWSのインフラストラクチャに基づいており、高い可用性と信頼性を提供します。コンテナイメージは複数のアベイラビリティーゾーンに分散して保存されます。
- 統合セキュリティ: ECRはAWS Identity and Access Management(IAM)と連携しており、コンテナイメージへのアクセスを厳密に制御できます。また、イメージの署名や暗号化などのセキュリティ機能も提供されます。
- 高速なイメージプッシュとプル: ECRは高速で低遅延のネットワークを利用しており、コンテナイメージのプッシュとプルが効率的に行えます。
- Docker CLIとの統合: ECRはDocker CLIとシームレスに統合されています。これにより、既存のDockerツールやワークフローを維持しながら、ECRを利用できます。
- バージョン管理とイメージタグ: ECRはイメージのバージョン管理をサポートし、異なるバージョンのコンテナイメージをタグ付けして管理できます。これにより、開発およびデプロイメントのコントロールが向上します。
ECRを使用することで、コンテナベースのアプリケーションを効果的に管理し、配布することができます。Dockerコンテナイメージのセキュリティ、可用性、管理を強化するための重要なツールとなっています。
おわりに
今日は、Terrafromを利用したECR環境の構築についてご紹介しました。
本記事でご紹介したソースは、下記のリポジトリにあります。
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント