Skip to content

Commit 322e9ca

Browse files
authored
feat: add Mock daac lambda logic (#398)
* chore: method to subscribe to sns from sqs * feat: adding infrastructure for archive daac * feat: adding percolator * feat: add method to migrate data * feat: add migration logic to the real code * chore: move granules index to correct location * feat: (in progress) adding daac config crud ops * feat: finished adding CRUDS for daac config * fix: need to authorizer if user is authorized for current collection + set tenant & venue for DB * fix: updating errors based on testcase * fix: adding log statement * fix: mistaken perc alias v. normal alias * fix: saved search are not in correct place in mapping * chore: adding log statement to see the problem * fix: add it at the correct place * fix: add test case + update errors based on those * feat: adding mock daac lambda logic + terraform * fix: adding iam creations * fix: add vpc related iam permissions * fix: add test case and check some bugs + get terraform working * fix: disable s3 logic for now * fix: update terraform to get things running
1 parent 34b27ab commit 322e9ca

File tree

11 files changed

+370
-9
lines changed

11 files changed

+370
-9
lines changed

cumulus_lambda_functions/lib/aws/aws_message_transformers.py

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,24 @@ class AwsMessageTransformers:
2323
},
2424
'required': ['Records']
2525
}
26+
SNS_EVENT_SCHEMA = {
27+
'type': 'object',
28+
'properties': {
29+
'Records': {
30+
'type': 'array',
31+
'minItems': 1,
32+
'maxItems': 1,
33+
'items': {
34+
'type': 'object',
35+
'properties': {
36+
'Sns': {'type': 'object'}
37+
},
38+
'required': ['Sns']
39+
}
40+
}
41+
},
42+
'required': ['Records']
43+
}
2644

