# 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 では、ロードバランサーは自動的に作成されるため、直接参照できない

# 解決方法

  1. サーバー側でリダイレクト設定を行う(推奨)

    • Apache: .htaccessまたは仮想ホスト設定
    • Nginx: .platform/nginx/conf.d/redirect.conf
  2. ロードバランサーレベルでの設定は避ける

    • .ebextensionsでロードバランサーのリソースを直接定義しない

# 推奨アプローチ

  • Nginx: .platform/nginx/conf.d/redirect.confに設定を記述
  • Apache: .htaccessまたは仮想ホスト設定でリダイレクト

この方法により、環境に依存せず、確実に HTTP から HTTPS へのリダイレクトが動作します。


関連情報: Elastic Beanstalk Nginx 設定 (opens new window)

同じタグを持つ記事をピックアップしました。