|
32 | 32 | EC2_INSTANCE_TYPE = os.environ.get("EC2_INSTANCE_TYPE", "c5.xlarge") |
33 | 33 | MAX_BUILD_MINUTES = int(os.environ.get("MAX_BUILD_MINUTES", "30")) |
34 | 34 | PROJECT_NAME = os.environ.get("PROJECT_NAME", "lambda-layer-builder") |
| 35 | +LOG_GROUP_NAME = os.environ.get("EC2_BUILD_LOG_GROUP", "/lambda-layer-builder/prod/ec2-builds") |
35 | 36 |
|
36 | 37 |
|
37 | 38 | def handler(event, context): |
@@ -67,6 +68,7 @@ def _process_build(message): |
67 | 68 | architectures=architectures, |
68 | 69 | requirements=requirements, |
69 | 70 | single_file=single_file, |
| 71 | + log_group_name=LOG_GROUP_NAME, |
70 | 72 | ) |
71 | 73 |
|
72 | 74 | # Pick a random subnet for AZ diversity |
@@ -149,7 +151,7 @@ def _update_status(build_id, status, error=None): |
149 | 151 | print(f"Failed to update status for {build_id}: {e}") |
150 | 152 |
|
151 | 153 |
|
152 | | -def _generate_user_data(build_id, python_version, architectures, requirements, single_file): |
| 154 | +def _generate_user_data(build_id, python_version, architectures, requirements, single_file, log_group_name): |
153 | 155 | """Generate the EC2 user-data bash script for the build.""" |
154 | 156 | req_escaped = requirements.replace("\\", "\\\\").replace("'", "'\\''") |
155 | 157 | arches_str = " ".join(architectures) |
@@ -208,12 +210,43 @@ def _generate_user_data(build_id, python_version, architectures, requirements, s |
208 | 210 | }} |
209 | 211 | trap cleanup EXIT |
210 | 212 |
|
211 | | -# --- Install Docker --- |
212 | | -echo "$(date): Installing Docker..." |
213 | | -dnf install -y docker git aws-cli 2>/dev/null || yum install -y docker git aws-cli |
| 213 | +# --- Install Docker and CloudWatch Agent --- |
| 214 | +echo "$(date): Installing Docker and CloudWatch Agent..." |
| 215 | +dnf install -y docker git aws-cli amazon-cloudwatch-agent 2>/dev/null || yum install -y docker git aws-cli |
214 | 216 | systemctl start docker |
215 | 217 | systemctl enable docker |
216 | 218 |
|
| 219 | +# --- Configure CloudWatch Logs streaming --- |
| 220 | +# Stream /var/log/build.log to CloudWatch; each build gets its own log stream. |
| 221 | +echo "$(date): Configuring CloudWatch Logs streaming..." |
| 222 | +mkdir -p /opt/aws/amazon-cloudwatch-agent/etc |
| 223 | +cat > /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json << 'CWEOF' |
| 224 | +{{ |
| 225 | + "logs": {{ |
| 226 | + "logs_collected": {{ |
| 227 | + "files": {{ |
| 228 | + "collect_list": [ |
| 229 | + {{ |
| 230 | + "file_path": "/var/log/build.log", |
| 231 | + "log_group_name": "{log_group_name}", |
| 232 | + "log_stream_name": "{build_id}", |
| 233 | + "timezone": "UTC", |
| 234 | + "timestamp_format": "%Y-%m-%dT%H:%M:%S" |
| 235 | + }} |
| 236 | + ] |
| 237 | + }} |
| 238 | + }} |
| 239 | + }} |
| 240 | +}} |
| 241 | +CWEOF |
| 242 | +
|
| 243 | +/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl \ |
| 244 | + -a fetch-config -m ec2 \ |
| 245 | + -c file:/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json \ |
| 246 | + -s 2>/dev/null \ |
| 247 | + && echo "$(date): CloudWatch streaming active → {log_group_name}/{build_id}" \ |
| 248 | + || echo "$(date): WARNING: CloudWatch agent failed to start" |
| 249 | +
|
217 | 250 | # Enable QEMU for cross-architecture builds |
218 | 251 | docker run --rm --privileged multiarch/qemu-user-static --reset -p yes 2>/dev/null || true |
219 | 252 |
|
|
0 commit comments