1. この記事について(6回シリーズ)
この記事は【AWS Fargate】実務的な設計フロー学習シリーズの第5-2弾(最終回) です。
| 記事 | タイトル | 内容 |
|---|---|---|
| 第1弾 | 設計思考編 | なぜ設計が先なのか |
| 第2弾 | 図解編 | 構成図・フロー図・シーケンス図 |
| 第3弾 | パラメータ設計編 | Terraformパラメータ設計 |
| 第4弾 | Terraform実装編 | コード作成からplan成功まで |
| 第5-1弾 | 実装編 | apply〜アクセス確認 |
| 第5-2弾 | 運用・削除編 | トラブルシューティング〜destroy |
📁 完全なコードはGitHubで公開:GitHub: fargate-iac01
2. はじめに
2-1. この記事の位置づけ
第1弾で学んだ8ステップのうち、この記事ではSTEP 8(実装の後半) を扱います。
| STEP | 工程 | 記事 | 状態 |
|---|---|---|---|
| 1-7 | グランドデザイン〜IaC設計 | 第1弾〜第3弾 | ✅ 完了 |
| 8(前半) | 実装(コード作成〜plan) | 第4弾 | ✅ 完了 |
| 8(中盤) | 実装(apply〜アクセス確認) | 第5-1弾 | ✅ 完了 |
| 8(後半) | トラブルシューティング〜destroy | 第5-2弾(この記事) | 📝 今ここ |
今回のゴール:
- よくある問題の対処法を学ぶ
- terraform destroyでリソースを削除する
- コストを確認する
2-2. 前回のおさらい
第5-1弾では、terraform applyを実行し、Apacheコンテナへのアクセスまで成功しました。
| 達成項目 | 状態 |
|---|---|
| ✅ ECR Repository作成 | apply -targetで先行作成 |
| ✅ Dockerイメージpush | Apache httpdイメージを配置 |
| ✅ インフラ構築 | VPC、ECS等15個のリソース作成 |
| ✅ Fargateタスク起動 | コンテナが正常に起動 |
| ✅ アクセス確認 | ブラウザでApache画面表示 |
第5-1弾で実現したこと:
- インターネットからApacheにアクセスできる環境
- ECRからコンテナイメージを取得してFargateで起動
- Public IPでHTTPアクセス可能
次は、トラブルシューティングとリソース削除を学びます。
2-3. この記事で得られるもの
| 得られること | 説明 |
|---|---|
| ✅ トラブルシューティング | よくある問題と解決方法 |
| ✅ リソース確認 | AWS各サービスでの確認方法 |
| ✅ destroy実行 | 安全なリソース削除手順 |
| ✅ コスト確認 | 課金の確認と停止 |
3. トラブルシューティング
実際の構築では、様々な問題に遭遇します。
よくある問題と解決方法を見ていきましょう。
3-1. ケース1:タスクが起動しない
3-1-1. 症状
fargate-terraform $ aws ecs list-tasks --cluster fargate-terraform-cluster --service-name fargate-terraform-service
{
"taskArns": []
}
タスクのARNが返ってこない。
3-1-2. 原因と対処法
| 原因 | 確認方法 | 対処法 |
|---|---|---|
| ECRにイメージがない | aws ecr describe-images --repository-name apache-repo |
イメージをpush |
| タスク定義が間違っている | CloudWatch Logsでエラー確認 | タスク定義を修正 |
| IAM Roleの権限不足 | CloudWatch Logsでエラー確認 | ecsTaskExecutionRoleを確認 |
3-1-3. CloudWatch Logsで確認
# ロググループを確認
fargate-terraform $ aws logs describe-log-groups \
--log-group-name-prefix /ecs/fargate-terraform-task
# ログストリームを確認
fargate-terraform $ aws logs describe-log-streams \
--log-group-name /ecs/fargate-terraform-task \
--order-by LastEventTime \
--descending \
--max-items 1
# ログの内容を確認
fargate-terraform $ aws logs tail /ecs/fargate-terraform-task --follow
よくあるエラー:
CannotPullContainerError: Error response from daemon:
pull access denied for 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/apache-repo,
repository does not exist or may require 'docker login'
→ ECRにイメージがない、またはリポジトリ名が間違っている
3-2. ケース2:アクセスできない(タスクは起動している)
3-2-1. 症状
$ curl http://$PUBLIC_IP
curl: (7) Failed to connect to 54.123.45.67 port 80: Connection refused
3-2-2. 原因と対処法
| 原因 | 確認方法 | 対処法 |
|---|---|---|
| Security Groupで80番が閉じている | aws ec2 describe-security-groups --group-ids sg-xxx |
ingress ruleを確認 |
| パブリックIPが割り当てられていない | aws ec2 describe-network-interfaces --network-interface-ids eni-xxx |
assign_public_ip = true を確認 |
| コンテナが起動していない | CloudWatch Logsでエラー確認 | コンテナの設定を確認 |
3-2-3. Security Groupの確認
# Security Groupのルールを確認
fargate-terraform $ aws ec2 describe-security-groups \
--group-ids $(terraform output -raw security_group_id) \
--query 'SecurityGroups[0].IpPermissions'
[
{
"FromPort": 80,
"IpProtocol": "tcp",
"IpRanges": [
{
"CidrIp": "0.0.0.0/0"
}
],
"ToPort": 80
}
]
80番ポートが開いている ✅
3-3. ケース3:タスクが頻繁に再起動する
3-3-1. 症状
fargate-terraform $ aws ecs describe-services \
--cluster fargate-terraform-cluster \
--services fargate-terraform-service \
--query 'services[0].events[0:5]'
[
{
"message": "service fargate-terraform-service has reached a steady state.",
"createdAt": "2024-01-15T12:35:00+09:00"
},
{
"message": "(service fargate-terraform-service) has stopped 1 running tasks",
"createdAt": "2024-01-15T12:34:30+09:00"
},
...
]
3-3-2. 原因と対処法
| 原因 | 対処法 |
|---|---|
| ヘルスチェック失敗 | ALB使用時はTarget Groupの設定を確認 |
| メモリ不足 | タスク定義のメモリを増やす |
| コンテナの異常終了 | CloudWatch Logsでエラー確認 |
4. terraform destroy(リソース削除)
4-1. destroy前の確認
| 確認項目 | 内容 |
|---|---|
| ⚠️ ECRイメージ | destroyではECRイメージは削除されない |
| ⚠️ CloudWatch Logs | destroyではログは削除されない |
| ⚠️ tfstateファイル | バックアップを取る |
4-2. ECRイメージの削除
# ECRイメージを削除
fargate-terraform $ aws ecr batch-delete-image \
--repository-name apache-repo \
--image-ids imageTag=latest
{
"imageIds": [
{
"imageDigest": "sha256:xxxxxxxxxx...",
"imageTag": "latest"
}
],
"failures": []
}
4-3. destroy実行
fargate-terraform $ terraform destroy
Terraform used the selected providers to generate the following execution plan.
Resource actions are indicated with the following symbols:
- destroy
Terraform will perform the following actions:
# aws_vpc.main will be destroyed
- resource "aws_vpc" "main" {
- cidr_block = "10.0.0.0/16" -> null
...
}
# ... (他のリソースも表示)
Plan: 0 to add, 0 to change, 12 to destroy.
Do you really want to destroy all resources?
Terraform will destroy all the resources in your state file.
Enter a value: yes
aws_ecs_service.main: Destroying... [id=arn:aws:ecs:ap-northeast-1:123456789012:service/fargate-terraform-cluster/fargate-terraform-service]
aws_ecs_service.main: Still destroying... [10s elapsed]
aws_ecs_service.main: Still destroying... [20s elapsed]
aws_ecs_service.main: Destruction complete after 28s
aws_ecs_task_definition.main: Destroying...
aws_ecs_cluster.main: Destroying...
aws_security_group.fargate: Destroying...
aws_ecs_task_definition.main: Destruction complete after 1s
aws_ecs_cluster.main: Destruction complete after 1s
aws_security_group.fargate: Destruction complete after 2s
aws_subnet.public: Destroying...
aws_route_table_association.public: Destroying...
aws_internet_gateway.main: Destroying...
aws_subnet.public: Destruction complete after 1s
aws_internet_gateway.main: Destruction complete after 2s
aws_vpc.main: Destroying...
aws_vpc.main: Destruction complete after 1s
Destroy complete! Resources: 12 destroyed.
所要時間: 約30秒〜1分
4-4. destroy後の確認
# リソースの確認
fargate-terraform $ terraform state list
aws_ecr_repository.main #=> ECRリポジトリが残っている
# AWS上でも確認
fargate-terraform $ aws ecs list-clusters
{
"clusterArns": []
}
fargate-terraform $ aws ec2 describe-vpcs --filters "Name=tag:Name,Values=fargate-terraform-vpc"
{
"Vpcs": []
}
全リソースが削除された ✅
4-5. ECRリポジトリの削除
# ECRリポジトリを削除(イメージ削除後)
fargate-terraform $ aws ecr delete-repository \
--repository-name apache-repo \
--force
{
"repository": {
"repositoryArn": "arn:aws:ecr:ap-northeast-1:123456789012:repository/apache-repo",
"registryId": "123456789012",
"repositoryName": "apache-repo",
"repositoryUri": "123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/apache-repo"
}
}
5. シリーズ総括:設計→実装の流れを振り返り
5-1. 全5回で学んだこと
| 記事 | 学んだこと |
|---|---|
| 第1弾 | なぜGUIから始めてはいけないのか、設計7割・実装3割の考え方 |
| 第2弾 | 4種類の図(基本構成図、詳細構成図、フロー図、シーケンス図)の使い分け |
| 第3弾 | Terraformパラメータ設計、変数化の判断基準、outputs.tfの考え方 |
| 第4弾 | Terraformコード作成、terraform plan |
| 第5弾 | terraform apply、ECR操作、アクセス確認、トラブルシューティング、terraform destroy |
5-2. 実務で使えそうな成果物
| 成果物 | 用途 |
|---|---|
| グランドデザイン | 要件整理 |
| 基本構成図 | 全体像の把握 |
| 詳細構成図 | 技術要素の理解 |
| フロー図 | データの経路確認 |
| シーケンス図 | 処理順序の理解 |
| GUI版パラメータ表 | GUI実装時の参照 |
| Terraform用パラメータ表 | IaC実装時の参照 |
| Terraformコード | 実際の実装 |
5-3. 設計工程を料理で振り返る
| 料理のたとえ | 設計フローの対応 |
|---|---|
| 何人分?どんな味? | グランドデザイン(要件整理) |
| キッチンの間取り | 基本構成図 |
| 調理台の詳細配置 | 詳細構成図 |
| 食材の動線 | フロー図 |
| 調理のタイムテーブル | シーケンス図 |
| 材料の分量表 | パラメータ表 |
| レシピの清書 | Terraformコード |
| 実際の調理 | terraform apply |
| 味見 | アクセス確認 |
| 後片付け | terraform destroy |
6. 次の学習テーマ考察(備忘録)
6-1. マルチAZ化
| 項目 | 変更内容 |
|---|---|
| Subnet | Public Subnet × 2(1a、1c) |
| タスク数 | desired_count = 2 |
| ALB | Application Load Balancer追加 |
| Target Group | ヘルスチェック設定 |
6-2. 本番環境への展開
| 項目 | 変更内容 |
|---|---|
| Private Subnet | Private Subnet × 2追加 |
| NAT Gateway | NAT Gateway × 2追加 |
| RDS | データベース追加 |
| S3 | 静的コンテンツ配信 |
| CloudFront | CDN追加 |
| Route53 | 独自ドメイン設定 |
6-3. Terraformのベストプラクティス
| 項目 | 内容 |
|---|---|
| tfstateのリモート管理 | S3 + DynamoDB でstate管理 |
| モジュール化 | dev/stg/prdで共通モジュール使用 |
| 変数の階層化 | 環境別のtfvarsファイル |
| CI/CD | GitHub Actions / GitLab CI でterraform plan/apply自動化 |
| セキュリティ | tfstateの暗号化、変数の管理 |
7. まとめ
7-1. この記事で実践したこと
| 項目 | 内容 |
|---|---|
| ✅ terraform apply | 15個のリソースを作成 |
| ✅ ECR操作 | Dockerイメージのpush |
| ✅ アクセス確認 | ブラウザでApacheにアクセス |
| ✅ トラブルシューティング | よくある問題と解決方法 |
| ✅ terraform destroy | 全リソースを削除 |
7-2. 実務で活きる場面
この設計フローは、以下のような実務シーンで活きてきます:
| シーン | 活用方法 |
|---|---|
| 新規案件 | 要件定義・設計フェーズでグランドデザイン・構成図作成 |
| 設計レビュー | 構成図とパラメータ表でレビュー |
| 実装 | パラメータ表をもとにGUI/Terraform実装 |
| トラブル対応 | フロー図・シーケンス図で切り分け |
| 引き継ぎ | ドキュメント(図・パラメータ表・コード)で説明 |
7-3. 設計7割、実装3割の意味
| フェーズ | 時間配分 | 理由 |
|---|---|---|
| 設計 | 70% | 後戻りを防ぐ、レビューしやすい、再利用できる |
| 実装 | 20% | 設計があればスムーズ |
| テスト | 10% | 設計通りか確認 |
設計に時間をかけることで、実装がスムーズになり、全体の工数が減る
8. 参考リンク
(シリーズ完結)