AWS初心者向け:リソース構築で遭遇しがちな技術的問題と対策
1. IAMの権限設定ミス
問題の概要:
AWSのリソースにアクセスしようとした際に「Access Denied(アクセス拒否)」というエラーが出て、操作ができない。
原因:
IAM(Identity and Access Management)は、AWSリソースへのアクセス権限を管理するサービスです。ユーザーやロールに対して、必要な権限を与えるポリシーが適切に設定されていないと、意図せずアクセスが拒否されてしまいます。逆に、必要以上の権限を与えすぎてしまうのもセキュリティ上のリスクになります。
具体的な状況:
- EC2インスタンスを起動しようとしたら「Access Denied」になった。
- S3バケットの中身を見ようとしたらエラーになった。
- Lambda関数を実行しようとしたら権限エラーで失敗した。
対策:
- 最小権限の原則: 必要な権限だけを与えるようにポリシーを設定しましょう。最初は最低限の権限から始めて、必要に応じて徐々に追加していくのがおすすめです。
- ポリシーの確認: IAMコンソールで、ユーザーやロールにアタッチされているポリシーの内容をしっかり確認しましょう。AWSが提供する「AWS Managed Policy」を参考に、適切なポリシーを選ぶのも良い方法です。
- IAMシミュレーター: 実際にポリシーを適用する前に、IAMシミュレーターを使って、意図したとおりの権限が付与されているかテストできます。
2. セキュリティグループの誤設定
問題の概要:
EC2インスタンスやRDSデータベースにアクセスしようとしても、接続がタイムアウトしたり拒否されたりする。
原因:
セキュリティグループは、AWSリソースへのネットワークアクセスを制御するファイアウォールのようなものです。インバウンド(外部からリソースへのアクセス)ルールとアウトバウンド(リソースから外部へのアクセス)ルールを設定しますが、この設定が適切でないと、必要な通信がブロックされてしまいます。
具体的な状況:
- EC2インスタンスにSSH接続しようとしてもタイムアウトする。
- WebブラウザからEC2上のWebサイトにアクセスできない。
- RDSデータベースにSQLクライアントから接続できない。
対策:
- ルールの確認: セキュリティグループの設定画面で、インバウンドルールとアウトバウンドルールを見直しましょう。必要なポート(SSHなら22番、HTTPなら80番、HTTPSなら443番など)が許可されているか確認します。
- 送信元IPアドレスの制限: インバウンドルールで、アクセスを許可する送信元IPアドレスを制限することで、セキュリティを高めることができます。最初は自分のIPアドレスのみを許可する設定から始めるのも良いでしょう。
- セキュリティグループの関連付け: EC2インスタンスやRDSデータベースを作成する際に、適切なセキュリティグループが関連付けられているか確認しましょう。
3. VPC/サブネットの設定不備
問題の概要:
EC2インスタンスがインターネットに接続できなかったり、異なるサブネット間の通信がうまくいかなかったりする。
原因:
VPC(Virtual Private Cloud)は、AWS上にプライベートなネットワーク空間を作るサービスです。サブネットは、VPCをさらに分割したネットワークの区画です。VPCやサブネットのCIDRブロック(IPアドレスの範囲)、ルートテーブル(ネットワークの経路情報)の設定ミスがあると、意図したネットワーク構成にならず、通信問題が発生します。
具体的な状況:
- パブリックサブネットに作成したはずのEC2インスタンスが、インターネットに接続できない。
- プライベートサブネットにあるEC2インスタンスから、インターネットに出られない。
- 異なるサブネットにあるEC2インスタンス同士で通信できない。
対策:
- VPCウィザードの活用: VPCを初めて作成する場合は、VPCウィザードを使うと、一般的な構成を簡単に作成できます。
- ルートテーブルの確認: 各サブネットに関連付けられているルートテーブルの設定を確認しましょう。インターネットゲートウェイへのルートや、VPC内のルートが正しく設定されているか確認します。
- CIDRブロックの確認: VPCとサブネットのCIDRブロックが適切に設定されているか、重複がないか確認しましょう。
4. CloudFormationテンプレートのエラー
問題の概要:
CloudFormationテンプレートを使ってスタックを作成・更新しようとしたらエラーが発生し、リソースが作成できなかったり、更新が途中で止まってしまったりする。
原因:
CloudFormationは、AWSリソースの構成をコードで記述し、自動的に作成・管理できるサービスです。テンプレートに記述ミス(タイプミス、構文エラーなど)があったり、リソース間の依存関係を正しく記述できていないと、スタックの作成や更新に失敗します。
具体的な状況:
- テンプレートをアップロードしたら構文エラーで弾かれた。
- スタック作成中に「ロールバック」して失敗した。
- スタック更新中にエラーが発生して更新が途中で止まった。
対策:
- テンプレートのバリデーション: CloudFormationコンソールでテンプレートをアップロードする前に、「テンプレートの検証」を実行して、構文エラーがないか確認しましょう。
- エラーメッセージの確認: スタック作成・更新に失敗した場合は、CloudFormationコンソールのイベントログでエラーメッセージを確認し、原因を特定しましょう。
- テンプレートの分割: 複雑なテンプレートは、複数の小さなテンプレートに分割することで、管理しやすく、エラーも特定しやすくなります。
- AWS SAM CLIの利用: AWS SAM CLIを使うと、ローカル環境でテンプレートの検証やテストができます。
5. S3バケットポリシー/CORS設定の問題
問題の概要:
S3バケットにファイルをアップロードしようとしたり、ダウンロードしようとしたりするとエラーになる。WebサイトからS3バケット内のファイルにアクセスしようとするとエラーになる。
原因:
S3バケットポリシーは、バケットやオブジェクトへのアクセス権限を制御する設定です。CORS(Cross-Origin Resource Sharing)は、異なるオリジン(ドメイン)からWebブラウザ経由でS3リソースにアクセスできるようにするための設定です。これらの設定が正しくないと、意図したアクセスが許可されず、エラーが発生します。
具体的な状況:
- ファイルをS3バケットにアップロードしようとしたら「Access Denied」になった。
- WebサイトからS3バケット内の画像を表示しようとしたらエラーになった。
- JavaScriptからS3バケットにファイルをアップロードしようとしたらCORSエラーになった。
対策:
- バケットポリシーの確認: S3コンソールでバケットポリシーの設定を確認し、必要なアクセス権限が付与されているか確認しましょう。
- CORS設定の確認: WebサイトからS3にアクセスする場合は、CORS設定が適切に設定されているか確認しましょう。アクセスを許可するオリジン(ドメイン)やHTTPメソッドなどを設定します。
- パブリックアクセス設定: S3バケットをパブリックに公開する場合は、「パブリックアクセス設定」を適切に設定する必要があります。意図しない公開を防ぐために、設定内容をよく理解してから変更しましょう。
6. EC2インスタンスへのSSH接続失敗
問題の概要:
EC2インスタンスにSSHでリモートアクセスしようとしても、接続がタイムアウトしたり拒否されたりする。
原因:
SSH接続失敗の原因は多岐にわたりますが、主な原因としては、キーペアの設定ミス、セキュリティグループのルール不足、ネットワーク設定の問題などが挙げられます。
具体的な状況:
- SSHコマンドを実行しても「Connection timed out」になる。
- 「Permission denied (publickey)」というエラーメッセージが表示される。
- そもそもインスタンスにpingが通らない。
対策:
- キーペアの確認: EC2インスタンス作成時に指定したキーペアの秘密鍵(.pemファイル)が手元にあるか、正しいキーペアを指定しているか確認しましょう。
- セキュリティグループの確認: セキュリティグループのインバウンドルールで、SSH(ポート22番)が許可されているか、送信元IPアドレスが適切に設定されているか確認しましょう。
- ネットワーク設定の確認: インスタンスがパブリックIPアドレスを持っているか、サブネットのルートテーブル設定が正しいかなど、ネットワーク設定を確認しましょう。
- EC2シリアルコンソール: どうしてもSSH接続できない場合は、EC2シリアルコンソールからインスタンスにアクセスできる場合があります。
7. Lambda関数のタイムアウト・メモリ不足
問題の概要:
Lambda関数を実行すると、途中でタイムアウトしたり、メモリ不足でエラーになったりする。
原因:
Lambda関数には、実行時間とメモリ使用量に制限があります。関数の処理内容が複雑だったり、時間がかかりすぎたり、多くのメモリを消費したりすると、これらの制限を超えてしまい、エラーが発生します。
具体的な状況:
- Lambda関数が実行時間が長すぎてタイムアウトする。
- 「OutOfMemoryError」というエラーメッセージが表示される。
- Lambda関数の実行ログにエラーが出力されている。
対策:
- タイムアウト設定の見直し: Lambda関数の設定で、タイムアウト時間を必要に応じて長く設定しましょう。ただし、無闇に長くするのではなく、処理時間を見積もって適切な値を設定することが重要です。
- メモリ設定の見直し: Lambda関数の設定で、メモリ割り当て量を増やしてみましょう。メモリを増やすことで、処理速度が向上し、タイムアウトを回避できる場合もあります。
- コードの最適化: Lambda関数のコードを見直し、処理効率を上げるように改善しましょう。不要な処理を削除したり、アルゴリズムを見直したりすることで、実行時間やメモリ使用量を削減できます。
- 非同期処理の検討: 時間のかかる処理は、Lambda関数内で完結させるのではなく、SQSやStep Functionsなどのサービスと連携して、非同期処理にすることを検討しましょう。
8. API Gatewayとの統合エラー
問題の概要:
API Gatewayを使ってAPIを作成し、バックエンド(Lambda関数やEC2インスタンスなど)と統合しようとしたら、リクエストが正しく処理されなかったり、エラーレスポンスが返ってきたりする。
原因:
API Gatewayとバックエンドの統合設定や、リクエスト・レスポンスのマッピング設定がうまくいっていないと、APIが正常に動作しません。設定ミスや理解不足が原因であることが多いです。
具体的な状況:
- API Gatewayにリクエストを送信しても、バックエンドにリクエストが届いていない。
- API Gatewayからエラーレスポンス(5xxエラーなど)が返ってくる。
- バックエンドからのレスポンスが、API Gatewayで期待どおりに変換されていない。
対策:
- 統合設定の確認: API Gatewayのコンソールで、統合設定(バックエンドのURL、HTTPメソッド、タイムアウトなど)が正しく設定されているか確認しましょう。
- マッピングテンプレートの確認: リクエストとレスポンスのマッピングテンプレートを確認し、データ変換が意図どおりに行われているか確認しましょう。
- テスト実行: API Gatewayコンソールで「テスト」機能を使って、APIの動作確認を行いましょう。リクエストパラメータやボディを自由に設定して、バックエンドのレスポンスを確認できます。
- CloudWatch Logsの確認: API Gatewayの実行ログ(CloudWatch Logs)を確認し、エラーメッセージや詳細なログ情報を確認しましょう。
9. RDS接続/セキュリティグループの問題
問題の概要:
アプリケーションからRDSデータベースに接続しようとしても、接続エラーが発生して接続できない。
原因:
RDSデータベースへの接続問題は、セキュリティグループの設定ミスが最も多い原因です。他にも、VPC設定、ネットワークACL、認証情報の間違いなどが考えられます。
具体的な状況:
- アプリケーションからデータベース接続を試みるとタイムアウトする。
- 「Connection refused」や「Access denied」などのエラーメッセージが表示される。
- RDSインスタンスのエンドポイントにpingが通らない。
対策:
- セキュリティグループの確認: RDSインスタンスに関連付けられているセキュリティグループのインバウンドルールを確認しましょう。アプリケーションが動作するEC2インスタンスやLambda関数からの接続を許可するルールが必要です。ポート番号(MySQLなら3306、PostgreSQLなら5432など)も確認しましょう。
- VPC設定の確認: RDSインスタンスとアプリケーションが同じVPC内にあるか確認しましょう。異なるVPCにある場合は、VPCピアリングやTransit Gatewayなどの設定が必要です。
- ネットワークACLの確認: サブネットに適用されているネットワークACLの設定も確認しましょう。セキュリティグループだけでなく、ネットワークACLでも通信がブロックされている可能性があります。
- 認証情報の確認: データベース接続に必要なエンドポイント、ポート番号、ユーザー名、パスワードが正しいか確認しましょう。
10. Elastic Load Balancerの健康チェック設定ミス
問題の概要:
Elastic Load Balancer(ELB)を使用しているのに、正常なEC2インスタンスが「OutOfService(サービス停止)」と判定されて、リクエストがルーティングされない。
原因:
ELBの健康チェック設定(ヘルスチェック)が適切でないと、正常なインスタンスを誤って「異常」と判定してしまうことがあります。ヘルスチェックの設定(パス、ポート、タイムアウト時間など)が、アプリケーションの状態と合っていないことが原因です。
具体的な状況:
- ELBのターゲットグループで、正常に動作しているはずのEC2インスタンスが「unhealthy(異常)」と表示されている。
- Webサイトにアクセスしても、時々エラーページが表示される。
- ELBのログを見ると、ヘルスチェックが失敗していることがわかる。
対策:
- ヘルスチェック設定の確認: ELBのターゲットグループ設定で、ヘルスチェックの設定(プロトコル、ポート、パス、ステータスコードなど)がアプリケーションの状態と合っているか確認しましょう。
-
ヘルスチェックパスの確認: ヘルスチェックのパス(例:
/healthcheck
や/api/health
)が、実際にアプリケーションでヘルスチェック用のエンドポイントとして実装されているか確認しましょう。 - タイムアウト時間、間隔、再試行回数の調整: ヘルスチェックのタイムアウト時間や間隔、再試行回数を、アプリケーションの起動時間やレスポンス時間に合わせて調整しましょう。
- セキュリティグループの確認: ELBからEC2インスタンスへのヘルスチェック通信が、セキュリティグループで許可されているか確認しましょう。
11. Auto Scalingグループの設定不備
問題の概要:
Auto Scalingグループを設定したのに、EC2インスタンスが自動的にスケールアウト(台数が増える)したり、スケールイン(台数が減る)したりしない。
原因:
Auto Scalingグループの設定(起動設定、スケーリングポリシー、CloudWatchアラームなど)が適切でないと、意図したとおりに自動スケーリングが行われません。設定ミスや理解不足が原因であることが多いです。
具体的な状況:
- CPU使用率が高くなっているのに、EC2インスタンスの台数が増えない。
- 夜間など、アクセス数が減っている時間帯でも、EC2インスタンスの台数が減らない。
- スケーリングポリシーを設定したはずなのに、全くスケールしない。
対策:
- 起動設定(または起動テンプレート)の確認: Auto Scalingグループで使用している起動設定(または起動テンプレート)の内容を確認しましょう。インスタンスタイプ、AMI、セキュリティグループ、キーペアなどが正しく設定されているか確認します。
- スケーリングポリシーの確認: スケーリングポリシー(ターゲット追跡、ステップスケーリング、シンプルスケーリング)の設定を確認しましょう。閾値、集計期間、クールダウン時間などが適切に設定されているか確認します。
- CloudWatchアラームの確認: スケーリングポリシーで使用しているCloudWatchアラームの設定を確認しましょう。メトリクス、閾値、期間などが適切に設定されているか確認します。
- 最小/最大/Desiredキャパシティの確認: Auto Scalingグループの最小キャパシティ、最大キャパシティ、Desiredキャパシティの設定が、意図した範囲になっているか確認しましょう。
- ウォームアップ期間の考慮: 新しく起動したインスタンスが、トラフィックを受け付ける準備が整うまでに時間がかかる場合があります。ウォームアップ期間を考慮して、スケーリングポリシーやヘルスチェックを設定しましょう。
12. Route 53のDNSレコード設定ミス
問題の概要:
Route 53でDNSレコードを設定したのに、Webサイトにアクセスできなかったり、メールが届かなかったりする。
原因:
Route 53のDNSレコード設定ミス(タイプミス、レコードタイプの間違い、値の間違いなど)があると、名前解決が正しく行われず、意図したWebサイトやサービスにアクセスできなくなります。
具体的な状況:
- Webブラウザでドメイン名を入力しても、Webサイトが表示されない。
- メールを送信しても、相手に届かない。
- DNSルックアップツールでドメイン名を調べても、意図したIPアドレスが返ってこない。
対策:
- レコード設定の確認: Route 53コンソールで、DNSレコードの設定(レコード名、レコードタイプ、TTL、値など)を一つずつ丁寧に確認しましょう。タイプミスがないか、レコードタイプが正しいか、値が正しいかなどをチェックします。
- 伝播時間の考慮: DNSレコードを変更した場合、変更がインターネット全体に反映されるまで時間がかかります(伝播時間)。設定変更後、しばらく時間をおいてから動作確認を行いましょう。
-
DNSルックアップツールの利用:
dig
コマンドやnslookup
コマンドなどのDNSルックアップツールを使って、設定したDNSレコードが正しく反映されているか確認しましょう。 - Route 53 ヘルスチェックの活用: Route 53ヘルスチェックを設定することで、エンドポイントの可用性を監視し、異常時には自動的にトラフィックを切り替えることができます。
13. EBSボリュームのアタッチ/パフォーマンス問題
問題の概要:
EC2インスタンスにEBSボリュームをアタッチしたのに、認識されなかったり、ディスクI/Oパフォーマンスが遅かったりする。
原因:
EBSボリュームのアタッチ手順の間違い、ボリュームタイプやサイズの間違い、EC2インスタンスとの互換性の問題などが原因で、EBSボリュームが正しく認識されなかったり、パフォーマンスが低下したりすることがあります。
具体的な状況:
- EC2インスタンスにEBSボリュームをアタッチしたはずなのに、OSから認識されない。
- ディスクI/O処理が非常に遅く、アプリケーションの動作が遅延する。
- EBSボリュームのIOPSやスループットが、期待値よりも低い。
対策:
- アタッチ手順の確認: EBSボリュームをEC2インスタンスにアタッチする手順(コンソールまたはAWS CLI)を正しく行っているか確認しましょう。インスタンスとボリュームが同じアベイラビリティゾーンにある必要があります。
- ボリュームタイプの確認: EBSボリュームのタイプ(gp3, gp2, io2, io1, st1, sc1, standard)が、アプリケーションの要件に合っているか確認しましょう。IOPSやスループットの要件が高い場合は、プロビジョンドIOPSボリューム(io2, io1)を検討しましょう。
- ボリュームサイズの確認: EBSボリュームのサイズが、アプリケーションのデータ量やI/O負荷に対して十分なサイズになっているか確認しましょう。
- Nitro Systemインスタンスの利用: 最新のNitro Systemを搭載したEC2インスタンスタイプは、EBSボリュームのパフォーマンスを最大限に引き出すことができます。
- EBS最適化インスタンスの利用: EBS最適化インスタンスを使用することで、EC2インスタンスとEBSボリューム間のネットワーク帯域幅を最適化し、パフォーマンスを向上させることができます。
14. ネットワークACLの誤設定
問題の概要:
ネットワークACLを設定したら、意図しない通信がブロックされたり、逆に許可されてしまったりする。
原因:
ネットワークACLは、サブネットレベルでネットワークトラフィックを制御するファイアウォールのようなものです。ルールはステートレスで、インバウンドルールとアウトバウンドルールを個別に設定する必要があります。ルール設定ミス(ルール番号、許可/拒否、プロトコル、ポート、送信元/宛先CIDRなど)があると、意図しない通信問題が発生します。
具体的な状況:
- 特定のサブネットからインターネットへのアクセスが突然できなくなった。
- 特定のポートへのアクセスがブロックされてしまった。
- 逆に、意図しないポートへのアクセスが許可されてしまっている。
対策:
- ルールリストの確認: ネットワークACLのルールリストを、ルール番号の小さい順に確認しましょう。ルールは番号の小さい順に評価されます。
- ルールの許可/拒否の確認: 各ルールの許可(ALLOW)/拒否(DENY)の設定が意図どおりになっているか確認しましょう。
- プロトコル、ポート、CIDRの確認: 各ルールのプロトコル、ポート範囲、送信元/宛先CIDRが、意図どおりに設定されているか確認しましょう。
- ステートレスであることの理解: ネットワークACLはステートレスなので、インバウンドルールとアウトバウンドルールを両方設定する必要があります。例えば、HTTPリクエストを許可するインバウンドルールだけでなく、HTTPレスポンスを許可するアウトバウンドルールも必要です。
- セキュリティグループとの違いの理解: セキュリティグループはステートフルでインスタンスレベル、ネットワークACLはステートレスでサブネットレベルという違いを理解し、適切に使い分けましょう。
15. IAMロールの信頼関係設定エラー
問題の概要:
EC2インスタンスやLambda関数にIAMロールをアタッチして、AWSサービスにアクセスさせようとしたら、権限エラーが発生してアクセスできない。
原因:
IAMロールの信頼関係(トラストポリシー)は、どのサービスやエンティティがそのロールを引き受けることができるかを定義する設定です。信頼関係の設定ミス(サービス名のタイプミス、ARNの間違いなど)があると、ロールの引き受けに失敗し、権限エラーが発生します。
具体的な状況:
- EC2インスタンス上のアプリケーションからS3にアクセスしようとしたら「Access Denied」になった。
- Lambda関数からDynamoDBにアクセスしようとしたら権限エラーになった。
- CloudFormationテンプレートでIAMロールを作成しようとしたらエラーになった。
対策:
- 信頼関係ドキュメントの確認: IAMロールの信頼関係ドキュメント(トラストポリシー)の内容を確認しましょう。JSON形式で記述されています。
-
Principal要素の確認: 信頼関係ドキュメントの
Principal
要素で、ロールを引き受けるサービスやエンティティが正しく指定されているか確認しましょう。例えば、EC2インスタンスの場合は"Service": "ec2.amazonaws.com"
、Lambda関数の場合は"Service": "lambda.amazonaws.com"
と指定します。 -
Action要素の確認:
Action
要素で、sts:AssumeRole
アクションが許可されているか確認しましょう。 -
Condition要素の確認: 必要に応じて、
Condition
要素でロールの引き受け条件を細かく設定できます。条件設定が意図どおりになっているか確認しましょう。 - IAMコンソールの利用: IAMコンソールで信頼関係の設定を視覚的に確認・編集することができます。
16. CloudWatchログ/モニタリングの不足
問題の概要:
システムで問題が発生したときに、CloudWatchログやモニタリングが不足していて、原因特定に時間がかかったり、原因が特定できなかったりする。
原因:
CloudWatchは、AWSリソースのモニタリングやログ収集を行うサービスです。適切なログ収集設定やメトリクス監視、アラーム設定がされていないと、問題発生時に状況を把握できず、対応が遅れてしまいます。
具体的な状況:
- Webサイトがダウンしていることに気づくのが遅れた。
- EC2インスタンスのCPU使用率が高止まりしていることに気づかなかった。
- エラーが発生しているのに、ログが残っていなくて原因がわからない。
対策:
- ログ収集設定の確認: CloudWatch LogsエージェントやFluentdなどを使って、EC2インスタンスやアプリケーションのログをCloudWatch Logsに収集する設定を行いましょう。
- メトリクス監視の設定: CloudWatchメトリクスを使って、EC2インスタンスのCPU使用率、メモリ使用率、ディスクI/O、ネットワークI/Oなどの基本的なメトリクスを監視しましょう。RDSやELBなどのマネージドサービスは、自動的にメトリクスが収集されます。
- アラーム設定: CloudWatchアラームを設定して、メトリクスが閾値を超えた場合に通知を受け取れるようにしましょう。メール通知やSlack通知などを設定できます。
- ダッシュボードの作成: CloudWatchダッシュボードを作成して、重要なメトリクスやログを一覧で確認できるようにしましょう。
- ログの保存期間の設定: CloudWatch Logsのロググループごとに、ログの保存期間を設定しましょう。不要なログを削除することで、コストを削減できます。
17. リソースの過剰プロビジョニングによるコスト増加
問題の概要:
必要以上のスペックのリソース(EC2インスタンス、RDSインスタンスなど)を構築してしまい、運用コストが予想以上に高くなってしまう。
原因:
リソースのサイジング(適切なスペックを見積もること)を誤ると、オーバースペックなリソースを構築してしまい、無駄なコストが発生します。特に、開発環境や検証環境では、必要以上に高スペックなリソースは不要なことが多いです。
具体的な状況:
- 月々のAWS利用料金が予想よりも大幅に高くなってしまった。
- EC2インスタンスのCPU使用率が常に低く、リソースを持て余している。
- RDSインスタンスのストレージ使用量が少なく、無駄な領域を確保している。
対策:
- 適切なインスタンスタイプの選択: EC2インスタンスのワークロードに合わせて、適切なインスタンスタイプ(ファミリー、サイズ)を選択しましょう。最初は小さめのインスタンスタイプから始めて、必要に応じてスケールアップしていくのがおすすめです。
- RDSインスタンスのサイジング: RDSインスタンスのCPU、メモリ、ストレージサイズを、アプリケーションの要件に合わせて適切に設定しましょう。
- Auto Scalingの活用: EC2 Auto Scalingを使って、負荷変動に合わせて自動的にインスタンス数を調整することで、コストを最適化できます。
- 不要リソースの削除: 使わなくなったリソース(EC2インスタンス、EBSボリューム、RDSインスタンスなど)は、定期的に削除しましょう。
- AWS Cost Explorerの活用: AWS Cost Explorerを使って、AWS利用料金の内訳や傾向を分析し、コスト削減の余地がないか探りましょう。
- Savings Plans、Reserved Instancesの検討: 長期利用が見込まれるリソースについては、Savings PlansやReserved Instancesを利用することで、大幅な割引を受けることができます。
18. AWSフリーティアの限界誤認
問題の概要:
AWSフリーティアの範囲を超えてリソースを利用してしまい、突然高額な請求が発生してしまう。
原因:
AWSフリーティアは、AWSを無料で試せるお得な制度ですが、利用できるリソースの種類や量、期間に制限があります。フリーティアの制限を正しく理解せずに利用すると、意図せず有料利用となり、高額請求につながることがあります。
具体的な状況:
- フリーティアの範囲内でEC2インスタンスを使っているつもりだったが、インスタンスタイプがフリーティア対象外だった。
- S3バケットに大量のデータを保存してしまい、ストレージ料金が有料になった。
- データ転送料金がフリーティアの範囲を超えてしまい、課金された。
対策:
- フリーティアの利用条件の確認: AWSフリーティアの利用条件(対象サービス、利用量、期間など)を、AWS公式サイトで必ず確認しましょう。
- AWS Cost Explorerの活用: AWS Cost Explorerを使って、フリーティアの使用状況をモニタリングしましょう。フリーティアの利用上限に近づいている場合は、アラートを設定することもできます。
- AWS Budgetsの利用: AWS Budgetsを使って、予算を設定し、予算を超えそうになったらアラートを受け取れるようにしましょう。
- 無料利用枠ダッシュボードの確認: AWSコンソールで「無料利用枠ダッシュボード」を確認すると、フリーティアの利用状況を視覚的に確認できます。
19. 環境変数や設定値のミス
問題の概要:
Lambda関数やECSタスクなどで、環境変数や設定値を誤って設定してしまい、実行時エラーや予期せぬ動作が発生する。
原因:
Lambda関数やECSタスクなどでは、環境変数や設定ファイルを使って、設定値を外部から注入することが一般的です。環境変数名や設定値のタイプミス、値の間違いなどがあると、アプリケーションが正しく動作しません。
具体的な状況:
- データベース接続情報(エンドポイント、ユーザー名、パスワード)を環境変数で設定したが、タイプミスがあり接続エラーになる。
- APIのエンドポイントURLを環境変数で設定したが、URLが間違っていてAPIリクエストが失敗する。
- Lambda関数のタイムゾーンを環境変数で設定したが、設定値の形式が間違っていてタイムゾーンが反映されない。
対策:
- 環境変数名の確認: 環境変数名にタイプミスがないか、大文字小文字が正しいか確認しましょう。
- 設定値のタイプの確認: 設定値が文字列型、数値型、真偽値型など、意図した型になっているか確認しましょう。
- 設定値のバリデーション: アプリケーションコード内で、環境変数や設定値のバリデーション(値のチェック)を行うようにしましょう。不正な値が設定されている場合は、エラーメッセージを出力して処理を中断するようにします。
- 設定管理ツールの利用: AWS Systems Manager Parameter Storeなどの設定管理ツールを使うと、設定値を安全に管理し、アプリケーションに注入することができます。
- Infrastructure as Code (IaC) の導入: CloudFormationやTerraformなどのIaCツールを使って、環境変数や設定値をコードで管理することで、設定ミスを減らすことができます。
20. CloudFormationでの依存関係/順序エラー
問題の概要:
CloudFormationテンプレートでリソース間の依存関係が複雑になり、スタック更新時に循環参照や順序エラーが発生する問題です。
具体的な状況:
- CloudFormationスタックを更新しようとしたらエラーになった。
- エラーメッセージが分かりにくく、原因特定に時間がかかる。
- 複雑なインフラ構成をCloudFormationで管理する場合、依存関係エラーはよく起こります。
原因:
- 循環参照: リソースAがリソースBに依存し、リソースBがリソースAに依存しているなど、依存関係がループしている。
-
依存関係の記述漏れ:
DependsOn
属性などでリソース間の依存関係を正しく記述していない。 - 順序エラー: リソースの作成順序が間違っている(例: 依存されるリソースよりも先に依存するリソースを作成しようとしている)。
- スタック更新時のリソース置換: スタック更新時に、リソースのプロパティ変更によってリソースの置換が発生し、依存関係エラーを引き起こすことがある。
対策:
- 依存関係の整理: リソース間の依存関係を図などで可視化し、整理する。
-
DependsOn属性の活用:
DependsOn
属性を使ってリソース間の依存関係を明示的に記述する。 -
CreationPolicy、DeletionPolicy: リソースの作成ポリシー(
CreationPolicy
)や削除ポリシー(DeletionPolicy
)を適切に設定し、リソースの作成・削除時のエラーを回避する。 - スタック更新時のリソース置換の理解: スタック更新時にリソースの置換が発生する条件を理解し、意図しないリソース置換を避ける(リソースのプロパティ変更は慎重に行う)。
- AWS CloudFormation デザイナー: AWS CloudFormation デザイナーを使って、テンプレートの依存関係を視覚的に確認する。
- スタックの分割: 複雑なスタックを複数の小さなスタックに分割し、依存関係を単純化する(ネストされたスタックやクロススタック参照を活用)。
分かりやすく例えるなら: プラモデルの組み立て説明書のようなものです。
- 部品Aが部品Bにくっつき、部品Bが部品Aにくっつく(循環参照)ような指示があると、組み立てられません。
- 部品同士の接着順序(依存関係)が書かれていないと、組み立てに失敗します。
- 部品の組み立て順序(順序エラー)を間違えると、うまく組み立てられません。
- 古い部品を新しい部品に交換する際(リソース置換)、手順を間違えると、他の部品に影響が出てしまいます。
21. NATゲートウェイ設定の不備
問題の概要:
プライベートサブネットに配置したEC2インスタンスからインターネットへのアウトバウンド通信ができない。
原因:
NATゲートウェイは、プライベートサブネットからインターネットへのアウトバウンド通信を可能にするサービスです。NATゲートウェイの設定が正しくないと、プライベートサブネット内のリソースがインターネットにアクセスできなくなります。
具体的な状況:
- プライベートサブネットのEC2インスタンスから
yum update
やapt-get update
を実行してもタイムアウトする。 - プライベートサブネットのLambda関数から外部APIにアクセスしようとしてもエラーになる。
- プライベートサブネットのリソースからS3などのパブリックなAWSサービスにアクセスできない。
対策:
- NATゲートウェイの作成確認: VPCコンソールで、NATゲートウェイがVPC内に作成されているか確認しましょう。
-
ルートテーブルの確認: プライベートサブネットのルートテーブル設定を確認し、インターネット向けトラフィック(
0.0.0.0/0
)がNATゲートウェイをターゲットに設定されているか確認しましょう。 - NATゲートウェイのセキュリティグループ: NATゲートウェイ自体にはセキュリティグループは関連付けられませんが、プライベートサブネットのセキュリティグループのアウトバウンドルールで、インターネットへの通信が許可されているか確認しましょう。
- パブリックサブネットのルートテーブル: NATゲートウェイはパブリックサブネットに配置する必要があります。パブリックサブネットのルートテーブルにインターネットゲートウェイへのルートがあるか確認しましょう。
22. VPCエンドポイント設定の不備
問題の概要:
プライベートサブネットから、VPCエンドポイント経由でAWSサービス(S3、DynamoDBなど)にアクセスしようとしても、接続できない、またはエラーが発生する。
原因:
VPCエンドポイントは、VPC内から特定のAWSサービスへ、インターネットを経由せずにプライベートに接続するためのサービスです。VPCエンドポイントの設定ミスがあると、プライベートな接続が確立されず、エラーが発生します。
具体的な状況:
- プライベートサブネットのEC2インスタンスからS3バケットにアクセスしようとしたら「Access Denied」になる。
- プライベートサブネットのLambda関数からDynamoDBテーブルにアクセスしようとしたらタイムアウトする。
- VPCエンドポイントを作成したはずなのに、インターネット経由でサービスにアクセスしているように見える(料金が発生しているなど)。
対策:
- VPCエンドポイントの作成確認: VPCコンソールで、VPCエンドポイントがVPC内に作成されているか確認しましょう。対象サービス、VPC、サブネット、セキュリティグループなどが正しく設定されているか確認します。
- VPCエンドポイントのルートテーブル: プライベートサブネットのルートテーブル設定を確認し、対象サービスへのトラフィックがVPCエンドポイントをターゲットに設定されているか確認しましょう。(サービスプレフィックスリスト宛のルートが追加されているか)
- VPCエンドポイントのセキュリティグループ: VPCエンドポイントに関連付けられているセキュリティグループのインバウンドルールで、プライベートサブネットからのアクセスが許可されているか確認しましょう。
- VPCエンドポイントのポリシー: VPCエンドポイントにポリシーが設定されている場合、そのポリシーによってアクセスが制限されていないか確認しましょう。デフォルトではフルアクセスが許可されています。
- DNS設定の確認: プライベートDNSオプションが有効になっているか、DNS解決がVPCエンドポイント経由で行われているか確認しましょう。
23. EFSファイルシステムのマウント失敗
問題の概要:
EC2インスタンスからEFS(Elastic File System)ファイルシステムをマウントしようとしても、マウントに失敗する、またはアクセス権限エラーが発生する。
原因:
EFSファイルシステムのマウント失敗は、セキュリティグループ、ネットワーク設定、アクセス権限、マウントヘルパーのインストールなど、様々な要因が考えられます。
具体的な状況:
-
mount
コマンドを実行してもエラーメッセージが表示されてマウントできない。 - マウントは成功したが、ファイルへの書き込みや読み込みができない(権限エラー)。
- EFSファイルシステムに接続がタイムアウトする。
対策:
- セキュリティグループの確認: EC2インスタンスとEFSのマウントターゲットに関連付けられているセキュリティグループの設定を確認しましょう。NFSプロトコル(ポート2049)での通信が許可されているか確認します。
- ネットワーク設定の確認: EC2インスタンスとEFSマウントターゲットが同じVPC内にあるか、ネットワークACLで通信がブロックされていないか確認しましょう。
- マウントターゲットの確認: EFSファイルシステムにマウントターゲットが作成されており、EC2インスタンスと同じアベイラビリティゾーンのサブネットに関連付けられているか確認しましょう。
-
NFSクライアントのインストール: EC2インスタンスにNFSクライアント(
nfs-common
やnfs-utils
など)がインストールされているか確認しましょう。 -
マウントヘルパーの利用: EFSマウントヘルパー (
amazon-efs-utils
) を利用すると、マウントが容易になります。インストールと設定を確認しましょう。 - IAMロールの確認: IAMロールを使ってEFSへのアクセス制御を行う場合は、EC2インスタンスにアタッチされたIAMロールに適切な権限が付与されているか確認しましょう。
- EFSアクセスポイントの利用: アクセスポイントを利用すると、アクセス権限をより細かく制御できます。アクセスポイントの設定とEC2インスタンスからのマウント設定を確認しましょう。
24. DynamoDBのアクセス問題(IAM以外)
問題の概要:
アプリケーションからDynamoDBにアクセスしようとしても、IAMの権限設定は問題ないはずなのに、接続できない、またはエラーが発生する。
原因:
IAMの権限設定以外にも、DynamoDBへのアクセス問題の原因はいくつか考えられます。リージョン設定の間違い、エンドポイントURLの間違い、ネットワーク設定などが考えられます。
具体的な状況:
- アプリケーションからDynamoDBにアクセスしようとするとタイムアウトする。
- 「Region is incorrect」のようなエラーメッセージが表示される。
- DynamoDBテーブルが存在しないというエラーになる。
対策:
- リージョン設定の確認: アプリケーションがDynamoDBにアクセスする際のリージョン設定が、DynamoDBテーブルを作成したリージョンと一致しているか確認しましょう。AWS SDKなどでリージョンを明示的に設定する必要があります。
- エンドポイントURLの確認: エンドポイントURLを直接指定している場合は、URLが正しいか確認しましょう。通常はリージョンを指定すれば自動的にエンドポイントが決定されます。
- ネットワーク設定の確認: アプリケーションが動作している環境(EC2インスタンス、Lambda関数など)から、DynamoDBのエンドポイントにネットワーク的に到達可能か確認しましょう。セキュリティグループやネットワークACLで通信がブロックされていないか確認します。
- DynamoDBテーブル名の確認: アプリケーションコードで指定しているDynamoDBテーブル名が、実際に作成したテーブル名と一致しているか確認しましょう。大文字小文字も区別されます。
- AWS SDKの設定確認: AWS SDKのバージョンが古い場合、最新の機能やリージョンに対応していない可能性があります。最新バージョンにアップデートしてみましょう。
25. SQS/SNSの設定ミスによるメッセージングエラー
問題の概要:
SQS(Simple Queue Service)やSNS(Simple Notification Service)を使ってメッセージングシステムを構築したが、メッセージが正常に送信・受信されない、またはエラーが発生する。
原因:
SQSやSNSの設定ミスは、アクセス権限ポリシー、キュー/トピックの設定、サブスクリプション設定など、多岐にわたります。設定が正しくないと、メッセージの送受信に失敗したり、意図しない動作になったりします。
具体的な状況:
- メッセージをSQSキューに送信しても、受信側でメッセージが処理されない。
- SNSトピックにメッセージをPublishしても、サブスクライバーに通知が届かない。
- SQSキューにメッセージが溜まり続けて処理が追いつかない。
- SNSトピックからサブスクリプションを削除したはずなのに、まだ通知が届いてしまう。
対策:
- アクセス権限ポリシーの確認: SQSキューポリシーやSNSトピックポリシーを確認し、メッセージの送信、受信、Publish、Subscribeなどの必要なアクションが、適切なプリンシパル(ユーザー、ロール、AWSアカウントなど)に許可されているか確認しましょう。
- キュー/トピック設定の確認: SQSキューの設定(可視性タイムアウト、メッセージ保持期間、デッドレターキューなど)や、SNSトピックの設定(配信ポリシー、メッセージ属性など)が意図どおりになっているか確認しましょう。
- サブスクリプション設定の確認: SNSサブスクリプションの設定(プロトコル、エンドポイント、フィルタリングポリシーなど)が正しいか確認しましょう。特に、エンドポイントURLのタイプミスや、プロトコルの選択ミスが多いです。
- デッドレターキューの設定: SQSキューでデッドレターキューを設定している場合、メッセージがデッドレターキューに移動していないか確認しましょう。エラーの原因がデッドレターキューのメッセージからわかる場合があります。
- CloudWatchメトリクスの確認: SQSやSNSのCloudWatchメトリクス(NumberOfMessagesSent, NumberOfMessagesReceived, NumberOfMessagesVisibleなど)を監視し、メッセージの送受信状況やエラー発生状況を確認しましょう。
26. ECS/Fargateタスク定義のエラー
問題の概要:
ECS(Elastic Container Service)やFargateでコンテナを実行しようとしたが、タスクが起動しない、または起動してもすぐに停止してしまう。
原因:
ECS/Fargateタスク定義のエラーは、コンテナイメージの問題、リソース設定の不足、ネットワーク設定の問題、ログ設定の問題など、多岐にわたります。
具体的な状況:
- ECSタスクが「PENDING」状態から進まない。
- ECSタスクが起動後すぐに「STOPPED」状態になる。
- ECSタスクのログがCloudWatch Logsに出力されない。
- コンテナイメージのPullに失敗する。
対策:
- タスク定義の確認: ECSタスク定義の内容(コンテナイメージ名、ポートマッピング、環境変数、リソース制限、ログ設定など)を丁寧に確認しましょう。タイプミスや設定漏れがないかチェックします。
- コンテナイメージの確認: 指定したコンテナイメージが、ECR(Elastic Container Registry)やDocker Hubに存在するか、イメージ名やタグが正しいか確認しましょう。プライベートリポジトリの場合は、認証設定も必要です。
- リソース制限の確認: タスクに割り当てるCPUやメモリのリソース制限が、コンテナの要件に対して十分か確認しましょう。メモリ不足でコンテナがOOM Killされることもあります。
- ネットワーク設定の確認: タスクがVPC内で実行される場合、サブネット、セキュリティグループ、ネットワークACLの設定が適切か確認しましょう。インターネットアクセスが必要な場合は、パブリックサブネットまたはNATゲートウェイが必要です。
-
ログ設定の確認: タスク定義でログドライバー(
awslogs
など)を設定している場合、CloudWatch Logsへのログ出力設定が正しいか確認しましょう。IAMロールにCloudWatch Logsへの書き込み権限が付与されている必要もあります。 -
ECSイベントログの確認: ECSコンソールのイベントログや、AWS CLIの
aws ecs describe-tasks
コマンドでタスクの詳細情報を確認し、エラーメッセージや原因を特定しましょう。
27. CloudTrail設定の不備
問題の概要:
AWS環境の操作ログをCloudTrailで記録しようとしたが、ログがS3バケットに保存されない、またはログの内容が期待どおりでない。
原因:
CloudTrailの設定ミスは、証跡の有効化、S3バケットの設定、IAM権限、リージョン設定など、様々な要因が考えられます。設定が不適切だと、ログが記録されなかったり、必要な情報が欠落したりします。
具体的な状況:
- CloudTrailを有効にしたはずなのに、S3バケットにログファイルが保存されない。
- ログファイルは保存されているが、必要な操作ログが記録されていない。
- ログファイルの形式がJSON形式になっていない。
対策:
- 証跡の有効化確認: CloudTrailコンソールで、証跡が有効になっているか確認しましょう。証跡が無効になっているとログは記録されません。
- S3バケット設定の確認: 証跡で指定したS3バケットが存在するか、バケットポリシーでCloudTrailからの書き込みが許可されているか確認しましょう。バケット名やリージョンも正しいか確認します。
-
IAMロールの確認: CloudTrailがS3バケットにログを書き込むためのIAMロール(
CloudTrail_AWSServiceRole
など)が正しく設定されているか確認しましょう。 - リージョン設定の確認: グローバルサービス(IAM、Route 53など)のログを記録する場合は、証跡を「すべてのリージョンに適用」するように設定する必要があります。特定のリージョンのログのみ記録する場合は、リージョン設定を確認しましょう。
- イベントタイプの選択: 証跡で記録するイベントタイプ(管理イベント、データイベント)が適切に選択されているか確認しましょう。S3バケットのデータイベントを記録する場合は、別途設定が必要です。
- ログファイルの検証: S3バケットに保存されたログファイルを開き、ログの内容が期待どおりであるか、必要な情報が含まれているか確認しましょう。
28. タグ付けルールの不徹底によるリソース管理の煩雑化
問題の概要:
AWSリソースにタグ付けをせずにリソースを構築し続けた結果、リソースの管理やコスト管理が煩雑になり、運用が困難になる。
原因:
タグは、AWSリソースを分類・整理するためのラベルです。タグ付けルールを事前に定義せず、リソース作成時にタグ付けを徹底しないと、後からリソースを特定したり、グループ化したりするのが難しくなります。
具体的な状況:
- 多数のリソースが作成され、どのリソースがどのプロジェクトや部署に属しているのかわからなくなる。
- コスト配分レポートを見ても、どのリソースがコストを消費しているのか特定できない。
- 不要なリソースを削除しようとしても、どれが不要なのか判断がつかない。
対策:
- タグ付けルールの定義: プロジェクト、部署、環境(開発、検証、本番)、リソースの役割など、タグ付けのルールを事前に定義しましょう。
- タグ付けの徹底: リソース作成時に、定義したタグ付けルールに従って必ずタグを付与するようにしましょう。AWS ConfigルールやAWS CloudFormation Stack Policyなどを使って、タグ付けを強制することもできます。
- タグベースのアクセス制御: IAMポリシーでタグベースのアクセス制御 (Attribute-Based Access Control - ABAC) を導入し、タグに基づいてリソースへのアクセス権限を制御しましょう。
- AWS Resource Groupsの活用: AWS Resource Groupsを使って、タグに基づいてリソースをグループ化し、一元的に管理・操作できるようにしましょう。
- AWS Cost Explorerのタグによるコスト分析: AWS Cost Explorerでタグを有効化し、タグに基づいてコストを分析することで、コストの内訳を把握しやすくなります。
29. リージョン選択ミスによるリソース配置の誤り
問題の概要:
AWSリソースを作成する際に、意図しないリージョンを選択してしまい、リソースが本来配置すべきリージョンとは異なるリージョンに作成されてしまう。
原因:
AWSは世界中に複数のリージョンを展開しており、リソースを作成するリージョンを選択する必要があります。リージョン選択を誤ると、レイテンシーの問題、コンプライアンスの問題、コストの問題などが発生する可能性があります。
具体的な状況:
- Webサイトのレスポンスが遅いと感じたら、EC2インスタンスが物理的に遠いリージョンに作成されていた。
- 法規制で特定のリージョンにデータを保管する必要があるのに、別のリージョンにRDSデータベースを作成してしまった。
- 想定よりもAWS利用料金が高いと思ったら、高価なリージョンにリソースを集中させてしまっていた。
対策:
- リージョン選択の確認: リソース作成前に、AWSコンソールのリージョン選択メニューで、意図したリージョンが選択されているか必ず確認しましょう。
- デフォルトリージョンの設定: AWS CLIやSDKのデフォルトリージョンを、自分がよく使うリージョンに設定しておくと、リージョン選択ミスを減らすことができます。
- CloudFormationテンプレートでのリージョン指定: CloudFormationテンプレートでリージョンをパラメータとして定義し、スタック作成時にリージョンを指定するようにすると、リージョン選択ミスを防ぐことができます。
- リージョンアフィニティの考慮: ユーザーに近いリージョン、データセンターの所在地、コンプライアンス要件、コストなどを考慮して、適切なリージョンを選択しましょう。
- リージョン間のデータ転送料金: リージョン間でデータを転送すると、データ転送料金が発生します。リージョンをまたがる構成にする場合は、データ転送料金を考慮しましょう。
30. リソース命名規則の不統一による混乱
問題の概要:
AWSリソースの命名規則を事前に決めずにリソースを作成し続けた結果、リソース名がバラバラになり、どのリソースが何なのか判別がつきにくくなる。
原因:
リソース命名規則は、リソースを識別しやすくするためのルールです。命名規則がないと、リソース名がプロジェクトや環境、リソースの種類などを反映せず、管理が煩雑になります。
具体的な状況:
- EC2インスタンス名が
instance-1
,instance-2
,web-server
,db-server
など、規則性がなく、どのインスタンスが何用なのかわからない。 - セキュリティグループ名が
sg-01
,security-group-web
,web-sg
など、表記が統一されておらず、探しにくい。 - CloudFormationスタック名が
mystack
,stack-prod
,production-stack
など、命名ルールが曖昧で、管理が煩雑になる。
対策:
-
リソース命名規則の定義: プロジェクト名、環境名、リソースタイプ、連番などを組み合わせた命名規則を事前に定義しましょう。例:
<プロジェクト名>-<環境名>-<リソースタイプ>-<連番>
- 命名規則のドキュメント化と共有: 定義した命名規則をドキュメント化し、チームメンバーに共有しましょう。
- リソース作成時の命名規則遵守: リソース作成時に、定義した命名規則に従ってリソース名を付けるように徹底しましょう。
- Infrastructure as Code (IaC) での命名規則適用: CloudFormationやTerraformなどのIaCツールを使うことで、リソース名をコードで管理し、命名規則を強制することができます。
- 既存リソースのリネーム: 命名規則が徹底されていなかった場合は、既存のリソースをリネームすることを検討しましょう。(リネームできないリソースもあるので注意が必要です)