The `zappa undeploy` functionality for ALB infrastructure.
(self, lambda_name)
| 1903 | logger.info("Note it may take several minutes for load balancer to become available.") |
| 1904 | |
| 1905 | def undeploy_lambda_alb(self, lambda_name): |
| 1906 | """ |
| 1907 | The `zappa undeploy` functionality for ALB infrastructure. |
| 1908 | """ |
| 1909 | logger.info("Undeploying ALB infrastructure...") |
| 1910 | |
| 1911 | # Locate and delete alb/lambda permissions |
| 1912 | try: |
| 1913 | # https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/lambda.html#Lambda.Client.remove_permission |
| 1914 | self.lambda_client.remove_permission(FunctionName=lambda_name, StatementId=lambda_name) |
| 1915 | except botocore.exceptions.ClientError as e: # pragma: no cover |
| 1916 | if "ResourceNotFoundException" in e.response["Error"]["Code"]: |
| 1917 | pass |
| 1918 | else: |
| 1919 | raise e |
| 1920 | |
| 1921 | # Locate and delete load balancer |
| 1922 | try: |
| 1923 | # https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/elbv2.html#ElasticLoadBalancingv2.Client.describe_load_balancers # noqa: E501 |
| 1924 | response = self.elbv2_client.describe_load_balancers(Names=[lambda_name]) |
| 1925 | if not (response["LoadBalancers"]) or len(response["LoadBalancers"]) > 1: |
| 1926 | raise EnvironmentError( |
| 1927 | "Failure to locate/delete ALB named [{}]. Response was: {}".format(lambda_name, repr(response)) |
| 1928 | ) |
| 1929 | load_balancer_arn = response["LoadBalancers"][0]["LoadBalancerArn"] |
| 1930 | # https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/elbv2.html#ElasticLoadBalancingv2.Client.describe_listeners # noqa: E501 |
| 1931 | response = self.elbv2_client.describe_listeners(LoadBalancerArn=load_balancer_arn) |
| 1932 | if not (response["Listeners"]): |
| 1933 | logger.warning("No listeners found.") |
| 1934 | elif len(response["Listeners"]) > 1: |
| 1935 | raise EnvironmentError( |
| 1936 | "Failure to locate/delete listener for ALB named [{}]. Response was: {}".format( |
| 1937 | lambda_name, repr(response) |
| 1938 | ) |
| 1939 | ) |
| 1940 | else: |
| 1941 | listener_arn = response["Listeners"][0]["ListenerArn"] |
| 1942 | # Remove the listener. |
| 1943 | # This explicit deletion of the listener seems necessary to avoid ResourceInUseExceptions when deleting target groups. # noqa: E501# noqa: E501 |
| 1944 | # https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/elbv2.html#ElasticLoadBalancingv2.Client.delete_listener # noqa: E501 |
| 1945 | response = self.elbv2_client.delete_listener(ListenerArn=listener_arn) |
| 1946 | # Remove the load balancer and wait for completion |
| 1947 | # https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/elbv2.html#ElasticLoadBalancingv2.Client.delete_load_balancer # noqa: E501 |
| 1948 | response = self.elbv2_client.delete_load_balancer(LoadBalancerArn=load_balancer_arn) |
| 1949 | waiter = self.elbv2_client.get_waiter("load_balancers_deleted") |
| 1950 | logger.info(f"Waiting for load balancer [{lambda_name}] to be deleted..") |
| 1951 | waiter.wait(LoadBalancerArns=[load_balancer_arn], WaiterConfig={"Delay": 3}) |
| 1952 | except botocore.exceptions.ClientError as e: # pragma: no cover |
| 1953 | logger.exception(e.response["Error"]["Code"]) |
| 1954 | if "LoadBalancerNotFound" in e.response["Error"]["Code"]: |
| 1955 | pass |
| 1956 | else: |
| 1957 | raise e |
| 1958 | |
| 1959 | # Locate and delete target group |
| 1960 | try: |
| 1961 | # Locate the lambda ARN |
| 1962 | # https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/lambda.html#Lambda.Client.get_function |
no outgoing calls