@mavogel/cdk-vscode-server 0.0.62 → 0.0.64

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/.jsii +124 -178
  2. package/API.md +105 -200
  3. package/CLAUDE.md +288 -58
  4. package/README.md +40 -2
  5. package/assets/idle-monitor-enabler/idle-monitor-enabler.lambda/index.js +67 -0
  6. package/assets/installer/installer.lambda/index.js +67 -30
  7. package/awslint.json +5 -0
  8. package/examples/auto-stop/main.ts +1 -1
  9. package/examples/custom/main.ts +1 -1
  10. package/examples/git-repo/main.ts +30 -0
  11. package/integ-tests/integ.al2023.ts.snapshot/IntegSetupVSCodeOnAl2023DefaultTestDeployAssert74D8F645.assets.json +2 -2
  12. package/integ-tests/integ.al2023.ts.snapshot/IntegSetupVSCodeOnAl2023DefaultTestDeployAssert74D8F645.template.json +1 -1
  13. package/integ-tests/integ.al2023.ts.snapshot/IntegTestStackAl2023.assets.json +8 -8
  14. package/integ-tests/integ.al2023.ts.snapshot/IntegTestStackAl2023.template.json +257 -94
  15. package/integ-tests/{integ.stop-on-idle.ts.snapshot/asset.33da23274e25bd9f43638c5d83dad26e3931cbe78d462ffd9a9f565e948b4f5f.lambda → integ.al2023.ts.snapshot/asset.2f99f38311da357eaaea1284d67c759759324dec4a1cd11621d9c59eea9e81df.lambda}/index.js +67 -30
  16. package/integ-tests/{integ.ubuntu.ts.snapshot/asset.0ad50fc42afd768c3d0bfdd4701e43284fb077a25f19eea1e8c51a5ca36ebfe4 → integ.al2023.ts.snapshot/asset.efac30c7091c58fed492058fa6403c14f7e58aab8cf4fd595d838b8d5eeec2b9}/index.js +50 -25
  17. package/integ-tests/integ.al2023.ts.snapshot/integ.json +1 -1
  18. package/integ-tests/integ.al2023.ts.snapshot/manifest.json +19 -3
  19. package/integ-tests/integ.al2023.ts.snapshot/tree.json +1 -1
  20. package/integ-tests/integ.custom-domain.ts.snapshot/IntegSetupVSCodeOnCustomDomainDefaultTestDeployAssert6982D514.assets.json +2 -2
  21. package/integ-tests/integ.custom-domain.ts.snapshot/IntegSetupVSCodeOnCustomDomainDefaultTestDeployAssert6982D514.template.json +1 -1
  22. package/integ-tests/integ.custom-domain.ts.snapshot/IntegTestStackCustomDomain.assets.json +8 -8
  23. package/integ-tests/integ.custom-domain.ts.snapshot/IntegTestStackCustomDomain.template.json +273 -97
  24. package/integ-tests/{integ.ubuntu.ts.snapshot/asset.33da23274e25bd9f43638c5d83dad26e3931cbe78d462ffd9a9f565e948b4f5f.lambda → integ.custom-domain.ts.snapshot/asset.2f99f38311da357eaaea1284d67c759759324dec4a1cd11621d9c59eea9e81df.lambda}/index.js +67 -30
  25. package/integ-tests/{integ.al2023.ts.snapshot/asset.0ad50fc42afd768c3d0bfdd4701e43284fb077a25f19eea1e8c51a5ca36ebfe4 → integ.custom-domain.ts.snapshot/asset.efac30c7091c58fed492058fa6403c14f7e58aab8cf4fd595d838b8d5eeec2b9}/index.js +50 -25
  26. package/integ-tests/integ.custom-domain.ts.snapshot/integ.json +1 -1
  27. package/integ-tests/integ.custom-domain.ts.snapshot/manifest.json +25 -6
  28. package/integ-tests/integ.custom-domain.ts.snapshot/tree.json +1 -1
  29. package/integ-tests/integ.stop-on-idle.ts +1 -4
  30. package/integ-tests/integ.stop-on-idle.ts.snapshot/IntegStopOnIdleFunctionalityDefaultTestDeployAssertEECF3FC0.assets.json +2 -2
  31. package/integ-tests/integ.stop-on-idle.ts.snapshot/IntegStopOnIdleFunctionalityDefaultTestDeployAssertEECF3FC0.template.json +4 -4
  32. package/integ-tests/integ.stop-on-idle.ts.snapshot/IntegTestStackStopOnIdle.assets.json +23 -9
  33. package/integ-tests/integ.stop-on-idle.ts.snapshot/IntegTestStackStopOnIdle.template.json +758 -197
  34. package/integ-tests/integ.stop-on-idle.ts.snapshot/asset.22c8a6c357b704e370bef317ae1b52c59f684aa7640422a3d1dfe813d1f77853.lambda/index.js +67 -0
  35. package/integ-tests/{integ.custom-domain.ts.snapshot/asset.33da23274e25bd9f43638c5d83dad26e3931cbe78d462ffd9a9f565e948b4f5f.lambda → integ.stop-on-idle.ts.snapshot/asset.2f99f38311da357eaaea1284d67c759759324dec4a1cd11621d9c59eea9e81df.lambda}/index.js +67 -30
  36. package/integ-tests/integ.stop-on-idle.ts.snapshot/manifest.json +363 -76
  37. package/integ-tests/integ.stop-on-idle.ts.snapshot/tree.json +1 -1
  38. package/integ-tests/integ.ubuntu.ts.snapshot/IntegSetupVSCodeOnUbuntuDefaultTestDeployAssertFF8DF2C5.assets.json +2 -2
  39. package/integ-tests/integ.ubuntu.ts.snapshot/IntegSetupVSCodeOnUbuntuDefaultTestDeployAssertFF8DF2C5.template.json +1 -1
  40. package/integ-tests/integ.ubuntu.ts.snapshot/IntegTestStackUbuntu22.assets.json +8 -8
  41. package/integ-tests/integ.ubuntu.ts.snapshot/IntegTestStackUbuntu22.template.json +273 -97
  42. package/integ-tests/{integ.al2023.ts.snapshot/asset.33da23274e25bd9f43638c5d83dad26e3931cbe78d462ffd9a9f565e948b4f5f.lambda → integ.ubuntu.ts.snapshot/asset.2f99f38311da357eaaea1284d67c759759324dec4a1cd11621d9c59eea9e81df.lambda}/index.js +67 -30
  43. package/integ-tests/{integ.custom-domain.ts.snapshot/asset.0ad50fc42afd768c3d0bfdd4701e43284fb077a25f19eea1e8c51a5ca36ebfe4 → integ.ubuntu.ts.snapshot/asset.efac30c7091c58fed492058fa6403c14f7e58aab8cf4fd595d838b8d5eeec2b9}/index.js +50 -25
  44. package/integ-tests/integ.ubuntu.ts.snapshot/integ.json +1 -1
  45. package/integ-tests/integ.ubuntu.ts.snapshot/manifest.json +25 -6
  46. package/integ-tests/integ.ubuntu.ts.snapshot/tree.json +1 -1
  47. package/integ-tests/integ.ubuntu24.ts +69 -0
  48. package/integ-tests/integ.ubuntu24.ts.snapshot/IntegSetupVSCodeOnUbuntuDefaultTestDeployAssertFF8DF2C5.assets.json +33 -0
  49. package/integ-tests/integ.ubuntu24.ts.snapshot/IntegSetupVSCodeOnUbuntuDefaultTestDeployAssertFF8DF2C5.template.json +337 -0
  50. package/integ-tests/integ.ubuntu24.ts.snapshot/IntegTestStackUbuntu24.assets.json +118 -0
  51. package/integ-tests/integ.ubuntu24.ts.snapshot/IntegTestStackUbuntu24.template.json +2725 -0
  52. package/integ-tests/integ.ubuntu24.ts.snapshot/asset.2819175352ad1ce0dae768e83fc328fb70fb5f10b4a8ff0ccbcb791f02b0716d/index.js +1 -0
  53. package/integ-tests/integ.ubuntu24.ts.snapshot/asset.2f99f38311da357eaaea1284d67c759759324dec4a1cd11621d9c59eea9e81df.lambda/index.js +180 -0
  54. package/integ-tests/integ.ubuntu24.ts.snapshot/asset.530055f7515b3f0a47900f5df37e729ba40ca977b2d07b952bdefa2b8f883f42.bundle/index.js +30676 -0
  55. package/integ-tests/integ.ubuntu24.ts.snapshot/asset.781ab0ab74634cdaf61539ab208ab777829ef07097ac21f95b9e15a3b1eedc1b.lambda/index.js +57 -0
  56. package/integ-tests/integ.ubuntu24.ts.snapshot/asset.7fa1e366ee8a9ded01fc355f704cff92bfd179574e6f9cfee800a3541df1b200/__entrypoint__.js +1 -0
  57. package/integ-tests/integ.ubuntu24.ts.snapshot/asset.7fa1e366ee8a9ded01fc355f704cff92bfd179574e6f9cfee800a3541df1b200/index.js +1 -0
  58. package/integ-tests/integ.ubuntu24.ts.snapshot/asset.9d043014be736e8162bcc7ec5590cc6d2ff24fd0d9c73a5c5d595151c5fdad00/index.js +1 -0
  59. package/integ-tests/integ.ubuntu24.ts.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/cfn-response.js +1 -0
  60. package/integ-tests/integ.ubuntu24.ts.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/consts.js +1 -0
  61. package/integ-tests/integ.ubuntu24.ts.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/framework.js +3 -0
  62. package/integ-tests/integ.ubuntu24.ts.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/outbound.js +1 -0
  63. package/integ-tests/integ.ubuntu24.ts.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/util.js +1 -0
  64. package/integ-tests/integ.ubuntu24.ts.snapshot/asset.efac30c7091c58fed492058fa6403c14f7e58aab8cf4fd595d838b8d5eeec2b9/index.js +6017 -0
  65. package/integ-tests/integ.ubuntu24.ts.snapshot/integ.json +23 -0
  66. package/integ-tests/integ.ubuntu24.ts.snapshot/manifest.json +1473 -0
  67. package/integ-tests/integ.ubuntu24.ts.snapshot/tree.json +1 -0
  68. package/integ-tests/integ.ubuntu25.ts +69 -0
  69. package/integ-tests/integ.ubuntu25.ts.snapshot/IntegSetupVSCodeOnUbuntu25DefaultTestDeployAssert48DBCF35.assets.json +33 -0
  70. package/integ-tests/integ.ubuntu25.ts.snapshot/IntegSetupVSCodeOnUbuntu25DefaultTestDeployAssert48DBCF35.template.json +337 -0
  71. package/integ-tests/integ.ubuntu25.ts.snapshot/IntegTestStackUbuntu25.assets.json +118 -0
  72. package/integ-tests/integ.ubuntu25.ts.snapshot/IntegTestStackUbuntu25.template.json +2725 -0
  73. package/integ-tests/integ.ubuntu25.ts.snapshot/asset.2819175352ad1ce0dae768e83fc328fb70fb5f10b4a8ff0ccbcb791f02b0716d/index.js +1 -0
  74. package/integ-tests/integ.ubuntu25.ts.snapshot/asset.2f99f38311da357eaaea1284d67c759759324dec4a1cd11621d9c59eea9e81df.lambda/index.js +180 -0
  75. package/integ-tests/integ.ubuntu25.ts.snapshot/asset.530055f7515b3f0a47900f5df37e729ba40ca977b2d07b952bdefa2b8f883f42.bundle/index.js +30676 -0
  76. package/integ-tests/integ.ubuntu25.ts.snapshot/asset.781ab0ab74634cdaf61539ab208ab777829ef07097ac21f95b9e15a3b1eedc1b.lambda/index.js +57 -0
  77. package/integ-tests/integ.ubuntu25.ts.snapshot/asset.7fa1e366ee8a9ded01fc355f704cff92bfd179574e6f9cfee800a3541df1b200/__entrypoint__.js +1 -0
  78. package/integ-tests/integ.ubuntu25.ts.snapshot/asset.7fa1e366ee8a9ded01fc355f704cff92bfd179574e6f9cfee800a3541df1b200/index.js +1 -0
  79. package/integ-tests/integ.ubuntu25.ts.snapshot/asset.9d043014be736e8162bcc7ec5590cc6d2ff24fd0d9c73a5c5d595151c5fdad00/index.js +1 -0
  80. package/integ-tests/integ.ubuntu25.ts.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/cfn-response.js +1 -0
  81. package/integ-tests/integ.ubuntu25.ts.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/consts.js +1 -0
  82. package/integ-tests/integ.ubuntu25.ts.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/framework.js +3 -0
  83. package/integ-tests/integ.ubuntu25.ts.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/outbound.js +1 -0
  84. package/integ-tests/integ.ubuntu25.ts.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/util.js +1 -0
  85. package/integ-tests/integ.ubuntu25.ts.snapshot/asset.efac30c7091c58fed492058fa6403c14f7e58aab8cf4fd595d838b8d5eeec2b9/index.js +6017 -0
  86. package/integ-tests/integ.ubuntu25.ts.snapshot/integ.json +23 -0
  87. package/integ-tests/integ.ubuntu25.ts.snapshot/manifest.json +1473 -0
  88. package/integ-tests/integ.ubuntu25.ts.snapshot/tree.json +1 -0
  89. package/lib/idle-monitor/idle-monitor-function.js +2 -2
  90. package/lib/idle-monitor/idle-monitor.js +5 -2
  91. package/lib/idle-monitor-enabler/idle-monitor-enabler-function.d.ts +13 -0
  92. package/lib/idle-monitor-enabler/idle-monitor-enabler-function.js +22 -0
  93. package/lib/idle-monitor-enabler/idle-monitor-enabler.d.ts +25 -0
  94. package/lib/idle-monitor-enabler/idle-monitor-enabler.js +76 -0
  95. package/lib/idle-monitor-enabler/idle-monitor-enabler.lambda.d.ts +9 -0
  96. package/lib/idle-monitor-enabler/idle-monitor-enabler.lambda.js +48 -0
  97. package/lib/index.d.ts +0 -1
  98. package/lib/index.js +1 -2
  99. package/lib/installer/installer-function.js +2 -2
  100. package/lib/installer/installer.d.ts +105 -0
  101. package/lib/installer/installer.js +659 -301
  102. package/lib/installer/installer.lambda.js +64 -30
  103. package/lib/mappings.js +11 -3
  104. package/lib/secret-retriever/secret-retriever-function.js +2 -2
  105. package/lib/vscode-server.d.ts +45 -1
  106. package/lib/vscode-server.js +35 -5
  107. package/package.json +12 -12
  108. package/.claude/hooks/file_checker.sh +0 -178
  109. package/.qlty/.gitignore +0 -7
  110. package/.qlty/configs/.yamllint.yaml +0 -21
  111. package/.qlty/qlty.toml +0 -115
  112. package/assets/status-check/status-check.lambda/index.js +0 -123
  113. package/integ-tests/integ.al2023.ts.snapshot/cdk.out +0 -1
  114. package/integ-tests/integ.al2023.ts.snapshot/read.13497.1.lock +0 -1
  115. package/integ-tests/integ.custom-domain.ts.snapshot/read.13497.1.lock +0 -1
  116. package/integ-tests/integ.ubuntu.ts.snapshot/cdk.out +0 -1
  117. package/integ-tests/integ.ubuntu.ts.snapshot/read.13497.1.lock +0 -1
  118. package/lib/status-check/status-check-function.d.ts +0 -13
  119. package/lib/status-check/status-check-function.js +0 -22
  120. package/lib/status-check/status-check.d.ts +0 -36
  121. package/lib/status-check/status-check.js +0 -109
  122. package/lib/status-check/status-check.lambda.d.ts +0 -2
  123. package/lib/status-check/status-check.lambda.js +0 -104
