-
Notifications
You must be signed in to change notification settings - Fork 40
Expand file tree
/
Copy pathvscode.yaml
More file actions
543 lines (509 loc) · 20.6 KB
/
vscode.yaml
File metadata and controls
543 lines (509 loc) · 20.6 KB
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
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
Description: VsCode For Java on AWS Lambda Workshop
Resources:
javaonawsworkshopIdeVPC0F0320A4:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 192.168.0.0/16
EnableDnsHostnames: true
EnableDnsSupport: true
InstanceTenancy: default
Tags:
- Key: Name
Value: CdkStack/java-on-aws-lambda-workshop/IdeVPC
javaonawsworkshopIdeVPCPublicSubnet1Subnet6E964131:
Type: AWS::EC2::Subnet
Properties:
AvailabilityZone:
Fn::Select:
- 0
- Fn::GetAZs: ""
CidrBlock: 192.168.0.0/24
MapPublicIpOnLaunch: true
Tags:
- Key: aws-cdk:subnet-name
Value: Public
- Key: aws-cdk:subnet-type
Value: Public
- Key: Name
Value: CdkStack/java-on-aws-lambda-workshop/IdeVPC/PublicSubnet1
VpcId:
Ref: javaonawsworkshopIdeVPC0F0320A4
javaonawsworkshopIdeVPCPublicSubnet1RouteTable28BB44D2:
Type: AWS::EC2::RouteTable
Properties:
Tags:
- Key: Name
Value: CdkStack/java-on-aws-lambda-workshop/IdeVPC/PublicSubnet1
VpcId:
Ref: javaonawsworkshopIdeVPC0F0320A4
javaonawsworkshopIdeVPCPublicSubnet1RouteTableAssociationB29B5B27:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
RouteTableId:
Ref: javaonawsworkshopIdeVPCPublicSubnet1RouteTable28BB44D2
SubnetId:
Ref: javaonawsworkshopIdeVPCPublicSubnet1Subnet6E964131
javaonawsworkshopIdeVPCPublicSubnet1DefaultRoute19EC8307:
Type: AWS::EC2::Route
Properties:
DestinationCidrBlock: 0.0.0.0/0
GatewayId:
Ref: javaonawsworkshopIdeVPCIGWDC2A959B
RouteTableId:
Ref: javaonawsworkshopIdeVPCPublicSubnet1RouteTable28BB44D2
DependsOn:
- javaonawsworkshopIdeVPCVPCGWA205EE37
javaonawsworkshopIdeVPCIGWDC2A959B:
Type: AWS::EC2::InternetGateway
Properties:
Tags:
- Key: Name
Value: CdkStack/java-on-aws-lambda-workshop/IdeVPC
javaonawsworkshopIdeVPCVPCGWA205EE37:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
InternetGatewayId:
Ref: javaonawsworkshopIdeVPCIGWDC2A959B
VpcId:
Ref: javaonawsworkshopIdeVPC0F0320A4
javaonawsworkshopIdeRoleB328D43C:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Statement:
- Action: sts:AssumeRole
Effect: Allow
Principal:
Service: ec2.amazonaws.com
Version: "2012-10-17"
ManagedPolicyArns:
- Fn::Join:
- ""
- - "arn:"
- Ref: AWS::Partition
- :iam::aws:policy/AmazonSSMManagedInstanceCore
- Fn::Join:
- ""
- - "arn:"
- Ref: AWS::Partition
- :iam::aws:policy/AdministratorAccess
javaonawsworkshopIdeSecurityGroup34BA1277:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: IDE security group
SecurityGroupEgress:
- CidrIp: 0.0.0.0/0
Description: Allow all outbound traffic by default
IpProtocol: "-1"
SecurityGroupIngress:
- CidrIp: 0.0.0.0/0
Description: HTTP from anywhere
FromPort: 80
IpProtocol: tcp
ToPort: 80
- CidrIp: 0.0.0.0/0
Description: from 0.0.0.0/0:8080
FromPort: 8080
IpProtocol: tcp
ToPort: 8080
VpcId:
Ref: javaonawsworkshopIdeVPC0F0320A4
javaonawsworkshopInstanceProfile3D31AAC7:
Type: AWS::IAM::InstanceProfile
Properties:
Roles:
- Ref: javaonawsworkshopIdeRoleB328D43C
DependsOn:
- javaonawsworkshopIdeVPCIGWDC2A959B
- javaonawsworkshopIdeVPCPublicSubnet1DefaultRoute19EC8307
- javaonawsworkshopIdeVPCPublicSubnet1RouteTable28BB44D2
- javaonawsworkshopIdeVPCPublicSubnet1RouteTableAssociationB29B5B27
- javaonawsworkshopIdeVPCPublicSubnet1Subnet6E964131
- javaonawsworkshopIdeVPC0F0320A4
- javaonawsworkshopIdeVPCVPCGWA205EE37
javaonawsworkshop508294B4:
Type: AWS::EC2::Instance
Properties:
AvailabilityZone:
Fn::Select:
- 0
- Fn::GetAZs: ""
BlockDeviceMappings:
- DeviceName: /dev/xvda
Ebs:
DeleteOnTermination: true
VolumeSize: 50
VolumeType: gp3
IamInstanceProfile:
Ref: javaonawsworkshopInstanceProfile3D31AAC7
ImageId:
Ref: SsmParameterValueawsserviceamiamazonlinuxlatestal2023amikernel61x8664C96584B6F00A464EAD1953AFF4B05118Parameter
InstanceType: t3.large
NetworkInterfaces:
- AssociatePublicIpAddress: true
DeviceIndex: "0"
GroupSet:
- Fn::GetAtt:
- javaonawsworkshopIdeSecurityGroup34BA1277
- GroupId
SubnetId:
Ref: javaonawsworkshopIdeVPCPublicSubnet1Subnet6E964131
Tags:
- Key: Name
Value: CdkStack/java-on-aws-lambda-workshop/VsCode
UserData:
Fn::Base64: "#!/bin/bash"
DependsOn:
- javaonawsworkshopIdeRoleB328D43C
- javaonawsworkshopIdeVPCIGWDC2A959B
- javaonawsworkshopIdeVPCPublicSubnet1DefaultRoute19EC8307
- javaonawsworkshopIdeVPCPublicSubnet1RouteTable28BB44D2
- javaonawsworkshopIdeVPCPublicSubnet1RouteTableAssociationB29B5B27
- javaonawsworkshopIdeVPCPublicSubnet1Subnet6E964131
- javaonawsworkshopIdeVPC0F0320A4
- javaonawsworkshopIdeVPCVPCGWA205EE37
javaonawsworkshopBootstrapRoleF67B9172:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Statement:
- Action: sts:AssumeRole
Effect: Allow
Principal:
Service: lambda.amazonaws.com
Version: "2012-10-17"
Policies:
- PolicyDocument:
Statement:
- Action:
- logs:CreateLogGroup
- logs:CreateLogStream
- logs:PutLogEvents
Effect: Allow
Resource: arn:aws:logs:*:*:*
- Action:
- cloudformation:DescribeStackEvents
- cloudformation:DescribeStackResource
- cloudformation:DescribeStackResources
- cloudformation:DescribeStacks
- ec2:DescribeInstances
- iam:ListInstanceProfiles
- ssm:DescribeInstanceInformation
- ssm:GetCommandInvocation
- ssm:SendCommand
Effect: Allow
Resource: "*"
- Action:
- iam:PassRole
Effect: Allow
Resource:
Fn::GetAtt:
- javaonawsworkshopIdeRoleB328D43C
- Arn
Version: "2012-10-17"
PolicyName: bootstrapPolicy
javaonawsworkshopBootstrapFunction8997FD07:
Type: AWS::Lambda::Function
Properties:
Code:
ZipFile: |-
from __future__ import print_function
import boto3
import json
import os
import time
import traceback
import cfnresponse
from botocore.exceptions import WaiterError
def lambda_handler(event, context):
print('Event: {}'.format(event))
print('context: {}'.format(context))
responseData = {}
status = cfnresponse.SUCCESS
if event['RequestType'] == 'Delete':
responseData = {'Success': 'Custom Resource removed'}
cfnresponse.send(event, context, status, responseData, 'CustomResourcePhysicalID')
else:
try:
# Open AWS clients
ec2 = boto3.client('ec2')
ssm = boto3.client('ssm')
instance_id = event['ResourceProperties']['InstanceId']
print('Waiting for the instance to be ready...')
# Wait for Instance to become ready
instance_state = 'unknown'
print('Instance is currently in state'.format(instance_state))
while instance_state != 'running':
time.sleep(5)
di = ec2.describe_instances(InstanceIds=[instance_id])
instance_state = di['Reservations'][0]['Instances'][0]['State']['Name']
print('Waiting for instance in state: {}'.format(instance_state))
print('Instance is ready')
print('Waiting for instance to come online in SSM...')
for i in range(1, 60):
response = ssm.describe_instance_information(Filters=[{'Key': 'InstanceIds', 'Values': [instance_id]}])
if len(response["InstanceInformationList"]) == 0:
print('No instances in SSM')
elif len(response["InstanceInformationList"]) > 0 and \
response["InstanceInformationList"][0]["PingStatus"] == "Online" and \
response["InstanceInformationList"][0]["InstanceId"] == instance_id:
print('Instance is online in SSM')
break
time.sleep(10)
ssm_document = event['ResourceProperties']['SsmDocument']
ssm.send_command(
InstanceIds=[instance_id],
DocumentName=ssm_document)
responseData = {'Success': 'Started bootstrapping for instance: '+instance_id}
except Exception as e:
status = cfnresponse.FAILED
tb_err = traceback.format_exc()
print(tb_err)
responseData = {'Error': tb_err}
finally:
cfnresponse.send(event, context, status, responseData, 'CustomResourcePhysicalID')
Environment:
Variables:
DiskSize: "50"
Handler: index.lambda_handler
Role:
Fn::GetAtt:
- javaonawsworkshopBootstrapRoleF67B9172
- Arn
Runtime: python3.9
Timeout: 900
DependsOn:
- javaonawsworkshopBootstrapRoleF67B9172
javaonawsworkshopPasswordFunction6F55B175:
Type: AWS::Lambda::Function
Properties:
Code:
ZipFile: |-
import string
import random
import traceback
import cfnresponse
def lambda_handler(event, context):
print('Event: {}'.format(event))
print('context: {}'.format(context))
responseData = {}
status = cfnresponse.SUCCESS
if event['RequestType'] == 'Delete':
cfnresponse.send(event, context, status, responseData, 'CustomResourcePhysicalID')
else:
try:
res = ''.join(random.choices(string.ascii_uppercase + string.digits, k=24))
responseData = {'RandomString': str(res)}
except Exception as e:
status = cfnresponse.FAILED
tb_err = traceback.format_exc()
print(tb_err)
responseData = {'Error': tb_err}
finally:
cfnresponse.send(event, context, status, responseData, 'CustomResourcePhysicalID')
Handler: index.lambda_handler
Role:
Fn::GetAtt:
- javaonawsworkshopBootstrapRoleF67B9172
- Arn
Runtime: python3.9
Timeout: 180
DependsOn:
- javaonawsworkshopBootstrapRoleF67B9172
javaonawsworkshopPasswordResource45B4A7F3:
Type: AWS::CloudFormation::CustomResource
Properties:
ServiceToken:
Fn::GetAtt:
- javaonawsworkshopPasswordFunction6F55B175
- Arn
UpdateReplacePolicy: Delete
DeletionPolicy: Delete
javaonawsworkshopVsCodeDistributionEF5FD854:
Type: AWS::CloudFront::Distribution
Properties:
DistributionConfig:
DefaultCacheBehavior:
AllowedMethods:
- GET
- HEAD
- OPTIONS
- PUT
- PATCH
- POST
- DELETE
CachePolicyId: 4135ea2d-6df8-44a3-9df3-4b5a84be39ad
Compress: true
OriginRequestPolicyId: 216adef6-5c7f-47e4-b989-5492eafa07d3
TargetOriginId: CdkStackjavaonawsworkshopVsCodeDistributionOrigin1ACDD2164
ViewerProtocolPolicy: allow-all
Enabled: true
HttpVersion: http2
IPV6Enabled: true
Origins:
- CustomOriginConfig:
HTTPPort: 80
OriginProtocolPolicy: http-only
OriginSSLProtocols:
- TLSv1.2
DomainName:
Fn::GetAtt:
- javaonawsworkshop508294B4
- PublicDnsName
Id: CdkStackjavaonawsworkshopVsCodeDistributionOrigin1ACDD2164
javaonawsworkshopBootstrapWaitConditionHandle62920104:
Type: AWS::CloudFormation::WaitConditionHandle
javaonawsworkshopBootstrapWaitConditionFA6D9BBF:
Type: AWS::CloudFormation::WaitCondition
Properties:
Count: 1
Handle:
Ref: javaonawsworkshopBootstrapWaitConditionHandle62920104
Timeout: "3600"
javaonawsworkshopBootstrapWaiter0ED1571C:
Type: AWS::SSM::Parameter
Properties:
Type: String
Value: Done
DependsOn:
- javaonawsworkshopBootstrapWaitConditionFA6D9BBF
javaonawsworkshopBootstrapDocumentA39E080E:
Type: AWS::SSM::Document
Properties:
Content:
schemaVersion: "2.2"
description: Bootstrap IDE
parameters:
BootstrapScript:
type: String
description: (Optional) Custom bootstrap script to run.
default: ""
mainSteps:
- action: aws:runShellScript
name: IdeBootstrap
inputs:
runCommand:
- Fn::Sub:
- |-
bash << HEREDOC
set -e
set -o xtrace
# Install AWS CLI
curl -L -o /tmp/aws-cli.zip https://awscli.amazonaws.com/awscli-exe-linux-$(uname -m).zip
unzip -d /tmp /tmp/aws-cli.zip
/tmp/aws/install --update
rm -rf /tmp/aws
# Install docker and base package
dnf install -y docker git
service docker start
usermod -aG docker ec2-user
# Install code-server
codeServer=$(dnf list installed code-server | wc -l)
if [ "\$codeServer" -eq "0" ]; then
sudo -u ec2-user "codeServerVersion=${codeServerVersion}" bash -c 'curl -fsSL https://code-server.dev/install.sh | sh -s -- --version ${codeServerVersion}'
systemctl enable --now code-server@ec2-user
fi
sudo -u ec2-user bash -c 'mkdir -p ~/.config/code-server'
sudo -u ec2-user bash -c 'touch ~/.config/code-server/config.yaml'
tee /home/ec2-user/.config/code-server/config.yaml <<EOF
cert: false
auth: password
password: "${password}"
bind-addr: 127.0.0.1:8889
EOF
sudo -u ec2-user bash -c 'mkdir -p ~/.local/share/code-server/User'
sudo -u ec2-user bash -c 'touch ~/.local/share/code-server/User/settings.json'
tee /home/ec2-user/.local/share/code-server/User/settings.json <<EOF
{
"extensions.autoUpdate": false,
"extensions.autoCheckUpdates": false,
"security.workspace.trust.enabled": false,
"workbench.startupEditor": "terminal",
"task.allowAutomaticTasks": "on",
"telemetry.telemetryLevel": "off",
"update.mode": "none",
"update.showReleaseNotes": false
}
EOF
systemctl restart code-server@ec2-user
# Install caddy
dnf copr enable -y @caddy/caddy epel-9-x86_64
dnf install -y caddy
systemctl enable --now caddy
tee /etc/caddy/Caddyfile <<EOF
http://${domain} {
reverse_proxy 127.0.0.1:8889
}
EOF
systemctl restart caddy
# Create default directory for workspace
sudo -u ec2-user bash -c 'mkdir -p ~/environment'
if [ ! -f "/home/ec2-user/.local/share/code-server/coder.json" ]; then
sudo -u ec2-user bash -c 'touch ~/.local/share/code-server/coder.json'
echo '{ "query": { "folder": "/home/ec2-user/environment" } }' > /home/ec2-user/.local/share/code-server/coder.json
fi
${customBootstrapScript}
HEREDOC
exit_code=$?
/opt/aws/bin/cfn-signal -e $exit_code '${waitConditionHandleUrl}'
exit $exit_code
- password:
Fn::GetAtt:
- javaonawsworkshopPasswordResource45B4A7F3
- RandomString
domain:
Fn::GetAtt:
- javaonawsworkshopVsCodeDistributionEF5FD854
- DomainName
codeServerVersion: 4.99.3
waitConditionHandleUrl:
Ref: javaonawsworkshopBootstrapWaitConditionHandle62920104
customBootstrapScript: |
date
echo '=== Install VSCode extensions ==='
sudo -H -u ec2-user bash -c "code-server --install-extension amazonwebservices.aws-toolkit-vscode --force"
sudo -H -u ec2-user bash -c "code-server --install-extension amazonwebservices.amazon-q-vscode --force"
sudo -H -u ec2-user bash -c "code-server --install-extension vscjava.vscode-java-pack --force"
echo '=== Clone Git repository ==='
sudo -H -u ec2-user bash -c "git clone https://github.com/aws-samples/aws-lambda-java-workshop.git /home/ec2-user/environment/aws-lambda-java-workshop/"
echo '=== Setup VSCode ==='
sudo -H -i -u ec2-user bash -c "/home/ec2-user/environment/aws-lambda-java-workshop/setup/setup-vscode.sh &>> /home/ec2-user/setup-vscode.log"
echo '=== Setup Infrastructure components ==='
sudo -H -i -u ec2-user bash -c "cd /home/ec2-user/environment/aws-lambda-java-workshop/labs/unicorn-store/ && ./setup-infrastructure.sh &>> /home/ec2-user/setup-infra.log"
echo '=== Change Instance profile to User ==='
sudo -H -i -u ec2-user bash -c "cd /home/ec2-user/environment/aws-lambda-java-workshop/labs/unicorn-store/ && ./setup-change2user.sh &>> /home/ec2-user/setup-change2user.log"
DocumentFormat: YAML
DocumentType: Command
javaonawsworkshopBootstrapResource107C8B5F:
Type: AWS::CloudFormation::CustomResource
Properties:
ServiceToken:
Fn::GetAtt:
- javaonawsworkshopBootstrapFunction8997FD07
- Arn
InstanceId:
Ref: javaonawsworkshop508294B4
SsmDocument:
Ref: javaonawsworkshopBootstrapDocumentA39E080E
UpdateReplacePolicy: Delete
DeletionPolicy: Delete
Parameters:
SsmParameterValueawsserviceamiamazonlinuxlatestal2023amikernel61x8664C96584B6F00A464EAD1953AFF4B05118Parameter:
Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
Default: /aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64
Outputs:
IdeUrl:
Description: Workshop IDE Url
Value:
Fn::Join:
- ""
- - https://
- Fn::GetAtt:
- javaonawsworkshopVsCodeDistributionEF5FD854
- DomainName
IdePassword:
Description: Workshop IDE Password
Value:
Fn::GetAtt:
- javaonawsworkshopPasswordResource45B4A7F3
- RandomString