Skip to content

Commit 96b44a5

Browse files
committed
Implement Lambda function versions (#5927)
1 parent 18e2039 commit 96b44a5

File tree

1 file changed

+28
-0
lines changed

1 file changed

+28
-0
lines changed

src/azul/terraform.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
from pathlib import (
1515
Path,
1616
)
17+
import re
1718
import subprocess
1819
from typing import (
1920
Mapping,
@@ -759,6 +760,10 @@ def tf_config(self, app_name):
759760
for _, resource in functions:
760761
assert 'layers' not in resource
761762
resource['layers'] = ['${aws_lambda_layer_version.dependencies.arn}']
763+
# Publishing a new Lambda function version each time lets us update
764+
# the Lambda functions atomically, avoiding a race condition between
765+
# the update of the function's configuration and its code.
766+
resource['publish'] = True
762767
env = config.es_endpoint_env(
763768
es_endpoint=(
764769
aws.es_endpoint
@@ -921,6 +926,29 @@ def tf_config(self, app_name):
921926
sqs_name, _ = config.unqualified_resource_name(resource_name, suffix)
922927
resource['event_source_arn'] = f'${{aws_sqs_queue.{sqs_name}.arn}}'
923928

929+
# Replace Lambda function ARNs with qualified ARNs for an atomic update.
930+
#
931+
if app_name == 'indexer':
932+
resource_arguments = [
933+
('aws_cloudwatch_event_target', 'arn'),
934+
('aws_lambda_permission', 'function_name'),
935+
('aws_lambda_event_source_mapping', 'function_name'),
936+
]
937+
elif app_name == 'service':
938+
resource_arguments = [
939+
('aws_cloudwatch_event_target', 'arn'),
940+
('aws_lambda_permission', 'function_name'),
941+
]
942+
else:
943+
assert False, app_name
944+
for resource_type, argument in resource_arguments:
945+
for _, resource in json_item_dicts(resources[resource_type]):
946+
value = resource[argument]
947+
assert value.endswith('.arn}')
948+
resource[argument] = value.replace('.arn', '.qualified_arn')
949+
locals[app_name] = re.sub(r'(aws_lambda_function\.[^\.\s]+)\.invoke_arn',
950+
r'\1.qualified_invoke_arn',
951+
locals[app_name])
924952
return {
925953
'resource': resources,
926954
'data': data,

0 commit comments

Comments
 (0)