@@ -125,7 +125,7 @@
125
125
  "Arn"
126
126
  ]
127
127
  },
128
- "Runtime": "nodejs20.x",
128
+ "Runtime": "nodejs22.x",
129
129
  "Timeout": 10
130
130
  },
131
131
  "DependsOn": [
@@ -1470,20 +1470,29 @@
1470
1470
  },
1471
1471
  "NodeVersion": {
1472
1472
  "type": "String",
1473
- "default": "20",
1473
+ "default": "22",
1474
1474
  "allowedValues": [
1475
+ "24",
1475
1476
  "22",
1476
1477
  "20",
1477
1478
  "18"
1478
1479
  ]
1479
1480
  },
1480
- "DotNetVersion": {
1481
+ "RepoUrl": {
1481
1482
  "type": "String",
1482
- "default": "8.0",
1483
- "allowedValues": [
1484
- "8.0",
1485
- "7.0"
1486
- ]
1483
+ "default": ""
1484
+ },
1485
+ "AssetZipS3Path": {
1486
+ "type": "String",
1487
+ "default": ""
1488
+ },
1489
+ "BranchZipS3Path": {
1490
+ "type": "String",
1491
+ "default": ""
1492
+ },
1493
+ "FolderZipS3Path": {
1494
+ "type": "String",
1495
+ "default": ""
1487
1496
  }
1488
1497
  },
