-
Notifications
You must be signed in to change notification settings - Fork 0
/
template.yaml
233 lines (218 loc) · 6.7 KB
/
template.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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Description: 'Quicksilver API - The API for avatar.jairtrejo.com'
Parameters:
Stage:
Type: String
Description: Stage of this stack. Can be Dev or Prod.
AllowedValues:
- Dev
- Prod
Default: 'Dev'
CorsDomain:
Type: String
Description: CORS authorized domain for this API
Default: '*'
DomainName:
Type: String
Description: Domain name for the API, e.g. api-avatar.jairtrejo.com
Default: ''
SSLCertificateArn:
Type: String
Description: Arn for an SSL certificate that covers the domain
Default: ''
HostedZoneId:
Type: String
Description: HostedZone to create record for the domain
Default: ''
AvatarBucketName:
Type: String
Description: Bucket name to store the avatar images
Default: ''
Mappings:
SecretsMap:
Dev:
BananaApiKey: '{{resolve:ssm:/AvatarJairtrejo/Dev/BananaApiKey:1}}'
BananaModelKey: '{{resolve:ssm:/AvatarJairtrejo/Dev/BananaModelKey:1}}'
MastodonClientKey: '{{resolve:ssm:/AvatarJairtrejo/Dev/MastodonClientKey:1}}'
MastodonClientSecret: '{{resolve:ssm:/AvatarJairtrejo/Dev/MastodonClientSecret:1}}'
MastodonAccessToken: '{{resolve:ssm:/AvatarJairtrejo/Dev/MastodonAccessToken:1}}'
Prod:
BananaApiKey: '{{resolve:ssm:/AvatarJairtrejo/Prod/BananaApiKey:1}}'
BananaModelKey: '{{resolve:ssm:/AvatarJairtrejo/Prod/BananaModelKey:1}}'
MastodonClientKey: '{{resolve:ssm:/AvatarJairtrejo/Prod/MastodonClientKey:1}}'
MastodonClientSecret: '{{resolve:ssm:/AvatarJairtrejo/Prod/MastodonClientSecret:1}}'
MastodonAccessToken: '{{resolve:ssm:/AvatarJairtrejo/Prod/MastodonAccessToken:1}}'
Conditions:
ShouldMapDomain: !Not [ !Equals [ !Ref DomainName, "" ]]
Globals:
Function:
Timeout: 300
Environment:
Variables:
DYNAMO_TABLE_NAME: !Ref PromptTable
CORS_DOMAIN: !Ref CorsDomain
Tags:
Site: avatar.jairtrejo.com
Resources:
Api:
Type: 'AWS::Serverless::Api'
Properties:
StageName: Prod
Cors:
AllowOrigin: !Sub "'${CorsDomain}'"
AllowHeaders: "'Authorization'"
ApiDomainName:
Type: 'AWS::ApiGateway::DomainName'
Condition: ShouldMapDomain
Properties:
CertificateArn: !Ref SSLCertificateArn
DomainName: !Ref DomainName
ApiRedirectRecord:
Type: 'AWS::Route53::RecordSet'
Condition: ShouldMapDomain
Properties:
HostedZoneId: !Ref HostedZoneId
Name: api-avatar.jairtrejo.com
Type: A
AliasTarget:
HostedZoneId: !GetAtt ApiDomainName.DistributionHostedZoneId
DNSName: !GetAtt ApiDomainName.DistributionDomainName
ApiBasePathMapping:
Type: 'AWS::ApiGateway::BasePathMapping'
Condition: ShouldMapDomain
Properties:
DomainName: !Ref DomainName
RestApiId: !Ref Api
Stage: !Ref Api.Stage
PromptTable:
Type: 'AWS::DynamoDB::Table'
Properties:
TableName: !Sub "AvatarPrompt-${Stage}"
AttributeDefinitions:
- AttributeName: id
AttributeType: S
- AttributeName: created_at
AttributeType: N
- AttributeName: used_at
AttributeType: N
KeySchema:
- AttributeName: id
KeyType: HASH
GlobalSecondaryIndexes:
- IndexName: used_at
KeySchema:
- AttributeName: id
KeyType: HASH
- AttributeName: used_at
KeyType: RANGE
Projection:
ProjectionType: ALL
- IndexName: created_at
KeySchema:
- AttributeName: id
KeyType: HASH
- AttributeName: created_at
KeyType: RANGE
Projection:
ProjectionType: INCLUDE
NonKeyAttributes:
- used_at
BillingMode: PAY_PER_REQUEST
Tags:
- Key: Site
Value: avatar.jairtrejo.com
PromptQueue:
Type: 'AWS::SQS::Queue'
Properties:
VisibilityTimeout: 60
MessageRetentionPeriod: 900
SavePromptFunction:
Type: 'AWS::Serverless::Function'
Properties:
CodeUri: dist/
Handler: quicksilver.save_prompt
Runtime: python3.9
Environment:
Variables:
CORS_DOMAIN: !Ref CorsDomain
Events:
SavePrompt:
Type: Api
Properties:
RestApiId: !Ref Api
Path: /prompt
Method: post
Policies:
- DynamoDBCrudPolicy:
TableName: !Ref PromptTable
GetLatestPromptsFunction:
Type: 'AWS::Serverless::Function'
Properties:
CodeUri: dist/
Handler: quicksilver.get_latest_prompts
Runtime: python3.9
Environment:
Variables:
CORS_DOMAIN: !Ref CorsDomain
Events:
SavePrompt:
Type: Api
Properties:
RestApiId: !Ref Api
Path: /prompt
Method: get
Policies:
- DynamoDBCrudPolicy:
TableName: !Ref PromptTable
UpdatePictureFunction:
Type: 'AWS::Serverless::Function'
Properties:
CodeUri: dist/
Handler: quicksilver.update_picture
Runtime: python3.9
Timeout: 60
Environment:
Variables:
AVATAR_BUCKET: !Ref AvatarBucketName
BANANA_API_KEY: !FindInMap [SecretsMap, !Ref Stage, 'BananaApiKey']
BANANA_MODEL_KEY: !FindInMap [SecretsMap, !Ref Stage, 'BananaModelKey']
MASTODON_CLIENT_KEY: !FindInMap [SecretsMap, !Ref Stage, 'MastodonClientKey']
MASTODON_CLIENT_SECRET: !FindInMap [SecretsMap, !Ref Stage, 'MastodonClientSecret']
MASTODON_ACCESS_TOKEN: !FindInMap [SecretsMap, !Ref Stage, 'MastodonAccessToken']
Events:
UpdatePicture:
Type: SQS
Properties:
Queue: !GetAtt PromptQueue.Arn
BatchSize: 1
Policies:
- DynamoDBCrudPolicy:
TableName: !Ref PromptTable
- S3CrudPolicy:
BucketName: !Ref AvatarBucketName
PickPromptFunction:
Type: 'AWS::Serverless::Function'
Properties:
CodeUri: dist/
Handler: quicksilver.pick_prompt
Runtime: python3.9
Events:
ScheduleEvent:
Type: ScheduleV2
Properties:
Description: "Every day"
ScheduleExpression: "cron(05 08 * * ? *)"
ScheduleExpressionTimezone: "America/Los_Angeles"
EventInvokeConfig:
DestinationConfig:
OnSuccess:
Type: SQS
Destination: !GetAtt PromptQueue.Arn
Policies:
- DynamoDBCrudPolicy:
TableName: !Ref PromptTable
Outputs:
ApiEndpoint:
Description: "API Gateway endpoint"
Value: !Sub "https://${Api}.execute-api.${AWS::Region}.amazonaws.com/Prod/"