-
Notifications
You must be signed in to change notification settings - Fork 69
/
Connect_as_a_Channel.yaml
134 lines (119 loc) · 4.31 KB
/
Connect_as_a_Channel.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
AWSTemplateFormatVersion: 2010-09-09
Description: Amazon Connect as an Amazon Pinpoint Channel
Parameters:
PinpointProjectId:
Type: String
Description: Amazon Pinpoint Project ID if one already exists, blank to create one
PinpointProjectName:
Type: String
Default: "My Pinpoint Project"
Description: "If no PinpointProjectId provided, name to be used to create the Pinpoint project"
ConnectContactFlowId:
Type: String
Description: Amazon Connect Contact Flow ID to use for the outbound call
ConnectInstanceId:
Type: String
Description: Amazon Connect Instance ID to use for the outbound call
ConnectQueueId:
Type: String
Description: Amazon Connect Queue ID to use for the outbound call
Conditions:
NeedsPinpointProjectId: !Equals
- ''
- !Ref PinpointProjectId
Resources:
PinpointApplication:
Type: AWS::Pinpoint::App
Condition: NeedsPinpointProjectId
Properties:
Name: !Ref PinpointProjectName
PinpointApplicationSettings:
Type: AWS::Pinpoint::ApplicationSettings
Properties:
ApplicationId: !If
- NeedsPinpointProjectId
- !Ref PinpointApplication
- !Ref PinpointProjectId
CampaignHook:
LambdaFunctionName: !GetAtt DeliveryCampaignHookLambdaFunction.Arn
Mode: 'DELIVERY'
DependsOn: LambdaPermission
LambdaPermission:
Type: AWS::Lambda::Permission
Properties:
Action: 'lambda:InvokeFunction'
FunctionName: !GetAtt DeliveryCampaignHookLambdaFunction.Arn
Principal: !Sub 'pinpoint.${AWS::Region}.amazonaws.com'
SourceArn:
!Sub
- 'arn:aws:mobiletargeting:${AWS::Region}:${AWS::AccountId}:/apps/${ProjectId}*'
- {ProjectId: !If [NeedsPinpointProjectId, !Ref PinpointApplication, !Ref PinpointProjectId] }
DeliveryCampaignHookLambdaFunction:
Type: AWS::Lambda::Function
Properties:
Handler: index.lambda_handler
Role: !GetAtt DeliveryCampaignHookLambdaFunctionRole.Arn
Runtime: "python3.7"
Timeout: 60
MemorySize: 1024
Environment:
Variables:
CONNECT_CONTACT_FLOW_ID: !Ref ConnectContactFlowId
CONNECT_INSTANCE_ID: !Ref ConnectInstanceId
CONNECT_QUEUE_ID: !Ref ConnectQueueId
Code:
ZipFile: |
import json
import logging
import boto3
import os
connect = boto3.client('connect')
def lambda_handler(event, context):
logging.getLogger().setLevel('DEBUG')
logging.debug(json.dumps(event))
message = event['Message']['smsmessage']['body']
# Loop over each incoming Endpoint
for endpointId,endpoint in event['Endpoints'].items():
if endpoint['ChannelType'] == 'SMS':
# initiate outbound voice call
response = connect.start_outbound_voice_contact(
DestinationPhoneNumber=endpoint['Address'],
ContactFlowId=os.environ['CONNECT_CONTACT_FLOW_ID'],
InstanceId=os.environ['CONNECT_INSTANCE_ID'],
QueueId=os.environ['CONNECT_QUEUE_ID'],
Attributes={
'Message': message
}
)
logging.info(json.dumps(response))
DeliveryCampaignHookLambdaFunctionRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
-
Effect: "Allow"
Principal:
Service:
- "lambda.amazonaws.com"
Action:
- "sts:AssumeRole"
Policies:
-
PolicyName: "LambdaExecutionPolicy"
PolicyDocument:
Version: "2012-10-17"
Statement:
-
Effect: "Allow"
Action:
- "connect:StartOutboundVoiceContact"
Resource: !Sub "arn:aws:connect:${AWS::Region}:${AWS::AccountId}:instance/${ConnectInstanceId}/contact/*"
-
Effect: "Allow"
Action:
- "logs:CreateLogGroup"
- "logs:CreateLogStream"
- "logs:PutLogEvents"
Resource: !Sub "arn:aws:logs:${AWS::Region}:${AWS::AccountId}:*"