AWS初心者でも安心して始められる、コスト0円でのセキュリティ基盤構築方法をご紹介します。Terraformを活用した自動化スクリプトと、手動で行うべき重要設定を包括的に解説します。
はじめに:AWSを無料で安全に使うために
AWSの無料枠(Free Tier)は、クラウド技術の学習や小規模プロジェクトの実行に最適ですが、適切なセキュリティ設定なしでの利用はリスクを伴います。本記事では、コストを発生させることなく、AWS環境の基本的なセキュリティ基盤を自動構築する方法を解説します。
Terraformによる自動化の利点
Terraformを使用することで以下のメリットが得られます:
- 設定の標準化と一貫性の確保
- 環境構築の再現性と迅速化
- コード管理によるバージョン管理
- 設定ミスの削減
AWS無料枠内で実装するセキュリティコンポーネント
今回のTerraformスクリプトで自動化する主要コンポーネントは次の通りです:
- IAMセキュリティ設定
- 強固なパスワードポリシー
- 最小権限の原則に基づく管理者・閲覧者グループ
- 権限分離の実践
- 監査ログの設定(CloudTrail)
- アカウント全体の操作ログ記録
- コスト最適化のためのログ保存期間設定
- 設定管理(AWS Config)
- IAMリソースの変更追跡(無料枠内)
- コンプライアンス監視基盤
- IAM Access Analyzer
- 外部リソース共有の自動チェック
- 意図しないパブリックアクセスの検出
- 予算アラート
- 無料枠超過の早期検知
- 予測を含めた予算管理
Terraformスクリプトの使い方
前提条件
このTerraformスクリプトを使用するには、以下の準備が必要です:
Terraformのインストール
Terraformの公式サイトから最新版(1.0.0以上)をダウンロードしてインストール
インストール確認: terraform version
コマンドでバージョンが表示されることを確認
AWS CLIのインストールと設定
- AWS CLIの公式ガイドに従ってインストール
aws configure
コマンドで認証情報を設定
aws configure
# AWSアクセスキー、シークレットキー、デフォルトリージョンを入力
作業ディレクトリの準備
- プロジェクト用のディレクトリを作成
mkdir aws-free-tier-setup
cd aws-free-tier-setup
スクリプトのセットアップ
Terraformファイルの作成
以下の3つのファイルを作成します:
main.tf
– 主要リソース定義
variables.tf
– 変数定義
outputs.tf
– 出力値定義
記事で紹介したコードをそれぞれのファイルにコピーします
変数のカスタマイズ
variables.tf
ファイルを開き、以下の項目を自分の環境に合わせて編集します:
variable "aws_region" {
description = "使用するAWSリージョン(無料枠内に収めるため1リージョンのみ使用)"
type = string
default = "ap-northeast-1" # お好みのリージョンに変更
}
variable "project_name" {
description = "プロジェクト名(リソース命名に使用)"
type = string
default = "free-tier" # プロジェクト名を変更
}
variable "admin_username" {
description = "管理者IAMユーザー名"
type = string
default = "admin" # 管理者ユーザー名を変更
}
variable "alert_email" {
description = "アラート通知用メールアドレス"
type = string
default = "your-email@example.com" # 通知を受け取るメールアドレスを設定
}
Terraformの実行
初期化
- 作業ディレクトリで以下のコマンドを実行し、Terraformを初期化します:
terraform init
このコマンドは必要な依存関係とプロバイダをダウンロードします
実行計画の確認
- 以下のコマンドで、作成されるリソースの計画を確認します:
terraform plan
出力される内容を確認し、意図したリソースが作成されることを確認してください
リソースの作成
- 問題がなければ、以下のコマンドでリソースを作成します:
terraform apply
確認メッセージが表示されるので、yes
と入力して実行を続行します
実行が完了するまで5分程度かかります
出力結果の確認
処理が完了すると、設定した出力値(アカウントID、作成したバケット名など)が表示されます
これらの情報は今後の設定や確認に使用します
エラー対応
よくあるエラーと対応方法:
認証エラーError: error configuring Terraform AWS Provider: no valid credential sources for Terraform AWS Provider found.
AWS CLIの認証情報が正しく設定されているか確認してください
aws sts get-caller-identity
コマンドでAWS認証が機能しているか確認
リソース名の重複Error: creating S3 Bucket: BucketAlreadyExists
variables.tf
のproject_name
を変更して、一意のバケット名になるようにしてください
権限不足Error: error creating IAM Account Password Policy: AccessDenied
使用しているIAMユーザーに十分な権限があるか確認してください
初回セットアップ時は管理者権限を持つユーザーでの実行を推奨します
スクリプトのカスタマイズ
基本設定に加えて、以下のようなカスタマイズも可能です:
CloudTrailのログ保持期間変更
- コスト削減またはコンプライアンス要件に合わせて、
main.tf
の以下の部分を編集:
resource "aws_s3_bucket_lifecycle_configuration" "cloudtrail" {
bucket = aws_s3_bucket.cloudtrail.id
rule {
id = "log-deletion"
status = "Enabled"
# 保持期間を変更(デフォルト90日)
expiration {
days = 90
}
}
}
AWS Configの監視対象リソース追加
- より多くのリソースタイプを監視する場合は、
main.tf
の以下の部分を編集:
resource_types = [
"AWS::IAM::User",
"AWS::IAM::Role",
"AWS::IAM::Group",
"AWS::IAM::Policy",
# 以下のようにリソースタイプを追加
# "AWS::S3::Bucket",
# "AWS::EC2::SecurityGroup"
]
ただし、監視対象を増やすとコストが発生する可能性があります
予算アラートのしきい値変更
- 通知の閾値を変更する場合は、
main.tf
の以下の部分を編集:
resource "aws_budgets_budget" "free_tier" {
# ...
limit_amount = "1" # この値を変更(例:5ドルに設定)
# ...
}
リソースの削除
不要になった場合やリセットする場合は、以下のコマンドでリソースを削除できます:
terraform destroy
確認メッセージが表示されるので、yes
と入力して削除を実行します。すべてのリソースが削除されるまで数分かかります。
Terraformスクリプトの構成
プロジェクトは以下の3つの主要ファイルで構成されています:
- main.tf – 主要リソース定義
- variables.tf – 変数定義
- outputs.tf – 出力値定義
主要設定の解説
IAMパスワードポリシー
resource "aws_iam_account_password_policy" "strict" {
minimum_password_length = 14
require_lowercase_characters = true
require_numbers = true
require_uppercase_characters = true
require_symbols = true
allow_users_to_change_password = true
password_reuse_prevention = 24
max_password_age = 90
}
この設定は、NIST(米国国立標準技術研究所)の推奨に基づく強固なパスワードポリシーを適用します。特に注目すべきは:
- 14文字以上の長さ要件
- 複雑さ要件(大文字、小文字、数字、記号)
- 過去24回分のパスワード再利用禁止
- 90日ごとの定期的な変更
CloudTrailの最適化設定
resource "aws_s3_bucket_lifecycle_configuration" "cloudtrail" {
bucket = aws_s3_bucket.cloudtrail.id
rule {
id = "log-deletion"
status = "Enabled"
# 90日後に削除(無料枠のストレージを超えないように)
expiration {
days = 90
}
}
}
ここではストレージコストを抑えるため、監査ログを90日間だけ保持する設定をしています。セキュリティとコストのバランスを考慮した最適解です。
AWS Configの限定的な構成
recording_group {
all_supported = false
include_global_resource_types = true
resource_types = [
"AWS::IAM::User",
"AWS::IAM::Role",
"AWS::IAM::Group",
"AWS::IAM::Policy"
]
}
コスト削減のため、AWS Configの記録対象をIAMリソースのみに限定しています。これは無料枠内での運用を可能にする重要な設定です。
予算アラート設定
resource "aws_budgets_budget" "free_tier" {
name = "無料枠予算"
budget_type = "COST"
limit_amount = "1" # 無料枠を超えたらすぐに通知
limit_unit = "USD"
time_unit = "MONTHLY"
# 無料枠を超えたらすぐに通知
notification {
comparison_operator = "GREATER_THAN"
threshold = 0
threshold_type = "ABSOLUTE_VALUE"
notification_type = "ACTUAL"
subscriber_email_addresses = [var.alert_email]
}
}
この設定は、利用料金が$1を超えた時点で通知するようにしています。実質的に無料枠を超えたらすぐに検知できる仕組みです。
手動で実施すべき追加セキュリティ設定
Terraformだけではカバーできない重要な手動設定があります:
1. ルートアカウントのセキュリティ強化
- MFA(多要素認証)の有効化
- AWSマネジメントコンソールにルートアカウントでログイン
- 右上のアカウント名 → 「セキュリティ認証情報」を選択
- 「多要素認証(MFA)」セクションで「MFAの有効化」をクリック
- 仮想MFAデバイス(Google AuthenticatorやAuhy等)を選択し、設定を完了
- ルートアカウントのアクセスキー削除
- 同じ「セキュリティ認証情報」ページの「アクセスキー」セクションで確認
- もし存在する場合は「非アクティブにする」→「削除する」の順に処理
2. IAMユーザーの追加セキュリティ
- コンソールアクセス設定
- IAMコンソールに移動し、Terraformで作成したユーザーを選択
- 「セキュリティ認証情報」タブを選択
- 「コンソールアクセス」で「有効」をクリック
- パスワードを設定し、初回ログイン時にパスワード変更を要求する
- 管理者ユーザーのMFA有効化
- 作成した管理者ユーザーでログイン
- IAMユーザー自身のセキュリティ認証情報で、MFAを有効化
無料枠活用のための追加設定
AWS Cost Explorer設定
Cost Explorerを有効化して、無料枠の使用状況をリアルタイムで監視することが重要です:
- AWS Cost Management コンソールに移動
- Cost Explorerへアクセスして有効化
- 「無料利用枠」セクションを定期的に確認
特に注目すべきは:
- リソースごとの使用量可視化
- 無料枠に対する使用率
- 予測される使用量と超過予測
Trusted Advisorの活用
AWSが提供する無料のベストプラクティスチェックツールです:
- AWS Trusted Advisor コンソールに移動
- 無料プランで利用可能な以下のチェック項目を確認:
- セキュリティリスクの検出
- コスト最適化の提案
- パフォーマンス向上のヒント
- サービス制限の確認
- 耐障害性の確認
定期的なセキュリティチェックの習慣化
IAM認証情報レポートの確認
IAM認証情報レポートは、すべてのユーザーの認証情報状態を一覧で確認できる強力なツールです:
- IAMコンソールの「認証情報レポート」タブを選択
- 「レポートのダウンロード」をクリック
- 以下を確認:
- 未使用の長期認証情報の特定と削除
- MFA未設定アカウントの検出
- パスワード変更日時の管理
IAM Access Advisorの活用
実際に使用されていない権限を特定し、最小権限の原則を徹底するための機能です:
- IAMコンソールの各ユーザー、ロール、グループの詳細ページを開く
- 「アクセスアドバイザー」タブを選択
- 以下の確認を実施:
- 過去の権限使用履歴の確認
- 不要な権限の削除と最適化
- 定期的な権限レビューの実施
コスト抑制のためのベストプラクティス
- リソースタグの徹底管理
- プロジェクト、環境、所有者などを明確に記録
- コスト配分の可視化
- タグポリシーの一貫性確保
- 未使用リソースの定期的な削除
- 開発完了後のクリーンアップ習慣化
- 以下のようなリソースを特に注意して管理:
- 停止中のEC2インスタンス
- 未使用のEBSボリューム
- 古いAMI(Amazon Machine Image)
- 古いスナップショット
- 自動停止スケジュールの活用
- EC2インスタンスの業務時間外自動停止
- 開発環境の週末自動停止
- Lambda関数を使用した自動化
- S3ライフサイクルポリシーの活用
- 古いログや不要データの自動削除
- 低頻度アクセスストレージへの自動移行
- 複数バージョンの自動整理
- アラートへの迅速な対応
- コスト超過通知を受けたら即座に調査
- 定期的な使用状況の確認習慣
- 異常な使用パターンの早期発見
トラブルシューティング
CloudTrailの設定エラー
問題: Error: creating CloudTrail: InsufficientS3BucketPolicyException
解決策:
- S3バケットポリシーが正しく適用されていることを確認
- 以下のコマンドでTerraformの実行順序を確認
terraform apply -target=aws_s3_bucket_policy.cloudtrail
terraform apply
AWS Configの設定エラー
問題: Error: error creating Config Delivery Channel: InvalidDeliveryChannelNameException
解決策:
- AWS Configが既に手動で設定されていないか確認
- 既存の設定がある場合はAWSコンソールから削除後に再実行
予算アラートのメール不達
問題: 予算通知メールが届かない
解決策:
- 指定したメールアドレスの確認と修正
- AWS Budgets通知設定の購読確認メールをチェック
- スパムフォルダの確認
まとめと次のステップ
このTerraformスクリプトと手動設定手順により、AWS無料枠内で堅牢なセキュリティ基盤を構築できます。これにより、コストを発生させることなく、クラウド環境の基本的なセキュリティを確保できます。
次のステップとしては:
- 実際のアプリケーションリソース(EC2、RDS等)の追加
- CI/CDパイプラインとの連携
- セキュリティ監視の強化
- バックアップ戦略の構築
AWS無料枠の特性と制限を理解し、適切に活用することで、コスト効率の高いクラウド環境を構築・運用することができます。特に初心者の方は、この記事で紹介した基盤を整えてから、徐々に必要なリソースを追加していくアプローチがおすすめです。
本記事で紹介したTerraformスクリプトは、コピーして利用可能です。また、AWS無料枠の詳細は公式サイトでご確認ください。
コメント