1489
1498
  "mainSteps": [
@@ -1525,11 +1534,10 @@
1525
1534
  "inputs": {
1526
1535
  "runCommand": [
1527
1536
  "#!/bin/bash",
1528
- "echo 'Adding user: participant'",
1529
- "adduser -c '' participant",
1530
- "passwd -l participant",
1531
- "echo \"participant:{{ VSCodePassword }}\" | chpasswd",
1532
- "usermod -aG wheel participant",
1537
+ "if [[ \"participant\" == \"ec2-user\" ]]\nthen\n echo 'Using existing user: participant'\nelse\n echo 'Adding user: participant'\n adduser -c '' participant\n passwd -l participant\n echo \"participant:{{ VSCodePassword }}\" | chpasswd\n usermod -aG wheel participant\nfi",
1538
+ "tee /etc/sudoers.d/91-vscode-user <<EOF\nparticipant ALL=(ALL) NOPASSWD:ALL\nEOF",
1539
+ "mkdir -p /home/participant && chown -R participant:participant /home/participant",
1540
+ "mkdir -p /home/participant/.local/bin && chown -R participant:participant /home/participant",
1533
1541
  "echo \"User added. Checking configuration\"",
1534
1542
  "getent passwd participant"
1535
1543
  ]
@@ -1537,32 +1545,58 @@
1537
1545
  },
1538
1546
  {
1539
1547
  "action": "aws:runShellScript",
1540
- "name": "InstallNodeDnf",
1548
+ "name": "UpdateProfile",
1541
1549
  "inputs": {
1542
1550
  "runCommand": [
1543
1551
  "#!/bin/bash",
1544
- "dnf install -y nodejs20 npm",
1545
- "ln -s -f /usr/bin/node-20 /usr/bin/node",
1546
- "npm install -g npm@latest",
1547
- "echo \"Node and npm installed. Checking configuration\"",
1548
- "node -v",
1549
- "npm -v"
1552
+ "echo LANG=en_US.utf-8 >> /etc/environment",
1553
+ "echo LC_ALL=en_US.UTF-8 >> /etc/environment",
1554
+ "echo 'PATH=$PATH:/home/participant/.local/bin' >> /home/participant/.bashrc",
1555
+ "echo 'export PATH' >> /home/participant/.bashrc",
1556
+ {
1557
+ "Fn::Join": [
1558
+ "",
1559
+ [
1560
+ "echo 'export AWS_REGION=",
1561
+ {
1562
+ "Ref": "AWS::Region"
1563
+ },
1564
+ "' >> /home/participant/.bashrc"
1565
+ ]
1566
+ ]
1567
+ },
1568
+ {
1569
+ "Fn::Join": [
1570
+ "",
1571
+ [
1572
+ "echo 'export AWS_ACCOUNTID=",
1573
+ {
1574
+ "Ref": "AWS::AccountId"
1575
+ },
1576
+ "' >> /home/participant/.bashrc"
1577
+ ]
1578
+ ]
1579
+ },
1580
+ "echo 'export NEXT_TELEMETRY_DISABLED=1' >> /home/participant/.bashrc",
1581
+ "echo \"export PS1='\\[\\033[01;32m\\]\\u:\\[\\033[01;34m\\]\\w\\[\\033[00m\\]\\$ '\" >> /home/participant/.bashrc",
1582
+ "chown -R participant:participant /home/participant"
1550
1583
  ]
1551
1584
  }
1552
1585
  },
1553
1586
  {
1554
1587
  "action": "aws:runShellScript",
1555
- "name": "InstallDockerDnf",
1588
+ "name": "InstallAWSCLI",
1556
1589
  "inputs": {
1557
1590
  "runCommand": [
1558
1591
  "#!/bin/bash",
1559
- "dnf install -y docker",
1560
- "usermod -aG docker participant",
1561
- "systemctl restart code-server@participant.service",
1562
- "systemctl start docker.service",
1563
- "echo \"Docker installed. Checking configuration\"",
1564
- "docker --version",
1565
- "systemctl status docker.service"
1592
+ "mkdir -p /tmp",
1593
+ "curl -fsSL https://awscli.amazonaws.com/awscli-exe-linux-$(uname -m).zip -o /tmp/aws-cli.zip",
1594
+ "chown -R participant:participant /tmp/aws-cli.zip",
1595
+ "unzip -q -d /tmp /tmp/aws-cli.zip",
1596
+ "sudo /tmp/aws/install",
1597
+ "rm -rf /tmp/aws",
1598
+ "echo \"AWS CLI installed. Checking configuration\"",
1599
+ "aws --version"
1566
1600
  ]
1567
1601
  }
1568
1602
  },
@@ -1574,7 +1608,7 @@
1574
1608
  "#!/bin/bash",
1575
1609
  "dnf install -y git",
1576
1610
  "sudo -u participant git config --global user.email \"participant@example.com\"",
1577
- "sudo -u participant git config --global user.name \"Workshop participant\"",
1611
+ "sudo -u participant git config --global user.name \"Workshop Participant\"",
1578
1612
  "sudo -u participant git config --global init.defaultBranch \"main\"",
1579
1613
  "echo \"Git installed. Checking configuration\"",
1580
1614
  "git --version"
@@ -1583,35 +1617,41 @@
1583
1617
  },
