AWS Fargate上で構築したredash serverコンテナへのALBヘルスチェックが失敗してしまう

はじめまして。

現在AWS Fargateを用いてredashをserver及びworkerコンテナに分け構築しています。(postgres=RDS、redis=ElastiCacheを使用しております。)
CloudFormationにてデプロイ後、serverコンテナへのALBのヘルスチェックがタイムアウトで失敗してしまいます。

awsサポートセンターにて同現象について問い合わせたところ、

  • セキュリティーグループの見直し
  • ヘルスチェック猶予時間を設ける

以上についてご指摘を頂き、修正を行いましたが、依然としてヘルスチェックに失敗しております。
そこで自身の、コンテナ定義及びECSサービス部分の記述に間違いがあり正常に稼働できてないのではないかと思い、こちらにて質問させていただいております。

抽象的な質問になってしまい恐縮ですが、
原因等ご存じの方がいらっしゃいましたら、ご指摘いただけますと幸いです。
よろしくお願いいたします。

以下server部分及びALBのテンプレートになります。

ALB

ALBForRedash:
    Type: AWS::ElasticLoadBalancingV2::LoadBalancer
    Properties:
      Name: redash-alb
      Subnets:
        - !ImportValue RedashVPCSubnet-PublicSubnet2A
        - !ImportValue RedashVPCSubnet-PublicSubnet2C
      SecurityGroups: 
        - !ImportValue RedashSecurityGroupe
      Tags:
        - Key: Name
          Value: ResdashECSALB
      Scheme: internet-facing

  ## RedashECSALBTargetGroup
  ALBTargetGroupForRedash:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      Name: redash-alb-targetgroup
      VpcId: !ImportValue RedashVPCSubnet-VPC
      HealthCheckPath: '/'
      HealthCheckIntervalSeconds: 30
      Matcher:
        HttpCode: 200-302
      Port: 5000
      Protocol: HTTP
      TargetType: ip

  ## RedashECSALBListener
  ALBListenerForRedash:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
      LoadBalancerArn: !Ref ALBForRedash
      Port: 80
      Protocol: HTTP
      DefaultActions:
        - Type: forward
          TargetGroupArn: !Ref ALBTargetGroupForRedash

serverタスク定義

ECSTaskDefinitionApplication:
    Type: 'AWS::ECS::TaskDefinition'
    Properties:
      Family: redash-server
      RequiresCompatibilities:
        - 'FARGATE'
      Cpu: 1024
      Memory: 2048
      NetworkMode: 'awsvpc'
      ExecutionRoleArn: !GetAtt IAMRoleForRedashTaskExecution.Arn
      ContainerDefinitions:
        - Image: redash/redash:8.0.0.b32245
          Name: 'redash-server'
          Command:
            - 'server'
          Environment:
            - Name: 'PYTHONUNBUFFERED'
              Value: '0'
            - Name: 'REDASH_LOG_LEVEL'
              Value: 'INFO'
            - Name: 'REDASH_REDIS_URL'
              Value: !Sub redis://${ElasticacheClusterForRedash.RedisEndpoint.Address}:${ElasticacheClusterForRedash.RedisEndpoint.Port}/0
            - Name: 'REDASH_DATABASE_URL'
              Value: !Sub postgresql://test:{{resolve:secretsmanager:${RDSUserPasswordForRedash}::password}}@${RDSForRedash.Endpoint.Address}/redash
            - Name: 'REDASH_HOST'
              Value: ''
            - Name: 'REDASH_ALLOW_SCRIPTS_IN_USER_INPUT'
              Value: 'true'
            - Name: 'REDASH_DATE_FORMAT'
              Value: 'YY/MM/DD'
          Cpu: 1024
          Memory: 2048
          PortMappings:
            - ContainerPort: 5000
              HostPort: 5000
              Protocol: 'tcp'
          LogConfiguration:
            LogDriver: 'awslogs'
            Options:
              awslogs-group: !Ref LogGroupForRedashServer
              awslogs-region: !Ref AWS::Region
              awslogs-stream-prefix: 'server'

ECSセキュリティーグループ

EC2SecurityGroupECSRedash:
    Type: 'AWS::EC2::SecurityGroup'
    Properties:
      GroupName: redash-ecs-security-group
      GroupDescription: 'ecs security group for redash'
      VpcId: !ImportValue RedashVPCSubnet-VPC
      SecurityGroupIngress:
        - SourceSecurityGroupId: !ImportValue RedashSecurityGroupe
          FromPort: 5000
          ToPort: 5000
          IpProtocol: 'tcp'

ECSサービス

ECSServiceRedash:

    Type: 'AWS::ECS::Service'
    DependsOn:
      - IAMServiceLinkedRoleForECSRedashService
      - RDSForRedash #RDSインスタンス
      - ElasticacheClusterForRedash #redisインスタンス
      - ALBListenerForRedash #リスナールール
    Properties:
      Cluster: !Ref ECSClusterForRedash
      DesiredCount: 1
      LaunchType: 'FARGATE'
      LoadBalancers:
        - ContainerName: 'redash-server'
          ContainerPort: 5000
          TargetGroupArn: !Ref ALBTargetGroupForRedash
      HealthCheckGracePeriodSeconds: 600
      NetworkConfiguration:
        AwsvpcConfiguration:
          AssignPublicIp: ENABLED
          SecurityGroups:
            - !Ref EC2SecurityGroupECSRedash
          Subnets:
            - !ImportValue RedashVPCSubnet-PublicSubnet2A
            - !ImportValue RedashVPCSubnet-PublicSubnet2C
      PlatformVersion: '1.4.0'
      TaskDefinition: !Ref ECSTaskDefinitionApplication

@takenaga こんばんは。
Timee さんの記事でヘルスチェックを通す際のワークアラウンドを紹介されておりましたが、こちらがご覧になられていますか?
https://tech.timee.co.jp/entry/2020/04/20/175821

もし、解決したらぜひ教えて下さい!

1 Like

早速のご返答ありがとうございます。
記事の方ありがとうございました。
記事を参考にヘルスチェックパスを /login に変更し、
レートリミットを上げてみましたが、ヘルスチェックに失敗しております。。。

原因について考えてみましたが、
serverへのヘルスチェック失敗について、worker設定の不備が原因という可能性はあり得るのでしょうか?

自己解決しました。

◆原因
create_dbコマンドが抜けており、必要なテーブルが作成されていない。
◆解決方法
create_dbを行う別タスクを定義
※serverタスクでcreate_dbをしてしまうと失敗するため別タスクとして切り出し

2 Likes

上記記事を書いた宮城です。
補足で、記事のコメントで教えていただいたのですが、Redashには/login以外にも/pingが用意されていたので、レートリミットを上げる対応をせずともヘルスチェックができるかと思います!
server立ち上げるまでに僕も結構手こずったので、なにかお力添えできることもあるかと思います!何かありましたらぜひ呼んでくださいー。

2 Likes