Создание сине-зеленого развертывания в Cloud Formation (целевые группы One Load Balancer 2) - PullRequest
0 голосов
/ 29 апреля 2020

Я пытаюсь создать облачную форму Ia C для приложения, которое выполняет развертывание сине-зеленого цвета. Это продолжает давать мне The target group with targetGroupArn arn:aws:elasticloadbalancing:ap-xxx-9:000:targetgroup/master-tg-2 does not have an associated load balancer.

Интересно, где я go ошибся? Я добавляю DependsOn прослушиватель masterLB, как указано в этом вопросе . Я также связываю обе целевые группы в MasterECSServices

Ниже приведен шаблон облачной информации

  MasterLBSG:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Access to the public facing load balancer
      VpcId:
        Fn::ImportValue: # TAS-dev:VPCId
          !Sub "${TasStackName}:VPCId"
      SecurityGroupIngress:
        - CidrIp: 0.0.0.0/0
          IpProtocol: tcp
          FromPort: 8000
          ToPort: 8000
  MasterLB:
    Type: AWS::ElasticLoadBalancingV2::LoadBalancer
    Properties:
      Name: Master-Dev-LB
      Scheme: internet-facing
      LoadBalancerAttributes:
      - Key: idle_timeout.timeout_seconds
        Value: '30'
      Subnets:
        - !Sub "${StackName}:PublicSubnetOne"
        - !Sub "${StackName}:PublicSubnetTwo"
      SecurityGroups: [!Ref 'MasterLBSG']
  MasterLBListener:
    Type: AWS::ElasticLoadBalancingV2::Listener
    DependsOn:
      - MasterLB
    Properties:
      DefaultActions:
        - TargetGroupArn: !Ref 'MasterTGOne'
          Type: 'forward'
      LoadBalancerArn: !Ref 'MasterLB'
      Port: 8000
      Protocol: HTTP
  MasterTGOne: # Means MasterTargetGroupOne
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      Name: master-tg-1
      Port: 8000
      Protocol: HTTP
      VpcId:"${TasStackName}:VPCId"
      TargetType: ip

  ## to be used as a spare TargetGroup for blue green deployment
  MasterTGTwo: # Means MasterTargetGroupOne
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      Name: master-tg-2
      Port: 8000
      Protocol: HTTP
      VpcId:"${TasStackName}:VPCId"
      TargetType: ip
  MasterECSServices:
    Type: AWS::ECS::Service
    DependsOn:
      - MasterLBListener
    Properties:
      Cluster:"${TasStackName}:ClusterName"
      DeploymentController:
        Type: CODE_DEPLOY
      DesiredCount: 1
      LaunchType: FARGATE
      LoadBalancers:
        - ContainerName: master-app
          ContainerPort: '8000'
          TargetGroupArn: !Ref 'MasterTGOne'
        - ContainerName: master-app
          ContainerPort: '8000'
          TargetGroupArn: !Ref 'MasterTGTwo'
      NetworkConfiguration:
        AwsvpcConfiguration:
          SecurityGroups:
            - !Ref MasterAppSG
          Subnets:
            - "${TasStackName}:PrivateSubnetOne"
            - "${TasStackName}:PrivateSubnetTwo"
      Role:"${TasStackName}:ECSRole"
      TaskDefinition: !Ref 'MasterTaskDef'

1 Ответ

1 голос
/ 30 апреля 2020

Пример пользовательского ресурса в CloudFormation, который выполняет сине-зеленое развертывание для ECS. Он использует crhelper :

Lambda, который создает сине-зеленую группу развертывания для ECS (т. Е. Logi c вашего пользовательского ресурса)

import logging
import json
import boto3

from time import sleep

from crhelper import CfnResource


logger = logging.getLogger(__name__)

# Initialise the helper, all inputs are optional, 
# this example shows the defaults
helper = CfnResource(json_logging=False, 
                     log_level='DEBUG', 
                     boto_level='CRITICAL', 
                     sleep_on_delete=120)