1584
1618
  {
1585
1619
  "action": "aws:runShellScript",
1586
- "name": "InstallPythonDnf",
1620
+ "name": "CloneRepo",
1587
1621
  "inputs": {
1588
1622
  "runCommand": [
1589
1623
  "#!/bin/bash",
1590
- "dnf install -y python3.11 python3.11-pip python3-virtualenv python3-pytest python3-boto3",
1591
- "echo 'alias pytest=pytest-3' >> /home/participant/.bashrc",
1592
- "echo 'alias python3=python3.11' >> /home/participant/.bashrc",
1593
- "echo 'alias pip3=pip3.11' >> /home/participant/.bashrc",
1594
- "echo 'alias=python3=python3.11' >> ~/.bashrc",
1595
- "echo 'alias pip3=pip3.11' >> ~/.bashrc",
1596
- "python3.11 -m pip install --upgrade pip 2>&1",
1597
- "echo \"Python and Pip installed. Checking configuration\"",
1598
- "python3.11 --version",
1599
- "python3.11 -m pip --version 2>&1"
1624
+ "if [[ -z \"{{ RepoUrl }}\" ]]\nthen\n echo \"No Repo\"\nelse\n mkdir -p /Workshop && chown -R participant:participant /Workshop\n sudo -u participant git clone {{ RepoUrl }} /Workshop\n echo \"Repo {{ RepoUrl }} cloned. Checking configuration\"\n ls -la /Workshop\n sudo -u participant git -C /Workshop remote -v\nfi"
1600
1625
  ]
1601
1626
  }
1602
1627
  },