2745
SNS_SCHEMA = {
2846
"type": "object",
@@ -86,10 +104,22 @@ def sqs_sns(self, raw_msg: json):
86104
sns_msg_body = json.loads(sns_msg_body)
87105
return sns_msg_body
88106

107+
def get_message_from_sns_event(self, raw_msg: json):
108+
result = JsonValidator(self.SNS_EVENT_SCHEMA).validate(raw_msg)
109+
if result is not None:
110+
raise ValueError(f'input json has SNS_EVENT_SCHEMA validation errors: {result}')
111+
sns_msg = raw_msg['Records'][0]['Sns']
112+
result = JsonValidator(self.SNS_SCHEMA).validate(sns_msg)
113+
if result is not None:
114+
raise ValueError(f'input json has SNS validation errors: {result}')
115+
sns_msg_body = sns_msg['Message']
116+
sns_msg_body = json.loads(sns_msg_body)
117+
return sns_msg_body
118+
89119
def get_s3_from_sns(self, sns_msg_body):
90120
result = JsonValidator(self.S3_RECORD_SCHEMA).validate(sns_msg_body)
91121
if result is not None:
92-
raise ValueError(f'sqs_msg did not pass SQS_MSG_SCHEMA: {result}')
122+
raise ValueError(f'sns_msg_body did not pass S3_RECORD_SCHEMA: {result}')
93123
s3_summary = {
94124
'eventName': sns_msg_body['Records'][0]['eventName'],
95125
'bucket': sns_msg_body['Records'][0]['s3']['bucket']['name'],

cumulus_lambda_functions/lib/uds_db/archive_index.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
from cumulus_lambda_functions.lib.json_validator import JsonValidator
2-
32
from cumulus_lambda_functions.lib.uds_db.db_constants import DBConstants
43

54
from cumulus_lambda_functions.lib.aws.es_abstract import ESAbstract

cumulus_lambda_functions/mock_daac/lambda_function.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from cumulus_lambda_functions.lib.lambda_logger_generator import LambdaLoggerGenerator
2+
from cumulus_lambda_functions.mock_daac.mock_daac_logic import MockDaacLogic
23

34

45
def lambda_handler(event, context):
@@ -9,5 +10,5 @@ def lambda_handler(event, context):
910
{'Records': [{'messageId': '6ff7c6fd-4053-4ab4-bc12-c042be1ed275', 'receiptHandle': 'AQEBYASiFPjQT5JBI2KKCTF/uQhHfJt/tHhgucslQQdvkNVxcXCNi2E5Ux4U9N0eu7RfvlnvtycjUh0gdL7jIeoyH+VRKSF61uAJuT4p31BsNe0GYu49N9A6+kxjP/RrykR7ZofmQRdHToX1ugRc76SMRic4H/ZZ89YAHA2QeomJFMrYywIxlk8OAzYaBf2dQI7WexjY5u1CW00XNMbTGyTo4foVPxcSn6bdFpfgxW/L7yJMX/0YQvrA9ruiuQ+lrui+6fWYh5zEk3f5v1bYtUQ6DtyyfbtMHZQJTJpUlWAFRzzN+3melilH7FySyOGDXhPb0BOSzmdKq9wBbfLW/YPb7l99ejq4GfRfj8LyI4EtB96vTeUw4LCgUqbZcBrxbGBLUXMacweh+gCjHav9ylqr2SeOiqG3vWPq9pwFYQIDqNE=', 'body': '{\n "Type" : "Notification",\n "MessageId" : "33e1075a-435c-5217-a33d-59fae85e19b2",\n "TopicArn" : "arn:aws:sns:us-west-2:237868187491:uds-sbx-cumulus-granules_cnm_ingester",\n "Subject" : "Amazon S3 Notification",\n "Message" : "{\\"Service\\":\\"Amazon S3\\",\\"Event\\":\\"s3:TestEvent\\",\\"Time\\":\\"2024-04-22T18:13:22.416Z\\",\\"Bucket\\":\\"uds-sbx-cumulus-staging\\",\\"RequestId\\":\\"DQ4T0GRVFPSX45C9\\",\\"HostId\\":\\"gHBFnYNmfnGDZBmqoQwA3RScjtjBk5lr426moGxu8IDpe5UhWAqNTxHqilWBoPN1njzIrzNrf8c=\\"}",\n "Timestamp" : "2024-04-22T18:13:22.434Z",\n "SignatureVersion" : "1",\n "Signature" : "RvSxqpU7J7CCJXbin9cXqTxzjMjgAUFtk/n454mTMcOe5x3Ay1w4AHfzyeYQCFBdLHNBa8n3OdMDoDlJqyVQMb8k+nERaiZWN2oqFVDRqT9pqSr89b+4FwlhPv6TYy2pBa/bgjZ4cOSYsey1uSQ3hjl0idfssvuV5cCRxQScbA+yu8Gcv9K7Oqgy01mC0sDHiuPIifhFXxupG5ygbjqoHIB+1gdMEbBwyixoY5GOpHM/O2uHNF+dJDjax1WMxQ2FzVjiFeCa+tNcjovF059+tx2v1YmDq/kEAFrN6DAtP6R4zKag62P9jkvjU/wHYJ2jjXmZAqoG+nuzAo24HiZPSw==",\n "SigningCertURL" : "https://sns.us-west-2.amazonaws.com/SimpleNotificationService-60eadc530605d63b8e62a523676ef735.pem",\n "UnsubscribeURL" : "https://sns.us-west-2.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-west-2:237868187491:uds-sbx-cumulus-granules_cnm_ingester:76cbefa1-addf-45c2-97e1-ae16986b195b"\n}', 'attributes': {'ApproximateReceiveCount': '1', 'SentTimestamp': '1713809602474', 'SenderId': 'AIDAIYLAVTDLUXBIEIX46', 'ApproximateFirstReceiveTimestamp': '1713809602483'}, 'messageAttributes': {}, 'md5OfBody': 'c6d06d1b742ad5bd2cfe5f542640aad2', 'eventSource': 'aws:sqs', 'eventSourceARN': 'arn:aws:sqs:us-west-2:237868187491:uds-sbx-cumulus-granules_cnm_ingester', 'awsRegion': 'us-west-2'}]}
1011
"""
1112
LambdaLoggerGenerator.remove_default_handlers()
12-
print('To be implemented later')
13+
MockDaacLogic().start(event)
1314
return
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
import json
2+
import os
3+
import random
4+
5+
import requests
6+
from cumulus_lambda_functions.lib.json_validator import JsonValidator
7+
8+
from cumulus_lambda_functions.lib.aws.aws_message_transformers import AwsMessageTransformers
9+
from cumulus_lambda_functions.lib.aws.aws_s3 import AwsS3
10+
11+
from cumulus_lambda_functions.lib.lambda_logger_generator import LambdaLoggerGenerator
12+
13+
from cumulus_lambda_functions.lib.time_utils import TimeUtils
14+
15+
from cumulus_lambda_functions.lib.aws.aws_sns import AwsSns
16+
LOGGER = LambdaLoggerGenerator.get_logger(__name__, LambdaLoggerGenerator.get_level_from_env())
17+
18+
19+
class MockDaacLogic:
20+
NO_RESPONSE_PERC = 'NO_RESPONSE_PERC'
21+
NO_RESPONSE_PERC_DEFAULT = .25
22+
FAIL_PERC = 'FAIL_PERC'
23+
FAIL_PERC_DEFAULT = .25
24+
UDS_ARCHIVE_SNS_TOPIC_ARN = 'UDS_ARCHIVE_SNS_TOPIC_ARN'
25+
26+
def __init__(self):
27+
self.__no_response_percentage = float(os.environ.get(self.NO_RESPONSE_PERC, self.NO_RESPONSE_PERC_DEFAULT))
28+
self.__fail_percentage = float(os.environ.get(self.NO_RESPONSE_PERC, self.NO_RESPONSE_PERC_DEFAULT))
29+
self.__fail_percentage += self.__no_response_percentage
30+
self.__sns_topic_arn = os.environ.get(self.UDS_ARCHIVE_SNS_TOPIC_ARN)
31+
self.__sns = AwsSns().set_topic_arn(self.__sns_topic_arn)
32+
self.__response_message = {}
33+
self.__s3 = AwsS3()
34+
35+
def __send_random_result(self):
36+
# https://github.com/podaac/cloud-notification-message-schema?tab=readme-ov-file#response-message-fields
37+
random_success = random.uniform(0, 1)
38+
if random_success < self.__no_response_percentage:
39+
LOGGER.debug(f'intentionally not sending any message')
40+
return
41+
if random_success < self.__fail_percentage:
42+
LOGGER.debug(f'sending failure message')
43+
self.__response_message['response'] = {
44+
'status': 'FAILURE',
45+
'errorCode': ["VALIDATION_ERROR", "PROCESSING_ERROR", "TRANSFER_ERROR"][random.randint(0, 2)],
46+
'errorMessage': 'This is a sample failure message',
47+
}
48+
sns_response = self.__sns.publish_message(json.dumps(self.__response_message))
49+
LOGGER.debug(f'sns_response: {sns_response}')
50+
return
51+
self.__response_message['response'] = {
52+
'status': 'SUCCESS',
53+
}
54+
LOGGER.debug(f'sending success message')
55+
sns_response = self.__sns.publish_message(json.dumps(self.__response_message))
56+
LOGGER.debug(f'sns_response: {sns_response}')
57+
return
58+
59+
def __check_s3_file(self, input_files: list):
60+
for each_file in input_files:
61+
s3_obj_size = self.__s3.set_s3_url(each_file['uri']).get_s3_obj_size()
62+
print(f'{each_file}: {s3_obj_size}')
63+
return
64+
65+
66+
def start(self, event):
67+
LOGGER.debug(f'event: {event}')
68+
"""
69+
event: {'Records': [{'EventSource': 'aws:sns', 'EventVersion': '1.0', 'EventSubscriptionArn': 'arn:aws:sns:us-west-2:429178552491:uds-sbx-cumulus-mock_daac_cnm_sns:35fc364f-2c1a-4139-af3f-bbc2921ea50b', 'Sns': {'Type': 'Notification', 'MessageId': '2f324e04-4d7b-5f56-a46e-1110e4ac1f51', 'TopicArn': 'arn:aws:sns:us-west-2:429178552491:uds-sbx-cumulus-mock_daac_cnm_sns', 'Subject': None, 'Message': 'asfdsadfsa', 'Timestamp': '2024-07-19T17:51:19.598Z', 'SignatureVersion': '1', 'Signature': 'Bh1CYWOwQrPcF7C7pOZ3h8khg9W2P01C8XhnIFQ0GE1H7vkXHm/vjLRFJbL0e2/6I0M2rlMJwSC/doS87PNCZ9NW+QPhyr/LmfSib1rfqbGMSIVBA3V1VbXokwvYqTwE05S8+UltEhezgexqDqxd/37WPB9iFOK0v3S5XTvNDRelQJUcTUpy8Ts/F2xFB0vgjKvdTQg+c3KDNIUzukcvNexDVfrp8QMEv/7/kO8A5JVYu0HagiBcIdVWPhgFjtTdcs0A3qSYx5C+sqoSX2Cb+opUZESQ9iNax5vZ1nZxokicSFqOts8uoSNDBE9x695BBET9IRD140bE3iF7xT5ZOQ==', 'SigningCertUrl': 'https://sns.us-west-2.amazonaws.com/SimpleNotificationService-60eadc530605d63b8e62a523676ef735.pem', 'UnsubscribeUrl': 'https://sns.us-west-2.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-west-2:429178552491:uds-sbx-cumulus-mock_daac_cnm_sns:35fc364f-2c1a-4139-af3f-bbc2921ea50b', 'MessageAttributes': {}}}]}
70+
"""
71+
input_event = AwsMessageTransformers().get_message_from_sns_event(event)
72+
LOGGER.debug(f'input_event: {input_event}')
73+
# Check input message is validated according to https://github.com/podaac/cloud-notification-message-schema?tab=readme-ov-file#notification-message-fields
74+
75+
# validate using this: https://raw.githubusercontent.com/podaac/cloud-notification-message-schema/v1.6.1/cumulus_sns_schema.json
76+
cnm_msg_schema = requests.get('https://raw.githubusercontent.com/podaac/cloud-notification-message-schema/v1.6.1/cumulus_sns_schema.json')
77+
cnm_msg_schema.raise_for_status()
78+
cnm_msg_schema = json.loads(cnm_msg_schema.text)
79+
result = JsonValidator(cnm_msg_schema).validate(input_event)
80+
if result is not None:
81+
raise ValueError(f'input cnm event has cnm_msg_schema validation errors: {result}')
82+
83+
# Check if S3 can be downloaded
84+
# self.__check_s3_file(input_event['product']['files'])
85+
# .25/.25/.50 P() on No send, send failure, send success
86+
# Return with this message: https://github.com/podaac/cloud-notification-message-schema?tab=readme-ov-file#response-message-fields
87+
self.__response_message = {
88+
'submissionTime': f'{TimeUtils.get_current_time()}Z',
89+
'receivedTime': input_event['submissionTime'],
90+
'processCompleteTime': f'{TimeUtils.get_current_time()}Z',
91+
'collection': input_event['collection'],
92+
'identifier': input_event['identifier'],
93+
}
94+
self.__send_random_result()
95+
return

tests/mock_daac/__init__.py

Whitespace-only changes.
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import json
2+
from unittest import TestCase
3+
4+
from cumulus_lambda_functions.lib.time_utils import TimeUtils
5+
6+
from cumulus_lambda_functions.mock_daac.mock_daac_logic import MockDaacLogic
7+
8+
9+
class TestMockDaacLogic(TestCase):
10+
def test_01(self):
11+
sample_cnm_message = {
12+
"collection": "MY_DAAC",
13+
"identifier": "URN:NASA:UNITY:UDS_LOCAL_TEST:DEV:UDS_COLLECTION___2404251100:abcd.1234.efgh.test_file05",
14+
"submissionTime": f'{TimeUtils.get_current_time()}Z',
15+
"provider": "DEV", # TODO need to pull this from granule ID
16+
"version": "1.6.0",
17+
"product": {
18+
"name": "UDS_COLLECTION___2404251100:abcd.1234.efgh.test_file05", # TODO extract granule ID Everything after tenant/venue."
19+
"dataVersion": "123", # TODO ask user to provide it in config,
20+
"files": [
21+
{
22+
"name": "abcd.1234.efgh.test_file05.data.stac.json",
23+
"type": "data",
24+
"uri": "s3://unity-dev-cumulus-unity-william-test-1/URN:NASA:UNITY:UDS_LOCAL_TEST:DEV:UDS_COLLECTION___2404251100/URN:NASA:UNITY:UDS_LOCAL_TEST:DEV:UDS_COLLECTION___2404251100:abcd.1234.efgh.test_file05/abcd.1234.efgh.test_file05.data.stac.json",
25+
"checksumType": "md5",
26+
"checksum": "unknown",
27+
"size": -1
28+
},
29+
{
30+
"name": "abcd.1234.efgh.test_file05.nc.cas",
31+
"type": "metadata",
32+
"uri": "s3://unity-dev-cumulus-unity-william-test-1/URN:NASA:UNITY:UDS_LOCAL_TEST:DEV:UDS_COLLECTION___2404251100/URN:NASA:UNITY:UDS_LOCAL_TEST:DEV:UDS_COLLECTION___2404251100:abcd.1234.efgh.test_file05/abcd.1234.efgh.test_file05.nc.cas",
33+
"checksumType": "md5",
34+
"checksum": "unknown",
35+
"size": -1
36+
},
37+
{
38+
"name": "abcd.1234.efgh.test_file05.nc.stac.json",
39+
"type": "metadata",
40+
"uri": "s3://unity-dev-cumulus-unity-william-test-1/URN:NASA:UNITY:UDS_LOCAL_TEST:DEV:UDS_COLLECTION___2404251100/URN:NASA:UNITY:UDS_LOCAL_TEST:DEV:UDS_COLLECTION___2404251100:abcd.1234.efgh.test_file05/abcd.1234.efgh.test_file05.nc.stac.json",
41+
"checksumType": "md5",
42+
"checksum": "unknown",
43+
"size": -1
44+
}
45+
]
46+
}
47+
}
48+
input_event = {'Records': [{
49+
'EventSource': 'aws:sns',
50+
'EventVersion': '1.0',
51+
'EventSubscriptionArn': 'arn:aws:sns:us-west-2:xxx:uds-sbx-cumulus-mock_daac_cnm_sns:xxx-2c1a-4139-af3f-bbc2921ea50b',
52+
'Sns': {'Type': 'Notification', 'MessageId': 'xxx-4d7b-5f56-a46e-1110e4ac1f51',
53+
'TopicArn': 'arn:aws:sns:us-west-2:xxx:uds-sbx-cumulus-mock_daac_cnm_sns',
54+
'Subject': '', # TODO will this always be present?
55+
'Message': json.dumps(sample_cnm_message),
56+
'Timestamp': '2024-07-19T17:51:19.598Z', 'SignatureVersion': '1',
57+
'Signature': 'xxx/vjLRFJbL0e2/6I0M2rlMJwSC/doS87PNCZ9NW+QPhyr/LmfSib1rfqbGMSIVBA3V1VbXokwvYqTwE05S8+UltEhezgexqDqxd/xxx/F2xFB0vgjKvdTQg+c3KDNIUzukcvNexDVfrp8QMEv/7/kO8A5JVYu0HagiBcIdVWPhgFjtTdcs0A3qSYx5C+sqoSX2Cb+opUZESQ9iNax5vZ1nZxokicSFqOts8uoSNDBE9x695BBET9IRD140bE3iF7xT5ZOQ==', 'SigningCertUrl': 'https://sns.us-west-2.amazonaws.com/SimpleNotificationService-60eadc530605d63b8e62a523676ef735.pem',
58+
'UnsubscribeUrl': 'https://sns.us-west-2.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-west-2:xx:uds-sbx-cumulus-mock_daac_cnm_sns:xxx-2c1a-4139-af3f-bbc2921ea50b',
59+
'MessageAttributes': {}}
60+
}]}
61+
MockDaacLogic().start(input_event)
62+
return

tf-module/mock_daac/main.tf

Lines changed: 103 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ resource "aws_security_group" "unity_cumulus_lambda_sg" {
2525
tags = var.tags
2626
}
2727

28-
data "aws_iam_policy_document" "lambda_assume_role_policy" {
28+
data "aws_iam_policy_document" "mock_daac_lambda_assume_role_policy" {
2929
statement {
3030
principals {
3131
type = "Service"
@@ -35,17 +35,89 @@ data "aws_iam_policy_document" "lambda_assume_role_policy" {
3535
}
3636
}
3737

38+
39+
# IAM Role for Lambda Function
40+
resource "aws_iam_role" "mock_daac_lambda_role" {
41+
name = "${var.prefix}-mock_daac_lambda_role"
42+
permissions_boundary = "arn:aws:iam::${local.account_id}:policy/mcp-tenantOperator-AMI-APIG"
43+
assume_role_policy = jsonencode({
44+
Version = "2012-10-17",
45+
Statement = [
46+
{
47+
Effect = "Allow",
48+
Principal = {
49+
Service = "lambda.amazonaws.com"
50+
},
51+
Action = "sts:AssumeRole"
52+
}
53+
]
54+
})
55+
}
56+
57+
58+
# IAM Policy for accessing S3 and SNS in other accounts
59+
resource "aws_iam_policy" "mock_daac_lambda_policy" {
60+
name = "${var.prefix}-mock_daac_lambda_policy"
61+
description = "IAM policy for Lambda to access S3 bucket and publish to SNS topic in another account"
62+
policy = jsonencode({
63+
Version = "2012-10-17",
64+
Statement = [
65+
{
66+
Effect = "Allow",
67+
Action = [
68+
"ec2:DescribeNetworkInterfaces",
69+
"ec2:CreateNetworkInterface",
70+
"ec2:DeleteNetworkInterface",
71+
"ec2:DescribeInstances",
72+
"ec2:AttachNetworkInterface",
73+
"logs:PutLogEvents",
74+
"logs:DescribeLogStreams",
75+
"logs:CreateLogStream",
76+
"logs:CreateLogGroup",
77+
],
78+
"Resource": "*"
79+
},
80+
{
81+
Effect = "Allow",
82+
Action = [
83+
"s3:GetObject*",
84+
"s3:PutObject"
85+
],
86+
Resource = "arn:aws:s3:::/*unity*/*"
87+
},
88+
{
89+
Effect = "Allow",
90+
Action = [
91+
"sns:Publish"
92+
],
93+
Resource = "arn:aws:sns:${var.uds_region}:${var.uds_account}:${var.uds_prefix}-daac_archiver"
94+
}
95+
]
96+
})
97+
}
98+
99+
# Attach policy to the role
100+
resource "aws_iam_role_policy_attachment" "mock_daac_lambda_policy_attachment" {
101+
role = aws_iam_role.mock_daac_lambda_role.name
102+
policy_arn = aws_iam_policy.mock_daac_lambda_policy.arn
103+
}
104+
105+
38106
resource "aws_lambda_function" "mock_daac_lambda" {
39107
filename = local.lambda_file_name
40108
source_code_hash = filebase64sha256(local.lambda_file_name)
41109
function_name = "${var.prefix}-mock_daac_lambda"
42-
role = var.lambda_processing_role_arn
110+
role = aws_iam_role.mock_daac_lambda_role.arn
43111
handler = "cumulus_lambda_functions.mock_daac.lambda_function.lambda_handler"
44112
runtime = "python3.9"
45113
timeout = 300
46114
environment {
47115
variables = {
48116
LOG_LEVEL = var.log_level
117+
NO_RESPONSE_PERC = var.no_response_perc
118+
FAIL_PERC = var.no_response_perc
119+
FAIL_PERC = var.fail_perc
120+
UDS_ARCHIVE_SNS_TOPIC_ARN = "arn:aws:sns:${var.uds_region}:${var.uds_account}:${var.uds_prefix}-daac_archiver"
49121
}
50122
}
51123

@@ -59,4 +131,33 @@ resource "aws_lambda_function" "mock_daac_lambda" {
59131
resource "aws_sns_topic" "mock_daac_cnm_sns" {
60132
name = "${var.prefix}-mock_daac_cnm_sns"
61133
tags = var.tags
134+
}
135+
136+
resource "aws_sns_topic_policy" "granules_cnm_ingester_policy" {
137+
arn = aws_sns_topic.mock_daac_cnm_sns.arn
138+
policy = templatefile("${path.module}/mock_daac_sns_policy.json", {
139+
region: var.aws_region,
140+
accountId: local.account_id,
141+
snsName: "${var.prefix}-granules_cnm_ingester",
142+
prefix: var.prefix,
143+
144+
uds_region: var.uds_region,
145+
uds_accountId: var.uds_account,
146+
uds_prefix: var.uds_prefix,
147+
})
148+
}
149+
150+
resource "aws_sns_topic_subscription" "mock_daac_cnm_sns" { // https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/sns_topic_subscription
151+
topic_arn = aws_sns_topic.mock_daac_cnm_sns.arn
152+
protocol = "lambda"
153+
endpoint = aws_lambda_function.mock_daac_lambda.arn
154+
# filter_policy_scope = "MessageBody" // MessageAttributes. not using attributes
155+
# filter_policy = templatefile("${path.module}/ideas_api_job_results_filter_policy.json", {})
156+
}
157+
158+
resource "aws_lambda_permission" "kinesis_fallback" {
159+
action = "lambda:InvokeFunction"
160+
function_name = aws_lambda_function.mock_daac_lambda.arn
161+
principal = "sns.amazonaws.com"
162+
source_arn = aws_sns_topic.mock_daac_cnm_sns.arn
62163
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
{
2+
"Version": "2008-10-17",
3+
"Id": "__default_policy_ID",
4+
"Statement": [
5+
{
6+
"Effect": "Allow",
7+
"Principal": {
8+
"Service": ["lambda.amazonaws.com"]
9+
},
10+
"Action": [
11+
"SNS:GetTopicAttributes",
12+
"SNS:SetTopicAttributes",
13+
"SNS:AddPermission",
14+
"SNS:RemovePermission",
15+
"SNS:DeleteTopic",
16+
"SNS:Subscribe",
17+
"SNS:ListSubscriptionsByTopic",
18+
"SNS:Publish"
19+
],
20+
"Resource": "arn:aws:sns:${region}:${accountId}:${snsName}",
21+
"Condition": {
22+
"ArnLike": {
23+
"aws:SourceArn": ["arn:aws:lambda:${uds_region}:${uds_accountId}:${uds_prefix}-daac_archiver", "arn:aws:lambda:${region}:${accountId}:${prefix}-mock_daac_lambda"]
24+
}
25+
}
26+
}
27+
]
28+
}

0 commit comments

Comments
 (0)