From 5eed8b66f5f24173491175866ea622c25ba29a0d Mon Sep 17 00:00:00 2001
From: timothycarambat <rambat1010@gmail.com>
Date: Thu, 20 Jul 2023 16:40:48 -0700
Subject: [PATCH] update AWS launch to use public AMI

---
 .../aws/cloudformation/DEPLOY.md              |   8 +-
 ...aws_build_from_source_no_credentials.json} |   0
 .../create_anything_llm_instance.json         | 201 ++++++++++++++++++
 3 files changed, 205 insertions(+), 4 deletions(-)
 rename cloud-deployments/aws/cloudformation/{aws_no_creds.json => aws_build_from_source_no_credentials.json} (100%)
 create mode 100644 cloud-deployments/aws/cloudformation/create_anything_llm_instance.json

diff --git a/cloud-deployments/aws/cloudformation/DEPLOY.md b/cloud-deployments/aws/cloudformation/DEPLOY.md
index 3b3e27772..afcb19b85 100644
--- a/cloud-deployments/aws/cloudformation/DEPLOY.md
+++ b/cloud-deployments/aws/cloudformation/DEPLOY.md
@@ -2,16 +2,16 @@
 
 With an AWS account you can easily deploy a private AnythingLLM instance on AWS. This will create a url that you can access from any browser over HTTP (HTTPS not supported). This single instance will run on your own keys and they will not be exposed - however if you want your instance to be protected it is highly recommend that you set the `AUTH_TOKEN` and `JWT_SECRET` variables in the `docker/` ENV.
 
