Skip to content

Commit 98af46d

Browse files
authored
Merge pull request #67 from Komalis/feat/add_auto_destroy
feat: add auto_destroy to clear stack automatically
2 parents d929d96 + 3de2bf1 commit 98af46d

File tree

7 files changed

+62
-1
lines changed

7 files changed

+62
-1
lines changed
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import os
2+
3+
import boto3
4+
5+
6+
def handler(event, context):
7+
client = boto3.client("cloudformation")
8+
stack_name = os.environ["StackName"]
9+
response = client.delete_stack(
10+
StackName=stack_name,
11+
)
12+
print(response)
13+
14+
return {"statusCode": response["ResponseMetadata"]["HTTPStatusCode"]}

easyecs/cloudformation/template/__init__.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,12 @@ def create_template(
6767
targets=[service],
6868
)
6969

70+
if ecs_manifest.metadata.auto_destruction is not None:
71+
assert isinstance(
72+
ecs_manifest.metadata.auto_destruction, int
73+
), "auto_destruction must be an Integer (minutes)"
74+
create_autodestroy(stack, ecs_manifest.metadata.auto_destruction)
75+
7076
app.synth()
7177

7278

@@ -350,3 +356,39 @@ def create_ecs_service(
350356
enable_execute_command=True,
351357
min_healthy_percent=0,
352358
)
359+
360+
361+
def create_autodestroy(stack, deployment_timeout: int):
362+
from pathlib import Path
363+
from aws_cdk.aws_events import Rule, Schedule
364+
from aws_cdk.aws_events_targets import LambdaFunction
365+
from aws_cdk.aws_iam import PolicyStatement
366+
from aws_cdk import aws_lambda, Duration
367+
from aws_cdk.aws_logs import RetentionDays
368+
369+
lambdaDeleteStackPolicy = PolicyStatement(
370+
actions=["cloudformation:DeleteStack", "lambda:RemovePermission"],
371+
resources=["*"],
372+
)
373+
374+
lambda_function_file = str(
375+
Path(__file__).parent.parent / "auto_destruction/harakiri.py"
376+
)
377+
harakiri = aws_lambda.Function(
378+
stack,
379+
"AutoDestroy",
380+
code=aws_lambda.Code.from_inline(open(lambda_function_file).read()),
381+
handler="index.handler",
382+
timeout=Duration.seconds(300),
383+
log_retention=RetentionDays.ONE_MONTH,
384+
environment={"StackName": stack.artifact_id},
385+
runtime=aws_lambda.Runtime.PYTHON_3_11,
386+
)
387+
harakiri.add_to_role_policy(lambdaDeleteStackPolicy)
388+
389+
lambda_rule = Rule(
390+
stack,
391+
"TimeToDestroy",
392+
schedule=Schedule.rate(Duration.minutes(deployment_timeout)),
393+
)
394+
lambda_rule.add_target(LambdaFunction(handler=harakiri))

easyecs/model/ecs.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
class EcsFileMetadataModel(BaseModel):
1111
appname: str
1212
user: str = os.environ["USER"]
13+
auto_destruction: Optional[int] = None
1314

1415

1516
class EcsFileStatementModel(BaseModel):

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "easyecs"
3-
version = "0.21.0"
3+
version = "0.22.0"
44
description = ""
55
authors = ["BONVARLET Benjamin <benjaminbonvarlet96@gmail.com>"]
66
readme = "README.md"

tests/cloudformation/template/test_depends_on.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ def test_depends_on_container_has_depends_on(depends_on, mocker):
7979
container = MagicMock()
8080
container.depends_on = depends_on
8181
ecs_data.task_definition.containers = [container]
82+
ecs_data.metadata.auto_destruction = None
8283

8384
create_template(
8485
"test_service",

tests/cloudformation/template/test_efs.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ def test_efs_add_mount_points_if_container_has_efs_volumes(efs_volumes, count, m
3636
ecs_data.task_definition.efs_volumes = [MagicMock(), MagicMock()]
3737
container = MagicMock()
3838
container.efs_volumes = efs_volumes
39+
ecs_data.metadata.auto_destruction = None
3940
ecs_data.task_definition.containers = [container]
4041

4142
create_template(

tests/cloudformation/template/test_template_command.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ def test_command_is_always_sleep_when_tty(mocker):
5858

5959
container = _create_mock_container()
6060
ecs_data = _create_mock_ecs_data(container)
61+
ecs_data.metadata.auto_destruction = None
6162

6263
create_template(
6364
"test_service",
@@ -95,6 +96,7 @@ def test_command_is_always_sleep_when_run(mocker):
9596
container = _create_mock_container()
9697
container.tty = True
9798
ecs_data = _create_mock_ecs_data(container)
99+
ecs_data.metadata.auto_destruction = None
98100

99101
create_template(
100102
"test_service",

0 commit comments

Comments
 (0)