# AWS Unresolved resource dependencies [AWSEBV2LoadBalancer] エラー解決方法
HTTP トラフィックを HTTPS にリダイレクトする際に YAML ファイルを書きましたが、ELB デプロイ時にテンプレートフォーマットエラーが発生してデプロイが失敗しました。
# エラー内容
Service:AmazonCloudFormation, Message:Template format error: Unresolved resource dependencies [AWSEBV2LoadBalancer] in the Resources block of the template
このエラーは、CloudFormation テンプレートでAWSEBV2LoadBalancerというリソースを参照しているが、そのリソースが定義されていない場合に発生します。
# 問題のある YAML の書き方
以下のような YAML ファイルを書くと、エラーが発生します。
Type: AWS::ElasticLoadBalancingV2::ListenerRule
Properties:
LoadBalancerArn:
Ref: AWSEBV2LoadBalancer
Port: 80
Protocol: HTTP
DefaultActions:
- Type: redirect
RedirectConfig:
Host: "#{host}"
Path: "/#{path}"
Port: "443"
Protocol: "HTTPS"
Query: "#{query}"
StatusCode: "HTTP_301"
# エラーの原因
AWSEBV2LoadBalancerというリソースを参照していますが、Elastic Beanstalk の環境では、このリソースは自動的に作成されるため、直接参照できません。
問題点
- Elastic Beanstalk では、ロードバランサーは自動的に作成されます
.ebextensionsでロードバランサーのリソースを直接定義することはできません- リダイレクト設定は、サーバー側(Apache/Nginx)で行うべきです
参考: AWS::ElasticLoadBalancingV2::ListenerRule (opens new window)
# Apache サーバーでリダイレクト
仮想ホストファイル設定を変更することでリダイレクト方法
/etc/httpd/conf/httpd.conf
<VirtualHost *:80>
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
</VirtualHost>
.htaccess ファイル編集してリダイレクトする方法
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
仮想ホストファイルで.htaccess 利用許可が必要
<Directory "/var/www/html">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
Apache 再起動
# Nginx でリダイレクト
nginx.conf
server {
listen 80;
server_name _;
if ($http_x_forwarded_proto = 'http'){
return 301 https://$host$request_uri;
}
}
nginx 再起動
# 解決方法:サーバー側でリダイレクトを行う
本番では問題なく動いていたものが開発環境でデプロイエラーになったのは、環境依存の設定があったためです。
重要なポイント
ロードバランサーの設定ファイルは.ebextensions に書くべきではありません。
HTTP から HTTPS へのリダイレクトは、サーバー側(Apache/Nginx)で行うべきです。
# Nginx でリダイレクト設定
.platform/nginx/conf.d/redirect.confファイルを作成し、以下の内容を記述します。
server {
listen 80;
rewrite ^ https://$host$request_uri permanent;
}
この設定により、HTTP(ポート 80)へのアクセスを HTTPS(ポート 443)にリダイレクトします。
ファイルの配置場所
.platform/nginx/conf.d/redirect.conf(推奨)- または
.ebextensions配下に Nginx 設定ファイルを配置
Elastic Beanstalk の.platformディレクトリを使用すると、より適切に設定が適用されます。
# まとめ
AWS Elastic Beanstalk で HTTP から HTTPS へのリダイレクトを行う際の注意点と解決方法を解説しました。
# 問題の原因
- CloudFormation テンプレートで
AWSEBV2LoadBalancerを直接参照しようとした - Elastic Beanstalk では、ロードバランサーは自動的に作成されるため、直接参照できない
# 解決方法
サーバー側でリダイレクト設定を行う(推奨)
- Apache:
.htaccessまたは仮想ホスト設定 - Nginx:
.platform/nginx/conf.d/redirect.conf
- Apache:
ロードバランサーレベルでの設定は避ける
.ebextensionsでロードバランサーのリソースを直接定義しない
# 推奨アプローチ
- Nginx:
.platform/nginx/conf.d/redirect.confに設定を記述 - Apache:
.htaccessまたは仮想ホスト設定でリダイレクト
この方法により、環境に依存せず、確実に HTTP から HTTPS へのリダイレクトが動作します。