-**Quick Launch**
+**Quick Launch (EASY)**
 2. Log in to your AWS account
 3. Open [CloudFormation](https://us-west-1.console.aws.amazon.com/cloudformation/home)
 4. Ensure you are deploying in a geographic zone that is nearest to your physical location to reduce latency.
 5. Click `Create Stack`
-6. Use the file `aws_no_creds.json` as your JSON template.
-7. Launch. On first boot fill out your ENV keys and you are fully live.
+6. Use the file `create_anythinng_llm_instance.json` as your JSON template.
+7. Launch. On first boot fill out your ENV keys and you are fully live. Time to boot is approximately 60 seconds.
 Done.
 
-**Custom Launch**
+**Custom Launch and Build From Source**
 [Refer to .env.example](../../../docker/HOW_TO_USE_DOCKER.md) for data format.
 
 The output of this cloudformation stack will be:
diff --git a/cloud-deployments/aws/cloudformation/aws_no_creds.json b/cloud-deployments/aws/cloudformation/aws_build_from_source_no_credentials.json
similarity index 100%
rename from cloud-deployments/aws/cloudformation/aws_no_creds.json
rename to cloud-deployments/aws/cloudformation/aws_build_from_source_no_credentials.json
diff --git a/cloud-deployments/aws/cloudformation/create_anything_llm_instance.json b/cloud-deployments/aws/cloudformation/create_anything_llm_instance.json
new file mode 100644
index 000000000..a67608c30
--- /dev/null
+++ b/cloud-deployments/aws/cloudformation/create_anything_llm_instance.json
@@ -0,0 +1,201 @@
+{
+  "AWSTemplateFormatVersion": "2010-09-09",
+  "Description": "Create a stack that runs AnythingLLM on a single instance from the Mintplex Labs Inc maintained AWS AMI image..",
+  "Parameters": {
+    "InstanceType": {
+      "Description": "EC2 instance type",
+      "Type": "String",
+      "Default": "t2.small"
+    },
+    "AMIImageTemplate": {
+      "Description": "AMI Image ID to clone to a new instance. Currently the AMI is for anythingllm@0.0.1-beta",
+      "Type": "String",
+      "Default": "ami-0158d2dc27fba7922"
+    }
+  },
+  "Resources": {
+    "AnythingLLMInstance": {
+      "Type": "AWS::EC2::Instance",
+      "Properties": {
+        "ImageId": {
+          "Ref": "AMIImageTemplate"
+        },
+        "InstanceType": {
+          "Ref": "InstanceType"
+        },
+        "SecurityGroupIds": [
+          {
+            "Ref": "AnythingLLMInstanceSecurityGroup"
+          }
+        ],
+        "UserData": {
+          "Fn::Base64": {
+            "Fn::Join": [
+              "",
+              [
+                "Content-Type: multipart/mixed; boundary=\"//\"\n",
+                "MIME-Version: 1.0\n",
+                "\n",
+                "--//\n",
+                "Content-Type: text/cloud-config; charset=\"us-ascii\"\n",
+                "MIME-Version: 1.0\n",
+                "Content-Transfer-Encoding: 7bit\n",
+                "Content-Disposition: attachment; filename=\"cloud-config.txt\"\n",
+                "\n",
+                "\n",
+                "#cloud-config\n",
+                "cloud_final_modules:\n",
+                "- [scripts-user, always]\n",
+                "\n",
+                "\n",
+                "--//\n",
+                "Content-Type: text/x-shellscript; charset=\"us-ascii\"\n",
+                "MIME-Version: 1.0\n",
+                "Content-Transfer-Encoding: 7bit\n",
+                "Content-Disposition: attachment; filename=\"userdata.txt\"\n",
+                "\n",
+                "\n",
+                "#!/bin/bash\n",
+                "# check output of userdata script with sudo tail -f /var/log/cloud-init-output.log\n",
+                "sudo docker-compose -f /home/ec2-user/anything-llm/docker/docker-compose.yml up -d\n",
+                "export ONLINE=$(curl -Is http://localhost:3001/api/ping | head -n 1|cut -d$' ' -f2)\n",
+                "echo \"Health check: $ONLINE\"\n",
+                "if [ \"$ONLINE\" = 200 ] ; then echo \"Running migrations...\" && curl -Is http://localhost:3001/api/migrate | head -n 1|cut -d$' ' -f2; fi\n",
+                "echo \"Setup complete! AnythingLLM instance is now online!\"\n",
+                "\n",
+                "--//--\n"
+              ]
+            ]
+          }
+        }
+      }
+    },
+    "AnythingLLMInstanceSecurityGroup": {
+      "Type": "AWS::EC2::SecurityGroup",
+      "Properties": {
+        "GroupDescription": "AnythingLLm Instance Security Group",
+        "SecurityGroupIngress": [
+          {
+            "IpProtocol": "tcp",
+            "FromPort": "22",
+            "ToPort": "22",
+            "CidrIp": "0.0.0.0/0"
+          },
+          {
+            "IpProtocol": "tcp",
+            "FromPort": "3001",
+            "ToPort": "3001",
+            "CidrIp": "0.0.0.0/0"
+          },
+          {
+            "IpProtocol": "tcp",
+            "FromPort": "3001",
+            "ToPort": "3001",
+            "CidrIpv6": "::/0"
+          }
+        ]
+      }
+    }
+  },
+  "Outputs": {
+    "ServerIp": {
+      "Description": "IP address of the AnythingLLM instance",
+      "Value": {
+        "Fn::GetAtt": [
+          "AnythingLLMInstance",
+          "PublicIp"
+        ]
+      }
+    },
+    "ServerURL": {
+      "Description": "URL of the AnythingLLM server",
+      "Value": {
+        "Fn::Join": [
+          "",
+          [
+            "http://",
+            {
+              "Fn::GetAtt": [
+                "AnythingLLMInstance",
+                "PublicIp"
+              ]
+            },
+            ":3001"
+          ]
+        ]
+      }
+    }
+  },
+  "Mappings": {
+    "Region2AMI": {
+      "ap-south-1": {
+        "AMI": "ami-0e6329e222e662a52",
+        "RootDeviceName": "/dev/xvda"
+      },
+      "eu-north-1": {
+        "AMI": "ami-08c308b1bb265e927",
+        "RootDeviceName": "/dev/xvda"
+      },
+      "eu-west-3": {
+        "AMI": "ami-069d1ea6bc64443f0",
+        "RootDeviceName": "/dev/xvda"
+      },
+      "eu-west-2": {
+        "AMI": "ami-06a566ca43e14780d",
+        "RootDeviceName": "/dev/xvda"
+      },
+      "eu-west-1": {
+        "AMI": "ami-0a8dc52684ee2fee2",
+        "RootDeviceName": "/dev/xvda"
+      },
+      "ap-northeast-3": {
+        "AMI": "ami-0c8a89b455fae8513",
+        "RootDeviceName": "/dev/xvda"
+      },
+      "ap-northeast-2": {
+        "AMI": "ami-0ff56409a6e8ea2a0",
+        "RootDeviceName": "/dev/xvda"
+      },
+      "ap-northeast-1": {
+        "AMI": "ami-0ab0bbbd329f565e6",
+        "RootDeviceName": "/dev/xvda"
+      },
+      "ca-central-1": {
+        "AMI": "ami-033c256a10931f206",
+        "RootDeviceName": "/dev/xvda"
+      },
+      "sa-east-1": {
+        "AMI": "ami-0dabf4dab6b183eef",
+        "RootDeviceName": "/dev/xvda"
+      },
+      "ap-southeast-1": {
+        "AMI": "ami-0dc5785603ad4ff54",
+        "RootDeviceName": "/dev/xvda"
+      },
+      "ap-southeast-2": {
+        "AMI": "ami-0c5d61202c3b9c33e",
+        "RootDeviceName": "/dev/xvda"
+      },
+      "eu-central-1": {
+        "AMI": "ami-004359656ecac6a95",
+        "RootDeviceName": "/dev/xvda"
+      },
+      "us-east-1": {
+        "AMI": "ami-0cff7528ff583bf9a",
+        "RootDeviceName": "/dev/xvda"
+      },
+      "us-east-2": {
+        "AMI": "ami-02238ac43d6385ab3",
+        "RootDeviceName": "/dev/xvda"
+      },
+      "us-west-1": {
+        "AMI": "ami-01163e76c844a2129",
+        "RootDeviceName": "/dev/xvda"
+      },
+      "us-west-2": {
+        "AMI": "ami-0ceecbb0f30a902a6",
+        "RootDeviceName": "/dev/xvda"
+      }
+    }
+  }
+}
\ No newline at end of file