実践Terraformクラウドインフラ構築
AWSプロバイダー設定と認証
AWSプロバイダーの設定
TerraformでAWSリソースを管理するには、まずTerraformにAWSとの対話方法を教える必要があります。これがAWSプロバイダーの役割です。具体的には、設定ファイル内でどのプロバイダーを利用するかを宣言します。
これはterraformブロック内ので行います。このブロックは、Terraformがどのプロバイダーのどのバージョンをダウンロードして使用するかを定義します。プロバイダーのバージョンを固定することで、チーム内での実行環境の違いによる予期せぬ動作を防ぎます。
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
required_providersで利用宣言をした後、providerブロックで具体的な設定を行います。最もシンプルな設定は、リソースを作成するリージョンを指定するだけです。
provider "aws" {
region = "us-east-1"
}
安全な認証方法
TerraformがAWSアカウントを操作するには、認証情報(アクセスキーとシークレットキー)が必要です。しかし、これらの機密情報を設定ファイルに直接書き込むのは非常に危険な行為です。バージョン管理システムに誤ってコミットしてしまうと、第三者にアカウントが乗っ取られる可能性があります。
実務では、より安全な方法として環境変数や共有クレデンシャルファイルを利用します。
最も推奨されるのは、環境変数を利用する方法です。CI/CDパイプラインなど、自動化された環境との相性も抜群です。
# ターミナルで環境変数を設定
export AWS_ACCESS_KEY_ID="YOUR_ACCESS_KEY"
export AWS_SECRET_ACCESS_KEY="YOUR_SECRET_KEY"
export AWS_REGION="us-east-1"
このように環境変数を設定しておけば、providerブロックには認証情報を記述する必要がありません。Terraformは自動的にこれらの環境変数を読み込んで認証を行います。
もう一つの一般的な方法は、AWS CLIが使用する共有クレデンシャルファイル(~/.aws/credentials)を利用することです。複数のAWSアカウントを切り替えて作業する場合に特に便利です。
# ~/.aws/credentials ファイルの内容
[default]
aws_access_key_id = YOUR_ACCESS_KEY
aws_secret_access_key = YOUR_SECRET_KEY
[dev]
aws_access_key_id = YOUR_DEV_ACCESS_KEY
aws_secret_access_key = YOUR_DEV_SECRET_KEY
この場合、providerブロックでどのプロファイルを使用するかを指定できます。
provider "aws" {
region = "ap-northeast-1"
profile = "dev" # devプロファイルを使用
}
高度なプロバイダー設定
実際のプロジェクトでは、複数のリージョンにリソースをデプロイしたり、全てのリソースに共通のタグを付けたい場合があります。Terraformのプロバイダー設定は、こうしたニーズにも柔軟に対応できます。
例えば、メインのインフラは東京リージョンに、しかし特定のCDN関連リソースはバージニア北部リージョンに作成したい、といったケースを考えます。このような場合、プロバイダーにalias(別名)を付けることで、同じプロバイダーを異なる設定で複数定義できます。
provider "aws" {
# エイリアスなしがデフォルトプロバイダー
region = "ap-northeast-1" # 東京
}
provider "aws" {
alias = "virginia"
region = "us-east-1" # バージニア北部
}
# リソース定義でプロバイダーを指定
resource "aws_s3_bucket" "tokyo_bucket" {
bucket = "my-unique-bucket-in-tokyo"
# providerの指定がないため、デフォルト(東京)が使われる
}
resource "aws_cloudfront_origin_access_identity" "oai" {
provider = aws.virginia
comment = "OAI for my website"
}
もう一つ便利な機能がです。providerブロック内でこの設定を使うと、そのプロバイダーが管理する全てのリソースに共通のタグを自動的に付与できます。これにより、コスト管理やリソースの所有者追跡が容易になります。
provider "aws" {
region = "ap-northeast-1"
default_tags {
tags = {
Project = "WebApp-Alpha"
Environment = "Production"
ManagedBy = "Terraform"
}
}
}
これで、このプロバイダー経由で作成されるEC2インスタンスやS3バケットなど、タグ付け可能な全てのリソースにこれらの3つのタグが自動で付与されます。
Terraform設定において、AWSプロバイダーとそのバージョンを宣言するために使用されるブロックはどれですか?
TerraformにAWSの認証情報を提供する最も安全な方法は次のうちどれですか?
これらの設定をマスターすることで、安全かつ効率的にAWSインフラをコードで管理するための第一歩を踏み出すことができます。