1603
1628
  {
1604
1629
  "action": "aws:runShellScript",
1605
- "name": "InstallAWSCLI",
1630
+ "name": "DownloadAssets",
1606
1631
  "inputs": {
1607
1632
  "runCommand": [
1608
1633
  "#!/bin/bash",
1609
- "curl -fsSL https://awscli.amazonaws.com/awscli-exe-linux-$(uname -m).zip -o /tmp/aws-cli.zip",
1610
- "unzip -q -d /tmp /tmp/aws-cli.zip",
1611
- "sudo /tmp/aws/install",
1612
- "rm -rf /tmp/aws",
1613
- "echo \"AWS CLI installed. Checking configuration\"",
1614
- "aws --version"
1634
+ "if [[ -z \"{{ AssetZipS3Path }}\" ]]\nthen\n echo \"No assets\"\nelse\n mkdir -p /Workshop && chown -R participant:participant /Workshop\n mkdir -p /tmp\n aws s3 cp s3://{{ AssetZipS3Path }} /tmp/asset.zip\n chown -R participant:participant /tmp/asset.zip\n unzip -o /tmp/asset.zip -d /Workshop\n chown -R participant:participant /Workshop\n if [[ -d /Workshop/.git ]]\n then\n sudo -u participant git -C /Workshop add .\n sudo -u participant git -C /Workshop commit -m 'chore: workshop commit'\n else\n sudo -u participant git -C /Workshop init\n sudo -u participant git -C /Workshop add .\n sudo -u participant git -C /Workshop commit -m 'chore: initial commit'\n fi\n echo \"Assets downloaded. Checking configuration: /Workshop\"\n ls -la /Workshop\n sudo -u participant git -C /Workshop branch\nfi"
1635
+ ]
1636
+ }
1637
+ },
1638
+ {
1639
+ "action": "aws:runShellScript",
1640
+ "name": "DownloadFolders",
1641
+ "inputs": {
1642
+ "runCommand": [
1643
+ "#!/bin/bash",
1644
+ "if [[ -z \"{{ FolderZipS3Path }}\" ]]\nthen\n echo \"No folders\"\nelse\n rm -rf /tmp/folder\n mkdir -p /tmp/folder && chown -R participant:participant /tmp/folder\n aws s3 cp s3://{{ FolderZipS3Path }} /tmp/asset-folder.zip\n chown -R participant:participant /tmp/asset-folder.zip\n unzip -o /tmp/asset-folder.zip -d /tmp/folder\n chown -R participant:participant /tmp/folder\n mkdir -p /Workshop && chown -R participant:participant /Workshop\n cd \"/Workshop\" && cd ..\n if [[ $(pwd) == \"/\" ]]\n then\n targetRootFolder=\"\"\n else\n targetRootFolder=$(pwd)\n chown -R participant:participant .\n fi\n find \"/tmp/folder\" -maxdepth 1 -mindepth 1 -type d | while read sourceFolder; do\n folder=\"$(basename $sourceFolder)\"\n echo \"Processing folder: $folder\"\n targetFolder=$targetRootFolder/$folder\n if [[ $targetRootFolder == \"\" ]]\n then\n mv $sourceFolder /\n else\n mv $sourceFolder $targetRootFolder\n fi\n chown -R participant:participant $targetFolder\n sudo -u participant git -C $targetFolder init\n sudo -u participant git -C $targetFolder add .\n sudo -u participant git -C $targetFolder commit -m \"chore: initial commit\"\n echo \"Folder downloaded. Checking configuration: $targetFolder\"\n ls -la $targetFolder\n done\n rm -rf /tmp/folder\nfi"
1645
+ ]
1646
+ }
1647
+ },
1648
+ {
1649
+ "action": "aws:runShellScript",
1650
+ "name": "DownloadBranches",
1651
+ "inputs": {
1652
+ "runCommand": [
1653
+ "#!/bin/bash",
1654
+ "if [[ -z \"{{ BranchZipS3Path }}\" ]]\nthen\n echo \"No branches\"\nelse\n rm -rf /tmp/branch\n rm -rf /tmp/git\n mkdir -p /tmp/branch && chown -R participant:participant /tmp/branch\n mkdir -p /tmp/git && chown -R participant:participant /tmp/git\n aws s3 cp s3://{{ BranchZipS3Path }} /tmp/asset-branch.zip\n chown -R participant:participant /tmp/asset-branch.zip\n unzip -o /tmp/asset-branch.zip -d /tmp/branch\n chown -R participant:participant /tmp/branch\n mkdir -p /Workshop && chown -R participant:participant /Workshop\n sudo -u participant git -C /Workshop init\n mv /Workshop/.git /tmp/git\n rm -rf /Workshop\n mkdir -p /Workshop && chown -R participant:participant /Workshop\n mv /tmp/git/.git /Workshop\n find /tmp/branch -maxdepth 1 -mindepth 1 -type d | while read sourceFolder; do\n branch=\"$(basename $sourceFolder)\"\n echo \"Processing branch: $branch\"\n sudo -u participant git -C /Workshop checkout -b $branch 2>&1\n cp -a $sourceFolder/. /Workshop\n sudo -u participant git -C /Workshop add .\n sudo -u participant git -C /Workshop commit -m \"chore: initial commit $branch\"\n mv /Workshop/.git /tmp/git\n rm -rf /Workshop\n mkdir /Workshop && chown -R participant:participant /Workshop\n mv /tmp/git/.git /Workshop\n done\n sudo -u participant git -C /Workshop checkout main 2>&1\n sudo -u participant git -C /Workshop restore .\n rm -rf /tmp/branch\n rm -rf /tmp/git\n echo \"Branches downloaded. Checking configuration: /Workshop\"\n sudo -u participant git -C /Workshop branch\n ls -la /Workshop\nfi"
1615
1655
  ]
1616
1656
  }
1617
1657
  },
