Skip to content

Commit 1db052e

Browse files
committed
feat: rework env & secrets
1 parent d90b903 commit 1db052e

File tree

2 files changed

+42
-14
lines changed

2 files changed

+42
-14
lines changed

easyecs/cloudformation/template/task_definition.py

Lines changed: 34 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
import re
2+
from easyecs.model.ecs import EcsFileSecretModelV2
3+
4+
15
def create_task_definition(
26
stack, service_name, task_role, execution_role, log_group, ecs_data, run=False
37
):
@@ -116,11 +120,15 @@ def extract_container_config(stack, container_definition, log_configuration, run
116120
if tty and not run:
117121
command = ["sleep", "infinity"]
118122

119-
environment = {
120-
env_definition.name: env_definition.value
121-
for env_definition in container_definition.env
122-
if env_definition.active
123-
}
123+
environment = {}
124+
if isinstance(container_definition.env, List):
125+
environment = {
126+
env_definition.name: env_definition.value
127+
for env_definition in container_definition.env
128+
if env_definition.active
129+
}
130+
elif isinstance(container_definition.env, Dict):
131+
environment = container_definition.env
124132

125133
secrets = extract_secrets(stack, container_definition.secrets, name)
126134

@@ -157,12 +165,27 @@ def extract_secrets(stack, secret_definitions, container_name):
157165
"""Extract container secrets from its definition."""
158166
secrets = {}
159167
for secret_definition in secret_definitions:
160-
secret_name = secret_definition.name
161-
secret = Secret.from_secret_complete_arn(
162-
stack, f"{secret_name}_{container_name}", secret_definition.arn
163-
)
164-
ecs_secret = ECSSecret.from_secrets_manager(secret, secret_definition.field)
165-
secrets[secret_name] = ecs_secret
168+
if isinstance(secret_definition, EcsFileSecretModel):
169+
secret_name = secret_definition.name
170+
secret = Secret.from_secret_complete_arn(
171+
stack, f"{secret_name}_{container_name}", secret_definition.arn
172+
)
173+
ecs_secret = ECSSecret.from_secrets_manager(secret, secret_definition.field)
174+
secrets[secret_name] = ecs_secret
175+
elif isinstance(secret_definition, EcsFileSecretModelV2):
176+
arn_fields = dict(re.finditer(r"^arn:aws:secretsmanager:(?P<region_name>[a-z0-9-]+):(?P<account_id>\d{12}):secret:(?P<secret_name>[^:]+)(?::(?P<field>[^:]*))?(?::([^:]*))?(?::([^:]*))?$", secret_definition.valueFrom))
177+
if not arn_fields:
178+
raise ValueError(f"Invalid ARN format: {secret_definition.valueFrom}")
179+
field = arn_fields[0].group_dict()["field"]
180+
import pdb; pdb.set_trace()
181+
secret_name = secret_definition.name
182+
secret = Secret.from_secret_complete_arn(
183+
stack, f"{secret_name}_{container_name}", secret_definition.valueFrom
184+
)
185+
ecs_secret = ECSSecret.from_secrets_manager(secret)
186+
secrets[secret_name] = ecs_secret
187+
else:
188+
raise Exception("Unsupported secret type")
166189
return secrets
167190

168191

easyecs/model/ecs.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import os
22
import re
3-
from typing import Dict, List, Optional, Union
3+
from typing import Any, Dict, List, Optional, Union
44
from pydantic import BaseModel, computed_field, field_validator, model_validator
55
from pathlib import Path
66

@@ -71,6 +71,11 @@ class EcsFileSecretModel(BaseModel):
7171
active: bool = True
7272

7373

74+
class EcsFileSecretModelV2(BaseModel):
75+
name: str
76+
valueFrom: str
77+
78+
7479
class EcsFileVolumeModel(BaseModel):
7580
name: str
7681
id: str
@@ -101,8 +106,8 @@ class EcsFileContainerModel(BaseModel):
101106
resources: EcsFileResourcesModel
102107
build: Optional[EcsFileBuildModel] = None
103108
port_forward: List[str] = []
104-
env: List[EcsFileEnvModel] = []
105-
secrets: List[EcsFileSecretModel] = []
109+
env: List[EcsFileEnvModel] | Dict[str, Any] | None = None
110+
secrets: List[EcsFileSecretModel] | List[EcsFileSecretModelV2] = []
106111
efs_volumes: List[EcsFileVolumeModel] = []
107112
volumes: List[str] = []
108113
healthcheck: Optional[EcsFileContainerHealthCheckModel] = None

0 commit comments

Comments
 (0)