try:
    ## Init code goes here
    cd = boto3.client('codedeploy')
    pass
except Exception as e:
    helper.init_failure(e)


@helper.create
def create(event, context):
    logger.info("Got Create")

    print(json.dumps(event))

    application_name = event['ResourceProperties']['ApplicationName']
    service_role_arn = event['ResourceProperties']['ServiceRoleArn']

    cluster_name = event['ResourceProperties']['ClusterName']
    service_name = event['ResourceProperties']['ServiceName']
    elb_name = event['ResourceProperties']['ELBName']
    tg1_name = event['ResourceProperties']['TG1Name']
    tg2_name = event['ResourceProperties']['TG2Name']    
    listener_arn = event['ResourceProperties']['ListenerArn']

    deployment_group_name = event['ResourceProperties']['GroupName']

    deployment_style=event['ResourceProperties'].get(
                              'DeploymentStyle', 'BLUE_GREEN')

    response = cd.create_deployment_group(
                    applicationName=application_name,
                    deploymentGroupName=deployment_group_name,
                    serviceRoleArn=service_role_arn,
                    autoRollbackConfiguration={
                        'enabled': True,
                        'events': ['DEPLOYMENT_FAILURE']
                    },
                    deploymentStyle={
                        'deploymentType': deployment_style,
                        'deploymentOption': 'WITH_TRAFFIC_CONTROL'
                    },
                    blueGreenDeploymentConfiguration={
                        "terminateBlueInstancesOnDeploymentSuccess": {
                            "action": "TERMINATE",
                            "terminationWaitTimeInMinutes": 0
                        },
                        "deploymentReadyOption": {
                            "actionOnTimeout": "CONTINUE_DEPLOYMENT",
                            "waitTimeInMinutes": 0
                        }
                    },      
                    loadBalancerInfo={
                        "targetGroupPairInfoList": [
                          {
                            "targetGroups": [
                                {"name": tg1_name},
                                {"name": tg2_name}
                            ],
                            "prodTrafficRoute": {
                                "listenerArns": [listener_arn]
                            }
                          }
                        ]                       
                    },
                    ecsServices=[
                        {
                          "serviceName": service_name,
                          "clusterName": cluster_name
                        }
                    ]      
                )


    print(response)

    helper.Data.update({"Name": deployment_group_name})

    cd_group_id = response['deploymentGroupId']        

    return cd_group_id  


@helper.delete
def delete(event, context):    
    # Delete never returns anything. Should not fail if the 
    # underlying resources are already deleted.
    # Desired state.  
    logger.info("Got Delete")    

    print(json.dumps(event))

    try:

      application_name = event['ResourceProperties']['ApplicationName']
      deployment_group_name = event['ResourceProperties']['GroupName']

      response = cd.delete_deployment_group(
        applicationName=application_name,
        deploymentGroupName=deployment_group_name
      )

      print(response)

    except Exception as e:
      print(str(e))



def handler(event, context):
    helper(event, context)

Выполнить лямбду из CloudFomration

После настройки лямбды в CloudFormation вы можете использовать ее как любой другой «обычный» ресурс:

  MyUseCustomLambda:
    Type: Custom::CodeDeployCustomGroup
    Version: "1.0"
    Properties:
      Name: UseCustomLambda
      ServiceToken: !Ref CustomLambdaArn      
      ApplicationName: !Ref ApplicationName         
      ServiceRoleArn: !Ref ServiceRoleArn     
      ELBName: !Ref ELBName         
      TG1Name: !Ref TG1Name
      TG2Name: !Ref TG2Name
      GroupName: !Ref GroupName
      ClusterName: !Ref ClusterName         
      ServiceName: !Ref ServiceName
      ListenerArn: !Ref ListenerArn      
      DeploymentStyle: !Ref DeploymentStyle
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...