@@ -1622,23 +1662,22 @@
1622
1662
  "runCommand": [
1623
1663
  "#!/bin/bash",
1624
1664
  "export HOME=/home/participant",
1625
- "curl -fsSL https://code-server.dev/install.sh | bash -s -- 2>&1",
1665
+ "curl -fsSL https://code-server.dev/install.sh | sh -s -- --version 4.100.3",
1626
1666
  "systemctl enable --now code-server@participant 2>&1",
1627
- "tee /etc/nginx/conf.d/code-server.conf <<EOF\nserver {\n listen 80;\n listen [::]:80;\n # server_name distribution.distributionDomainName;\n server_name *.cloudfront.net;\n location / {\n proxy_pass http://localhost:8080/;\n proxy_set_header Host \\$host;\n proxy_set_header Upgrade \\$http_upgrade;\n proxy_set_header Connection upgrade;\n proxy_set_header Accept-Encoding gzip;\n }\n location /app {\n proxy_pass http://localhost:8081/app;\n proxy_set_header Host \\$host;\n proxy_set_header Upgrade \\$http_upgrade;\n proxy_set_header Connection upgrade;\n proxy_set_header Accept-Encoding gzip;\n }\n}\nEOF",
1667
+ "tee /etc/nginx/conf.d/code-server.conf <<EOF\nserver {\n listen 80;\n listen [::]:80;\n # server_name \\$\\{CloudFrontDistribution.DomainName\\};\n server_name *.cloudfront.net;\n location / {\n proxy_pass http://localhost:8080/;\n proxy_set_header Host \\$host;\n proxy_set_header Upgrade \\$http_upgrade;\n proxy_set_header Connection upgrade;\n proxy_set_header Accept-Encoding gzip;\n }\n location /app {\n proxy_pass http://localhost:8081/app;\n proxy_set_header Host \\$host;\n proxy_set_header Upgrade \\$http_upgrade;\n proxy_set_header Connection upgrade;\n proxy_set_header Accept-Encoding gzip;\n }\n}\nEOF",
1628
1668
  "mkdir -p /home/participant/.config/code-server",
1629
1669
  "tee /home/participant/.config/code-server/config.yaml <<EOF\ncert: false\nauth: password\nhashed-password: \"$(echo -n {{ VSCodePassword }} | argon2 $(openssl rand -base64 12) -e)\"\nEOF",
1630
1670
  "mkdir -p /home/participant/.local/share/code-server/User/",
1631
1671
  "touch /home/participant/.hushlogin",
1632
1672
  "mkdir -p /Workshop && chown -R participant:participant /Workshop",
1633
- "tee /home/participant/.local/share/code-server/User/settings.json <<EOF\n{\n \"extensions.autoUpdate\": false,\n \"extensions.autoCheckUpdates\": false,\n \"telemetry.telemetryLevel\": \"off\",\n \"security.workspace.trust.startupPrompt\": \"never\",\n \"security.workspace.trust.enabled\": false,\n \"security.workspace.trust.banner\": \"never\",\n \"security.workspace.trust.emptyWindow\": false,\n \"python.testing.pytestEnabled\": true,\n \"auto-run-command.rules\": [\n {\n \"command\": \"workbench.action.terminal.new\"\n }\n ]\n}\nEOF",
1673
+ "tee /home/participant/.local/share/code-server/User/settings.json <<EOF\n{\n \"extensions.autoUpdate\": false,\n \"extensions.autoCheckUpdates\": false,\n \"telemetry.telemetryLevel\": \"off\",\n \"security.workspace.trust.startupPrompt\": \"never\",\n \"security.workspace.trust.enabled\": false,\n \"security.workspace.trust.banner\": \"never\",\n \"security.workspace.trust.emptyWindow\": false,\n \"auto-run-command.rules\": [\n {\n \"command\": \"workbench.action.terminal.new\"\n }\n ]\n}\nEOF",
1634
1674
  "chown -R participant:participant /home/participant",
1635
1675
  "systemctl restart code-server@participant",
1636
1676
  "systemctl restart nginx",
1637
1677
  "sudo -u participant --login code-server --install-extension AmazonWebServices.aws-toolkit-vscode --force",
1638
1678
  "sudo -u participant --login code-server --install-extension AmazonWebServices.amazon-q-vscode --force",
1639
- "sudo -u participant --login code-server --install-extension synedra.auto-run-command --force",
1640
- "sudo -u participant --login code-server --install-extension vscjava.vscode-java-pack --force",
1641
1679
  "sudo -u participant --login code-server --install-extension ms-vscode.live-server --force",
1680
+ "sudo -u participant --login code-server --install-extension synedra.auto-run-command --force",
1642
1681
  "chown -R participant:participant /home/participant",
1643
1682
  "echo \"Nginx installed. Checking configuration\"",
1644
1683
  "nginx -t 2>&1",
@@ -1651,41 +1690,15 @@
1651
1690
  },
1652
1691
  {
1653
1692
  "action": "aws:runShellScript",
1654
- "name": "UpdateProfile",
1693
+ "name": "InstallNodeDnf",
1655
1694
  "inputs": {
1656
1695
  "runCommand": [
1657
1696
  "#!/bin/bash",
1658
- "echo LANG=en_US.utf-8 >> /etc/environment",
1659
- "echo LC_ALL=en_US.UTF-8 >> /etc/environment",
1660
- "echo 'PATH=$PATH:/home/participant/.local/bin' >> /home/participant/.bashrc",
1661
- "echo 'export PATH' >> /home/participant/.bashrc",
1662
- {
1663
- "Fn::Join": [
1664
- "",
1665
- [
1666
- "echo 'export AWS_REGION=",
1667
- {
1668
- "Ref": "AWS::Region"
1669
- },
1670
- "' >> /home/participant/.bashrc"
1671
- ]
1672
- ]
1673
- },
1674
- {
1675
- "Fn::Join": [
1676
- "",
1677
- [
1678
- "echo 'export AWS_ACCOUNTID=",
1679
- {
1680
- "Ref": "AWS::AccountId"
1681
- },
1682
- "' >> /home/participant/.bashrc"
1683
- ]
1684
- ]
1685
- },
1686
- "echo 'export NEXT_TELEMETRY_DISABLED=1' >> /home/participant/.bashrc",
1687
- "echo \"export PS1='\\[\\033[01;32m\\]\\u:\\[\\033[01;34m\\]\\w\\[\\033[00m\\]\\$ '\" >> /home/participant/.bashrc",
1688
- "chown -R participant:participant /home/participant"
1697
+ "dnf install -y nodejs npm",
1698
+ "npm install -g npm@latest",
1699
+ "echo \"Node and npm installed. Checking configuration\"",
1700
+ "node -v",
1701
+ "npm -v"
1689
1702
  ]
1690
1703
  }
1691
1704
  },
@@ -1700,6 +1713,125 @@
1700
1713
  "cdk --version"
1701
1714
  ]
1702
1715
  }
1716
+ },
1717
+ {
1718
+ "action": "aws:runShellScript",
1719
+ "name": "InstallQCLI",
1720
+ "inputs": {
1721
+ "runCommand": [
1722
+ "#!/bin/bash",
1723
+ "curl --proto '=https' --tlsv1.2 -sSf \"https://desktop-release.q.us-east-1.amazonaws.com/latest/q-$(uname -m)-linux.zip\" -o /tmp/q.zip",
1724
+ "chown -R participant:participant /tmp/q.zip",
1725
+ "unzip -q -d /tmp /tmp/q.zip",
1726
+ "chown -R participant:participant /tmp/q",
1727
+ "chmod +x /tmp/q/install.sh",
1728
+ "sudo -u participant /tmp/q/install.sh --no-confirm",
1729
+ "rm -rf /tmp/q",
1730
+ "echo \"Amazon Q CLI installed\""
1731
+ ]
1732
+ }
1733
+ },
1734
+ {
1735
+ "action": "aws:runShellScript",
1736
+ "name": "Installuv",
1737
+ "inputs": {
1738
+ "runCommand": [
1739
+ "#!/bin/bash",
1740
+ "sudo -u participant --login curl -fsSL https://astral.sh/uv/install.sh -o /tmp/uv_install.sh",
1741
+ "sudo -u participant --login bash /tmp/uv_install.sh",
1742
+ "if uv generate-shell-completion bash &>/dev/null; then\n echo 'eval \"$(uv generate-shell-completion bash)\"' >> /home/participant/.bashrc\nfi",
1743
+ "if uvx generate-shell-completion bash &>/dev/null; then\n echo 'eval \"$(uvx generate-shell-completion bash)\"' >> /home/participant/.bashrc\nfi",
1744
+ "echo \"uv installed. Checking configuration\"",
1745
+ "sudo -u participant --login uv --version"
1746
+ ]
1747
+ }
1748
+ },
1749
+ {
1750
+ "action": "aws:runShellScript",
1751
+ "name": "InstallPythonDnf",
1752
+ "inputs": {
1753
+ "runCommand": [
1754
+ "#!/bin/bash",
1755
+ "dnf install -y python3.11 python3.11-pip python3-virtualenv python3-pytest python3-boto3",
1756
+ "echo 'alias pytest=pytest-3' >> /home/participant/.bashrc",
1757
+ "echo 'alias python3=python3.11' >> /home/participant/.bashrc",
1758
+ "echo 'alias pip3=pip3.11' >> /home/participant/.bashrc",
1759
+ "echo 'alias=python3=python3.11' >> ~/.bashrc",
1760
+ "echo 'alias pip3=pip3.11' >> ~/.bashrc",
1761
+ "python3.11 -m pip install --upgrade pip 2>&1",
1762
+ "sudo -u participant --login code-server --install-extension ms-python.python --force",
1763
+ "if [ -f /home/participant/.local/share/code-server/User/settings.json ]; then\n sed -i \"2i\\\\ \\\"python.testing.pytestEnabled\\\": true,\" /home/participant/.local/share/code-server/User/settings.json\nelse\n echo '{\n \"python.testing.pytestEnabled\": true\n }' > /home/participant/.local/share/code-server/User/settings.json\nfi",
1764
+ "echo \"Python and Pip installed. Checking configuration\"",
1765
+ "python3.11 --version",
1766
+ "python3.11 -m pip --version 2>&1"
1767
+ ]
1768
+ }
1769
+ },
1770
+ {
1771
+ "action": "aws:runShellScript",
1772
+ "name": "InstallJavaDnf",
1773
+ "inputs": {
1774
+ "runCommand": [
1775
+ "#!/bin/bash",
1776
+ "dnf install -y java-21-amazon-corretto java-17-amazon-corretto java-1.8.0-amazon-corretto maven",
1777
+ "echo 'export JAVA_8_HOME=/usr/lib/jvm/java-1.8.0-amazon-corretto' >> /home/participant/.bashrc",
1778
+ "echo 'export JAVA_8_PATH=/usr/lib/jvm/java-1.8.0-amazon-corretto' >> /home/participant/.bashrc",
1779
+ "echo 'export JAVA_17_PATH=/usr/lib/jvm/java-17-amazon-corretto' >> /home/participant/.bashrc",
1780
+ "echo 'export JAVA_17_HOME=/usr/lib/jvm/java-17-amazon-corretto' >> /home/participant/.bashrc",
1781
+ "echo 'export JAVA_21_PATH=/usr/lib/jvm/java-21-amazon-corretto' >> /home/participant/.bashrc",
1782
+ "echo 'export JAVA_21_HOME=/usr/lib/jvm/java-21-amazon-corretto' >> /home/participant/.bashrc",
1783
+ "echo 'export JAVA_HOME=/usr/lib/jvm/java-21-amazon-corretto' >> /home/participant/.bashrc",
1784
+ "echo 'export PATH=$PATH:$JAVA_HOME/bin:/usr/share/maven/bin' >> /home/participant/.bashrc",
1785
+ "sudo -u participant --login code-server --install-extension vscjava.vscode-java-pack --force",
1786
+ "echo \"Java and Maven installed. Checking configuration\"",
1787
+ "java -version 2>&1",
1788
+ "mvn --version"
1789
+ ]
1790
+ }
1791
+ },
1792
+ {
1793
+ "action": "aws:runShellScript",
1794
+ "name": "InstallDotnetDnf",
1795
+ "inputs": {
1796
+ "runCommand": [
1797
+ "#!/bin/bash",
1798
+ "dnf install -y dotnet-sdk-8.0",
1799
+ "dotnet tool install -g Microsoft.Web.LibraryManager.Cli",
1800
+ "echo 'PATH=$PATH:/home/participant/.dotnet/tools' >> /home/participant/.bashrc",
1801
+ "chown -R participant:participant /home/participant",
1802
+ "echo \"Dotnet installed. Checking configuration\"",
1803
+ "dotnet --list-sdks"
1804
+ ]
1805
+ }
1806
+ },
1807
+ {
1808
+ "action": "aws:runShellScript",
1809
+ "name": "InstallDockerDnf",
1810
+ "inputs": {
1811
+ "runCommand": [
1812
+ "#!/bin/bash",
1813
+ "dnf install -y docker",
1814
+ "usermod -aG docker participant",
1815
+ "systemctl restart code-server@participant.service",
1816
+ "systemctl start docker.service",
1817
+ "echo \"Docker installed. Checking configuration\"",
1818
+ "docker --version",
1819
+ "systemctl status docker.service"
1820
+ ]
1821
+ }
1822
+ },
1823
+ {
1824
+ "action": "aws:runShellScript",
1825
+ "name": "InstallGolangDnf",
1826
+ "inputs": {
1827
+ "runCommand": [
1828
+ "#!/bin/bash",
1829
+ "dnf install -y golang",
1830
+ "echo 'PATH=$PATH:/home/participant/go/bin' >> /home/participant/.bashrc",
1831
+ "echo \"Golang installed. Checking configuration\"",
1832
+ "go version"
1833
+ ]
1834
+ }
1703
1835
  }
1704
1836
  ]
1705
1837
  },
@@ -1761,6 +1893,13 @@
1761
1893
  {
1762
1894
  "reason": "For this lambda the latest runtime is not needed",
1763
1895
  "id": "AwsSolutions-L1"
1896
+ },
1897
+ {
1898
+ "reason": "ssm:GetCommandInvocation and ssm:ListCommandInvocations do not support resource-level permissions and require wildcard resources",
1899
+ "id": "AwsSolutions-IAM5",
1900
+ "applies_to": [
1901
+ "Resource::*"
1902
+ ]
1764
1903
  }
1765
1904
  ]
1766
1905
  }
@@ -1772,11 +1911,7 @@
1772
1911
  "PolicyDocument": {
1773
1912
  "Statement": [
1774
1913
  {
1775
- "Action": [
1776
- "ssm:GetCommandInvocation",
1777
- "ssm:ListCommandInvocations",
1778
- "ssm:SendCommand"
1779
- ],
1914
+ "Action": "ssm:SendCommand",
1780
1915
  "Effect": "Allow",
1781
1916
  "Resource": [
1782
1917
  {
@@ -1843,6 +1978,14 @@
1843
1978
  ]
1844
1979
  }
1845
1980
  ]
1981
+ },
1982
+ {
1983
+ "Action": [
1984
+ "ssm:GetCommandInvocation",
1985
+ "ssm:ListCommandInvocations"
1986
+ ],
1987
+ "Effect": "Allow",
1988
+ "Resource": "*"
1846
1989
  }
1847
1990
  ],
1848
1991
  "Version": "2012-10-17"
@@ -1853,6 +1996,19 @@
1853
1996
  "Ref": "IntegVSCodeServerInstallerOnEventHandlerServiceRole59651FEF"
1854
1997
  }
1855
1998
  ]
1999
+ },
2000
+ "Metadata": {
2001
+ "cdk_nag": {
2002
+ "rules_to_suppress": [
2003
+ {
2004
+ "reason": "ssm:GetCommandInvocation and ssm:ListCommandInvocations do not support resource-level permissions and require wildcard resources",
2005
+ "id": "AwsSolutions-IAM5",
2006
+ "applies_to": [
2007
+ "Resource::*"
2008
+ ]
2009
+ }
2010
+ ]
2011
+ }
1856
2012
  }
1857
2013
  },
1858
2014
  "IntegVSCodeServerInstallerOnEventHandler6FF91542": {
@@ -1862,7 +2018,7 @@
1862
2018
  "S3Bucket": {
1863
2019
  "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}"
1864
2020
  },
1865
- "S3Key": "33da23274e25bd9f43638c5d83dad26e3931cbe78d462ffd9a9f565e948b4f5f.zip"
2021
+ "S3Key": "2f99f38311da357eaaea1284d67c759759324dec4a1cd11621d9c59eea9e81df.zip"
1866
2022
  },
1867
2023
  "Description": "src/installer/installer.lambda.ts",
1868
2024
  "Handler": "index.handler",
@@ -1873,8 +2029,8 @@
1873
2029
  "Arn"
1874
2030
  ]
1875
2031
  },
1876
- "Runtime": "nodejs20.x",
1877
- "Timeout": 300
2032
+ "Runtime": "nodejs22.x",
2033
+ "Timeout": 900
1878
2034
  },
1879
2035
  "DependsOn": [
1880
2036
  "IntegVSCodeServerInstallerOnEventHandlerServiceRoleDefaultPolicy1CAD86C2",
@@ -1890,6 +2046,13 @@
1890
2046
  {
1891
2047
  "reason": "For this lambda the latest runtime is not needed",
1892
2048
  "id": "AwsSolutions-L1"
2049
+ },
2050
+ {
2051
+ "reason": "ssm:GetCommandInvocation and ssm:ListCommandInvocations do not support resource-level permissions and require wildcard resources",
2052
+ "id": "AwsSolutions-IAM5",
2053
+ "applies_to": [
2054
+ "Resource::*"
2055
+ ]
1893
2056
  }
1894
2057
  ]
1895
2058
  }
@@ -2084,7 +2247,7 @@
2084
2247
  "Arn"
2085
2248
  ]
2086
2249
  },
2087
- "ServiceTimeout": 305,
2250
+ "ServiceTimeout": 905,
2088
2251
  "InstanceId": {
2089
2252
  "Ref": "IntegVSCodeServerserverinstance0A3D62D7"
2090
2253
  },
@@ -2276,7 +2439,7 @@
2276
2439
  "S3Bucket": {
2277
2440
  "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}"
2278
2441
  },
2279
- "S3Key": "0ad50fc42afd768c3d0bfdd4701e43284fb077a25f19eea1e8c51a5ca36ebfe4.zip"
2442
+ "S3Key": "efac30c7091c58fed492058fa6403c14f7e58aab8cf4fd595d838b8d5eeec2b9.zip"
2280
2443
  },
2281
2444
  "Handler": "index.handler",
2282
2445
  "Role": {