Deployments: move Enterprise AMI to openvidu repo

pull/797/head
pabloFuente 2023-03-27 11:42:06 +02:00
parent 09d89b2cdb
commit 6e826fcbc3
18 changed files with 3796 additions and 3 deletions

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,292 @@
---
AWSTemplateFormatVersion: 2010-09-09
Description: Openvidu Server Pro CloudFormation AMI template.
Mappings:
AMIMAP:
eu-west-1:
AMI: AMIEUWEST1
us-east-1:
AMI: AMIUSEAST1
Resources:
OpenviduServerPro:
Type: 'AWS::EC2::Instance'
Metadata:
Comment: "Install OpenVidu Server Pro AWS ASG"
AWS::CloudFormation::Init:
config:
files:
"/etc/cfn/cfn-hup.conf":
content: !Sub |
[main]
stack=${AWS::StackId}
region=${AWS::Region}
mode: "000400"
owner: "root"
group: "root"
"/etc/cfn/hooks.d/cfn-auto-reloader.conf":
content: !Sub |
[cfn-auto-reloader-hook]
triggers=post.update
path=Resources.OpenviduServerPro.Metadata.AWS::CloudFormation::Init
action=/usr/local/bin/cfn-init -v --stack ${AWS::StackName} --resource OpenviduServerPro --region ${AWS::Region}
mode: "000400"
owner: "root"
group: "root"
"/usr/local/bin/installDockerAndDockerCompose.sh":
content: |
#!/bin/bash
set -eu -o pipefail
# Install Docker
apt-get update && apt-get install -y \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
apt-get update && apt-get install -y \
docker-ce \
docker-ce-cli \
containerd.io
# Install docker-compose v2
LATEST_DOCKER_COMPOSE_VERSION=$(curl -sSL https://api.github.com/repos/docker/compose/tags | grep name | head -n1 | cut -d'"' -f4)
OS="$(uname -s | awk '{print tolower($0)}')"
ARCH="$(uname -m)"
mkdir -p /usr/local/lib/docker/cli-plugins
rm -f /usr/local/lib/docker/cli-plugins/docker-compose
curl -SL "https://github.com/docker/compose/releases/download/${LATEST_DOCKER_COMPOSE_VERSION}/docker-compose-${OS}-${ARCH}" \
-o /usr/local/lib/docker/cli-plugins/docker-compose
chmod +x /usr/local/lib/docker/cli-plugins/docker-compose
ln -s /usr/local/lib/docker/cli-plugins/docker-compose /usr/local/bin
mode: "000755"
owner: "root"
group: "root"
"/usr/local/bin/installOpenviduServerPRO.sh":
content: |
#!/bin/bash
set -eu -o pipefail
# Install openvidu-pro
cd /opt
curl https://s3-eu-west-1.amazonaws.com/aws.openvidu.io/install_openvidu_enterprise_master_node_OPENVIDU_VERSION.sh | bash
if [[ USE_MASTER_DOCKER_IMAGES == "true" ]]; then
pushd openvidu
# docker-compose.yml replace with master version
IMAGES="$(cat docker-compose.yml | grep 'image: openvidu/' | cut -d':' -f2 | sed -e 's/^[[:space:]]*//')"
for IMG in $IMAGES
do
sed -i "s|image: $IMG:.*|image: $IMG:master|g" docker-compose.yml
done
# docker-compose.override.yml replace with master version
if [[ -f docker-compose.override.yml ]]; then
IMAGES="$(cat docker-compose.override.yml | grep 'image: openvidu/' | cut -d':' -f2 | sed -e 's/^[[:space:]]*//')"
for IMG in $IMAGES
do
sed -i "s|image: $IMG:.*|image: $IMG:master|g" docker-compose.override.yml
done
fi
popd
fi
mode: "000755"
owner: "root"
group: "root"
"/usr/local/bin/getDockerImages.sh":
content: !Sub |
#!/bin/bash
set -eu -o pipefail
# AWS cli
docker pull amazon/aws-cli:AWS_CLI_DOCKER_TAG
# Openvidu recording
docker pull openvidu/openvidu-recording:OPENVIDU_RECORDING_DOCKER_TAG
# Openvidu PRO images
cd /opt/openvidu
docker-compose pull
mode: "000755"
owner: "root"
group: "root"
'/usr/local/bin/openvidu-init.sh':
content: |
#!/bin/bash -x
WORKINGDIR=/opt/openvidu
ASG_DATA=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/user-data)
AWS_AVAIL_ZONE=`curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone`
AWS_REGION="`echo \"$AWS_AVAIL_ZONE\" | sed 's/[a-z]$//'`"
AWS_INSTANCE_ID=$(curl http://169.254.169.254/latest/meta-data/instance-id)
# S3 bucket
OPENVIDU_PRO_CONFIG_S3_BUCKET=$(echo ${ASG_DATA} | grep -Po "(OPENVIDU_PRO_CONFIG_S3_BUCKET=).+?(?=\s*(\||$))" | cut -d"=" -f2)
if [[ ! -f "/var/lib/openvidu/.openvidu-first-run" ]]; then
echo "First run of OpenVidu in this machine"
mkdir -p /var/lib/openvidu
touch "/var/lib/openvidu/.openvidu-first-run"
# Domain
DOMAIN_OR_PUBLIC_IP=$(echo ${ASG_DATA} | grep -Po "(DOMAIN_OR_PUBLIC_IP=).+?(?=\s*(\||$))" | cut -d"=" -f2)
sed -i "s|DOMAIN_OR_PUBLIC_IP=|DOMAIN_OR_PUBLIC_IP=${DOMAIN_OR_PUBLIC_IP}|" $WORKINGDIR/.env
# Pro License
OPENVIDU_PRO_LICENSE=$(echo ${ASG_DATA} | grep -Po "(OPENVIDU_PRO_LICENSE=).+?(?=\s*(\||$))" | cut -d"=" -f2)
sed -i "s|OPENVIDU_PRO_LICENSE=|OPENVIDU_PRO_LICENSE=${OPENVIDU_PRO_LICENSE}|" $WORKINGDIR/.env
# Secret
OPENVIDU_SECRET=$(echo ${ASG_DATA} | grep -Po "(OPENVIDU_SECRET=).+?(?=\s*(\||$))" | cut -d"=" -f2)
sed -i "s|OPENVIDU_SECRET=|OPENVIDU_SECRET=${OPENVIDU_SECRET}|" $WORKINGDIR/.env
# Media Server
OPENVIDU_ENTERPRISE_MEDIA_SERVER=$(echo ${ASG_DATA} | grep -Po "(OPENVIDU_ENTERPRISE_MEDIA_SERVER=).+?(?=\s*(\||$))" | cut -d"=" -f2)
sed -i "s|OPENVIDU_ENTERPRISE_MEDIA_SERVER=|OPENVIDU_ENTERPRISE_MEDIA_SERVER=${OPENVIDU_ENTERPRISE_MEDIA_SERVER}|" $WORKINGDIR/.env
# ElasticSearch and Kibana
OPENVIDU_PRO_ELASTICSEARCH=$(echo ${ASG_DATA} | grep -Po "(OPENVIDU_PRO_ELASTICSEARCH=).+?(?=\s*(\||$))" | cut -d"=" -f2)
OPENVIDU_PRO_ELASTICSEARCH_HOST=$(echo ${ASG_DATA} | grep -Po "(OPENVIDU_PRO_ELASTICSEARCH_HOST=).+?(?=\s*(\||$))" | cut -d"=" -f2)
OPENVIDU_PRO_KIBANA_HOST=$(echo ${ASG_DATA} | grep -Po "(OPENVIDU_PRO_KIBANA_HOST=).+?(?=\s*(\||$))" | cut -d"=" -f2)
ELASTICSEARCH_USERNAME=$(echo ${ASG_DATA} | grep -Po "(ELASTICSEARCH_USERNAME=).+?(?=\s*(\||$))" | cut -d"=" -f2)
ELASTICSEARCH_PASSWORD=$(echo ${ASG_DATA} | grep -Po "(ELASTICSEARCH_PASSWORD=).+?(?=\s*(\||$))" | cut -d"=" -f2)
OPENVIDU_PRO_CLUSTER_ID=$(echo ${ASG_DATA} | grep -Po "(OPENVIDU_PRO_CLUSTER_ID=).+?(?=\s*(\||$))" | cut -d"=" -f2)
if [[ "${OPENVIDU_PRO_ELASTICSEARCH}" == "true" ]]; then
sed -i "s|#OPENVIDU_PRO_ELASTICSEARCH_HOST=|OPENVIDU_PRO_ELASTICSEARCH_HOST=${OPENVIDU_PRO_ELASTICSEARCH_HOST}|" $WORKINGDIR/.env
sed -i "s|#OPENVIDU_PRO_KIBANA_HOST=|OPENVIDU_PRO_KIBANA_HOST=${OPENVIDU_PRO_KIBANA_HOST}|" $WORKINGDIR/.env
sed -i "s|ELASTICSEARCH_USERNAME=elasticadmin|ELASTICSEARCH_USERNAME=${ELASTICSEARCH_USERNAME}|" $WORKINGDIR/.env
sed -i "s|ELASTICSEARCH_PASSWORD=|ELASTICSEARCH_PASSWORD=${ELASTICSEARCH_PASSWORD}|" $WORKINGDIR/.env
else
sed -i "s|OPENVIDU_PRO_ELASTICSEARCH=true|OPENVIDU_PRO_ELASTICSEARCH=false|" $WORKINGDIR/.env
fi
sed -i "s|# OPENVIDU_PRO_CLUSTER_ID=|OPENVIDU_PRO_CLUSTER_ID=${OPENVIDU_PRO_CLUSTER_ID}|" $WORKINGDIR/.env
sed -i "s|OPENVIDU_PRO_CLUSTER_ENVIRONMENT=on_premise|OPENVIDU_PRO_CLUSTER_ENVIRONMENT=aws|" $WORKINGDIR/.env
# S3 Bucket
OPENVIDU_RECORDING=$(echo ${ASG_DATA} | grep -Po "(OPENVIDU_RECORDING=).+?(?=\s*(\||$))" | cut -d"=" -f2)
# Recording
if [[ "${OPENVIDU_RECORDING}" == "true" ]]; then
sed -i "s|OPENVIDU_RECORDING=false|OPENVIDU_RECORDING=true|" $WORKINGDIR/.env
fi
sed -i "s|#OPENVIDU_PRO_RECORDING_STORAGE=|OPENVIDU_PRO_RECORDING_STORAGE=s3|" $WORKINGDIR/.env
sed -i "s|#OPENVIDU_PRO_AWS_S3_BUCKET=|OPENVIDU_PRO_AWS_S3_BUCKET=${OPENVIDU_PRO_CONFIG_S3_BUCKET}/recordings|" $WORKINGDIR/.env
# Deploy Coturn in media nodes
OPENVIDU_PRO_COTURN_IN_MEDIA_NODES=$(echo ${ASG_DATA} | grep -Po "(OPENVIDU_PRO_COTURN_IN_MEDIA_NODES=).+?(?=\s*(\||$))" | cut -d"=" -f2)
if [ "${OPENVIDU_PRO_COTURN_IN_MEDIA_NODES}" == "true" ]; then
sed -i "s|OPENVIDU_PRO_COTURN_IN_MEDIA_NODES=false|OPENVIDU_PRO_COTURN_IN_MEDIA_NODES=true|" $WORKINGDIR/.env
fi
# AWS Instance ID and region
sed -i "s|#AWS_INSTANCE_ID=|AWS_INSTANCE_ID=${AWS_INSTANCE_ID}|" $WORKINGDIR/.env
# AWS ASG
RM_REDIS_IP=$(echo ${ASG_DATA} | grep -Po "(RM_REDIS_IP=).+?(?=\s*(\||$))" | cut -d"=" -f2)
RM_REDIS_PORT=$(echo ${ASG_DATA} | grep -Po "(RM_REDIS_PORT=).+?(?=\s*(\||$))" | cut -d"=" -f2)
RM_SQS_QUEUE=$(echo ${ASG_DATA} | grep -Po "(RM_SQS_QUEUE=).+?(?=\s*(\||$))" | cut -d"=" -f2)
RM_CLOUDFORMATION_ARN=$(echo ${ASG_DATA} | grep -Po "(RM_CLOUDFORMATION_ARN=).+?(?=\s*(\||$))" | cut -d"=" -f2)
# Autoscaling group names
RM_MEDIA_NODES_AUTOSCALING_GROUP_NAME=$(echo ${ASG_DATA} | grep -Po "(RM_MEDIA_NODES_AUTOSCALING_GROUP_NAME=).+?(?=\s*(\||$))" | cut -d"=" -f2)
RM_MASTER_NODES_AUTOSCALING_GROUP_NAME=$(echo ${ASG_DATA} | grep -Po "(RM_MASTER_NODES_AUTOSCALING_GROUP_NAME=).+?(?=\s*(\||$))" | cut -d"=" -f2)
sed -i "s|RM_REDIS_IP=|RM_REDIS_IP=${RM_REDIS_IP}|" $WORKINGDIR/.env
sed -i "s|RM_REDIS_PORT=|RM_REDIS_PORT=${RM_REDIS_PORT}|" $WORKINGDIR/.env
sed -i "s|RM_SQS_QUEUE=|RM_SQS_QUEUE=${RM_SQS_QUEUE}|" $WORKINGDIR/.env
sed -i "s|RM_CLOUDFORMATION_ARN=|RM_CLOUDFORMATION_ARN=${RM_CLOUDFORMATION_ARN}|" $WORKINGDIR/.env
sed -i "s|RM_S3_CONFIGURATION_BUCKET=|RM_S3_CONFIGURATION_BUCKET=${OPENVIDU_PRO_CONFIG_S3_BUCKET}|" $WORKINGDIR/.env
sed -i "s|RM_S3_CONFIGURATION_BUCKET_REGION=|RM_S3_CONFIGURATION_BUCKET_REGION=${AWS_REGION}|" $WORKINGDIR/.env
sed -i "s|RM_MEDIA_NODES_AUTOSCALING_GROUP_NAME=|RM_MEDIA_NODES_AUTOSCALING_GROUP_NAME=${RM_MEDIA_NODES_AUTOSCALING_GROUP_NAME}|" $WORKINGDIR/.env
sed -i "s|RM_MASTER_NODES_AUTOSCALING_GROUP_NAME=|RM_MASTER_NODES_AUTOSCALING_GROUP_NAME=${RM_MASTER_NODES_AUTOSCALING_GROUP_NAME}|" $WORKINGDIR/.env
# Autorestart on .env changes in S3
OPENVIDU_ENTERPRISE_S3_CONFIG_AUTORESTART=$(echo ${ASG_DATA} | grep -Po "(OPENVIDU_ENTERPRISE_S3_CONFIG_AUTORESTART=).+?(?=\s*(\||$))" | cut -d"=" -f2)
if [[ "${OPENVIDU_ENTERPRISE_S3_CONFIG_AUTORESTART}" == "true" ]]; then
echo "OPENVIDU_ENTERPRISE_S3_CONFIG_AUTORESTART=true" >> $WORKINGDIR/.env
else
echo "OPENVIDU_ENTERPRISE_S3_CONFIG_AUTORESTART=false" >> $WORKINGDIR/.env
fi
# End with newline
echo "" >> $WORKINGDIR/.env
fi
# Stop openvidu
pushd "${WORKINGDIR}"
./openvidu stop
./openvidu start
popd
mode: "000755"
owner: "root"
group: "root"
Properties:
ImageId: !FindInMap [AMIMAP, !Ref 'AWS::Region', AMI]
InstanceType: "t2.2xlarge"
KeyName: AWS_KEY_NAME
Tags:
- Key: Name
Value: !Ref AWS::StackName
BlockDeviceMappings:
- DeviceName: /dev/sda1
Ebs:
VolumeType: gp2
DeleteOnTermination: true
VolumeSize: 10
UserData:
"Fn::Base64":
!Sub |
#!/bin/bash -x
set -eu -o pipefail
apt-get update && apt-get install -y \
python3-pip \
ec2-instance-connect
pip3 install https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-py3-latest.tar.gz
cfn-init --region ${AWS::Region} --stack ${AWS::StackId} --resource OpenviduServerPro
/usr/local/bin/installDockerAndDockerCompose.sh || { echo "[Openvidu] error installing docker and compose"; exit 1; }
/usr/local/bin/installOpenviduServerPRO.sh || { echo "[Openvidu] error installing Openvidu Server PRO"; exit 1; }
/usr/local/bin/getDockerImages.sh || { echo "[Openvidu] error getting docker images"; exit 1; }
# Launch on reboot
echo "@reboot /usr/local/bin/openvidu-init.sh >> /var/log/openvidu-init.log 2>&1" | crontab
# sending the finish call
/usr/local/bin/cfn-signal -e $? --stack ${AWS::StackId} --resource WaitCondition --region ${AWS::Region}
# Cleaning the house
shred -u /var/log/cloud-init-output.log
shred -u /etc/ssh/*_key /etc/ssh/*_key.pub
shred -u /usr/local/bin/installDockerAndDockerCompose.sh
shred -u /usr/local/bin/installOpenviduServerPRO.sh
shred -u /usr/local/bin/getDockerImages.sh
shred -u /usr/local/bin/installDependencies.sh
find /var/lib/cloud/instances/$(curl http://169.254.169.254/latest/meta-data/instance-id) -type f | xargs shred -u
rm -rf /var/lib/cloud/instances/$(curl http://169.254.169.254/latest/meta-data/instance-id)
WaitCondition:
Type: AWS::CloudFormation::WaitCondition
CreationPolicy:
ResourceSignal:
Timeout: PT20M
Count: 1

View File

@ -0,0 +1,137 @@
#!/bin/bash -x
set -eu -o pipefail
AWS_KEY_NAME=${AWS_KEY_NAME:-}
CF_RELEASE=${CF_RELEASE:-false}
KMS_AMI_ID=${KMS_AMI_ID:-}
if [[ $CF_RELEASE == "true" ]]; then
git checkout v$OPENVIDU_PRO_VERSION
fi
export AWS_DEFAULT_REGION=eu-west-1
DATESTAMP=$(date +%s)
TEMPJSON=$(mktemp -t cloudformation-XXX --suffix .json)
# Get Latest Ubuntu AMI id from specified region
getUbuntuAmiId() {
local AMI_ID=$(
aws --region ${1} ec2 describe-images \
--filters "Name=name,Values=*ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*" \
--query "sort_by(Images, &CreationDate)" |
jq -r 'del(.[] | select(.ImageOwnerAlias != null)) | .[-1].ImageId'
)
echo $AMI_ID
}
AMIEUWEST1=$(getUbuntuAmiId 'eu-west-1')
AMIUSEAST1=$(getUbuntuAmiId 'us-east-1')
# Copy templates to feed
cp cfn-crete-ov-aws-asg-ami.yaml.template cfn-crete-ov-aws-asg-ami.yaml
## Setting Openvidu Version and Ubuntu Latest AMIs
if [[ ! -z ${AWS_KEY_NAME} ]]; then
sed -i "s/ KeyName: AWS_KEY_NAME/ KeyName: ${AWS_KEY_NAME}/g" cfn-crete-ov-aws-asg-ami.yaml
else
sed -i '/ KeyName: AWS_KEY_NAME/d' cfn-crete-ov-aws-asg-ami.yaml
fi
sed -i "s/AWS_KEY_NAME/${AWS_KEY_NAME}/g" cfn-crete-ov-aws-asg-ami.yaml
sed -i "s/USE_MASTER_DOCKER_IMAGES/${USE_MASTER_DOCKER_IMAGES}/g" cfn-crete-ov-aws-asg-ami.yaml
sed -i "s/AWS_CLI_DOCKER_TAG/${AWS_CLI_DOCKER_TAG}/g" cfn-crete-ov-aws-asg-ami.yaml
sed -i "s/OPENVIDU_RECORDING_DOCKER_TAG/${OPENVIDU_RECORDING_DOCKER_TAG}/g" cfn-crete-ov-aws-asg-ami.yaml
sed -i "s/OPENVIDU_VERSION/${OPENVIDU_PRO_VERSION}/g" cfn-crete-ov-aws-asg-ami.yaml
sed -i "s/AMIEUWEST1/${AMIEUWEST1}/g" cfn-crete-ov-aws-asg-ami.yaml
sed -i "s/AMIUSEAST1/${AMIUSEAST1}/g" cfn-crete-ov-aws-asg-ami.yaml
## OpenVidu AMI
# Copy template to S3
aws s3 cp cfn-crete-ov-aws-asg-ami.yaml s3://aws.openvidu.io
TEMPLATE_URL=https://s3-eu-west-1.amazonaws.com/aws.openvidu.io/cfn-crete-ov-aws-asg-ami.yaml
# Update installation script
if [[ ${UPDATE_S3_FILES} == "true" ]]; then
# Avoid overriding existing versions
# Only master and non existing versions can be overriden
if [[ ${OPENVIDU_PRO_VERSION} != "master" ]]; then
INSTALL_SCRIPT_EXISTS=true
aws s3api head-object --bucket aws.openvidu.io --key install_openvidu_enterprise_master_node_$OPENVIDU_PRO_VERSION.sh || INSTALL_SCRIPT_EXISTS=false
if [[ ${INSTALL_SCRIPT_EXISTS} == "true" ]]; then
echo "Aborting updating s3://aws.openvidu.io/install_openvidu_enterprise_master_node_${OPENVIDU_PRO_VERSION}.sh. File actually exists."
exit 1
fi
fi
aws s3 cp ../docker-compose/install_openvidu_enterprise_master_node.sh s3://aws.openvidu.io/install_openvidu_enterprise_master_node_$OPENVIDU_PRO_VERSION.sh --acl public-read
fi
aws cloudformation create-stack \
--stack-name openvidu-${DATESTAMP} \
--template-url ${TEMPLATE_URL} \
"$(if [ "$NIGHTLY" == "false" ]; then echo '--disable-rollback'; fi)"
aws cloudformation wait stack-create-complete --stack-name openvidu-${DATESTAMP}
echo "Getting instance ID"
INSTANCE_ID=$(aws ec2 describe-instances --filters "Name=tag:Name,Values=openvidu-${DATESTAMP}" | jq -r ' .Reservations[] | .Instances[] | .InstanceId')
echo "Stopping the instance"
aws ec2 stop-instances --instance-ids ${INSTANCE_ID}
echo "wait for the instance to stop"
aws ec2 wait instance-stopped --instance-ids ${INSTANCE_ID}
echo "Creating AMI"
OV_RAW_AMI_ID=$(aws ec2 create-image --instance-id ${INSTANCE_ID} --name OpenViduServerProASG-${OPENVIDU_PRO_VERSION}-${DATESTAMP} --description "Openvidu Server Pro AWS ASG" --output text)
echo "Cleaning up"
aws cloudformation delete-stack --stack-name openvidu-${DATESTAMP}
echo "Create AMI with ID: ${OV_RAW_AMI_ID}"
# Wait for the instance
# Unfortunately, aws cli does not have a way to increase timeout
WAIT_RETRIES=0
WAIT_MAX_RETRIES=3
until [ "${WAIT_RETRIES}" -ge "${WAIT_MAX_RETRIES}" ]; do
aws ec2 wait image-available --image-ids ${OV_RAW_AMI_ID} && break
WAIT_RETRIES=$((WAIT_RETRIES + 1))
sleep 5
done
if [[ $CF_RELEASE == "true" ]]; then
aws ec2 modify-image-attribute --image-id ${OV_RAW_AMI_ID} --launch-permission "Add=[{Group=all}]"
aws ec2 describe-images --image-ids ${OV_RAW_AMI_ID} | jq -r '.Images[0].BlockDeviceMappings[0].Ebs.SnapshotId'
SNAPSHOT_ID=$(aws ec2 describe-images --image-ids ${OV_RAW_AMI_ID} | jq -r '.Images[0].BlockDeviceMappings[0].Ebs.SnapshotId')
aws ec2 modify-snapshot-attribute --snapshot-id ${SNAPSHOT_ID} --create-volume-permission "Add=[{Group=all}]"
fi
if [[ "${USE_MASTER_DOCKER_IMAGES}" == "true" ]]; then
KMS_AMI_ID="$(aws ec2 describe-images --filters Name=image-type,Values=machine Name=is-public,Values=false \
--query 'Images[?starts_with(Name, `KMS-ov-master`) == `true`][CreationDate, Name, ImageId, Public]' \
--output text | sort -r -k1 | head -n1 | awk '{ print $3 }')"
fi
# Updating the template
sed "s/OV_MASTER_REPLICATION_AMI_ID/${OV_RAW_AMI_ID}/" CF-OpenVidu-Enterprise.yaml.template >CF-OpenVidu-Enterprise-${OPENVIDU_PRO_VERSION}.yaml
sed -i "s/KMS_AMI_ID/${KMS_AMI_ID}/g" CF-OpenVidu-Enterprise-${OPENVIDU_PRO_VERSION}.yaml
sed -i "s/AWS_CLI_DOCKER_TAG/${AWS_CLI_DOCKER_TAG}/g" CF-OpenVidu-Enterprise-${OPENVIDU_PRO_VERSION}.yaml
# Update CF template
if [[ ${UPDATE_S3_FILES} == "true" ]]; then
# Avoid overriding existing versions
# Only master and non existing versions can be overriden
if [[ ${OPENVIDU_PRO_VERSION} != "master" ]]; then
CF_EXIST=true
aws s3api head-object --bucket aws.openvidu.io --key CF-OpenVidu-Enterprise-${OPENVIDU_PRO_VERSION}.yaml || CF_EXIST=false
if [[ ${CF_EXIST} == "true" ]]; then
echo "Aborting updating s3://aws.openvidu.io/CF-OpenVidu-Enterprise-${OPENVIDU_PRO_VERSION}.yaml. File actually exists."
exit 1
fi
fi
aws s3 cp CF-OpenVidu-Enterprise-${OPENVIDU_PRO_VERSION}.yaml s3://aws.openvidu.io/CF-OpenVidu-Enterprise-${OPENVIDU_PRO_VERSION}.yaml --acl public-read
fi
rm $TEMPJSON
rm cfn-crete-ov-aws-asg-ami.yaml
aws s3api delete-object --bucket aws.openvidu.io --key cfn-crete-ov-aws-asg-ami.yaml

View File

@ -0,0 +1,20 @@
# Deploy Multi-Master cloudformation
1. Replace all of the variables of file cf_parameters.conf with the proper values. For example:
```conf
export DOMAIN_NAME="ov-multimaster-2.k8s.codeurjc.es"
export OPENVIDU_LICENSE="valid-license"
export KIBANA_HOST="https://search-ov-elasticsearch-3gxumtiwg67qp6jplw7rkjshrm.eu-west-1.es.amazonaws.com:443/_plugin/kibana/"
export ELASTICSEARCH_HOST="https://search-ov-elasticsearch-3gxumtiwg67qp6jplw7rkjshrm.eu-west-1.es.amazonaws.com:443"
export SSH_KEY_NAME="kms-aws-share-key"
export VPC="vpc-6bf6a10f"
export SUBNETS="subnet-599ebd3d,subnet-f1ed81a9"
export LOAD_BALANCER_CERTIFICATE="arn:aws:acm:eu-west-1:849201093595:certificate/01d51580-d8fc-45b0-9c72-e7666ba890d9"
export MASTER_NODE_INSTANCE_TYPE="t2.large"
export MEDIA_NODE_INSTANCE_TYPE="t2.large"
```
2. Run script `./deploy_cf.sh`
3. Update Route 53 to link the domain name to the Load Balancer. At [https://console.aws.amazon.com/route53/v2/hostedzones#ListRecordSets/](https://console.aws.amazon.com/route53/v2/hostedzones#ListRecordSets/) edit record of subdomain `ov-multimaster-2.k8s.codeurjc.es`, routing traffic to the Load Balancer (dualstack.ov-pro-multimaster-VAR1-lb-VAR2.eu-west-1.elb.amazonaws.com).

View File

@ -0,0 +1,296 @@
---
AWSTemplateFormatVersion: 2010-09-09
Description: Openvidu Server Pro CloudFormation AMI template.
Mappings:
AMIMAP:
eu-west-1:
AMI: AMIEUWEST1
us-east-1:
AMI: AMIUSEAST1
Resources:
OpenviduServerPro:
Type: 'AWS::EC2::Instance'
Metadata:
Comment: "Install OpenVidu Server Pro AWS ASG"
AWS::CloudFormation::Init:
config:
files:
"/etc/cfn/cfn-hup.conf":
content: !Sub |
[main]
stack=${AWS::StackId}
region=${AWS::Region}
mode: "000400"
owner: "root"
group: "root"
"/etc/cfn/hooks.d/cfn-auto-reloader.conf":
content: !Sub |
[cfn-auto-reloader-hook]
triggers=post.update
path=Resources.OpenviduServerPro.Metadata.AWS::CloudFormation::Init
action=/usr/local/bin/cfn-init -v --stack ${AWS::StackName} --resource OpenviduServerPro --region ${AWS::Region}
mode: "000400"
owner: "root"
group: "root"
"/usr/local/bin/installDockerAndDockerCompose.sh":
content: |
#!/bin/bash
set -eu -o pipefail
# Install Docker
apt-get update && apt-get install -y \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
apt-get update && apt-get install -y \
docker-ce \
docker-ce-cli \
containerd.io
# Install docker-compose v2
LATEST_DOCKER_COMPOSE_VERSION=$(curl -sSL https://api.github.com/repos/docker/compose/tags | grep name | head -n1 | cut -d'"' -f4)
OS="$(uname -s | awk '{print tolower($0)}')"
ARCH="$(uname -m)"
mkdir -p /usr/local/lib/docker/cli-plugins
rm -f /usr/local/lib/docker/cli-plugins/docker-compose
curl -SL "https://github.com/docker/compose/releases/download/${LATEST_DOCKER_COMPOSE_VERSION}/docker-compose-${OS}-${ARCH}" \
-o /usr/local/lib/docker/cli-plugins/docker-compose
chmod +x /usr/local/lib/docker/cli-plugins/docker-compose
ln -s /usr/local/lib/docker/cli-plugins/docker-compose /usr/local/bin
mode: "000755"
owner: "root"
group: "root"
"/usr/local/bin/installOpenviduServerPRO.sh":
content: |
#!/bin/bash
set -eu -o pipefail
# Install openvidu-pro
cd /opt
if [[ "OPENVIDU_VERSION" == "master" ]]; then
curl https://raw.githubusercontent.com/OpenVidu/openvidu/master/openvidu-server/deployments/enterprise/master-node/install_openvidu_enterprise_master_node.sh | bash
else
curl https://raw.githubusercontent.com/OpenVidu/openvidu/vOPENVIDU_VERSION/openvidu-server/deployments/enterprise/master-node/install_openvidu_enterprise_master_node.sh | bash
fi
if [[ USE_MASTER_DOCKER_IMAGES == "true" ]]; then
pushd openvidu
# docker-compose.yml replace with master version
IMAGES="$(cat docker-compose.yml | grep 'image: openvidu/' | cut -d':' -f2 | sed -e 's/^[[:space:]]*//')"
for IMG in $IMAGES
do
sed -i "s|image: $IMG:.*|image: $IMG:master|g" docker-compose.yml
done
# docker-compose.override.yml replace with master version
if [[ -f docker-compose.override.yml ]]; then
IMAGES="$(cat docker-compose.override.yml | grep 'image: openvidu/' | cut -d':' -f2 | sed -e 's/^[[:space:]]*//')"
for IMG in $IMAGES
do
sed -i "s|image: $IMG:.*|image: $IMG:master|g" docker-compose.override.yml
done
fi
popd
fi
mode: "000755"
owner: "root"
group: "root"
"/usr/local/bin/getDockerImages.sh":
content: !Sub |
#!/bin/bash
set -eu -o pipefail
# AWS cli
docker pull amazon/aws-cli:AWS_DOCKER_TAG
# Openvidu recording
docker pull openvidu/openvidu-recording:OPENVIDU_RECORDING_DOCKER_TAG
# Openvidu PRO images
cd /opt/openvidu
docker-compose pull
mode: "000755"
owner: "root"
group: "root"
'/usr/local/bin/openvidu-init.sh':
content: |
#!/bin/bash -x
WORKINGDIR=/opt/openvidu
ASG_DATA=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/user-data)
AWS_AVAIL_ZONE=`curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone`
AWS_REGION="`echo \"$AWS_AVAIL_ZONE\" | sed 's/[a-z]$//'`"
AWS_INSTANCE_ID=$(curl http://169.254.169.254/latest/meta-data/instance-id)
# S3 bucket
OPENVIDU_PRO_CONFIG_S3_BUCKET=$(echo ${ASG_DATA} | grep -Po "(OPENVIDU_PRO_CONFIG_S3_BUCKET=).+?(?=\s*(\||$))" | cut -d"=" -f2)
if [[ ! -f "/var/lib/openvidu/.openvidu-first-run" ]]; then
echo "First run of OpenVidu in this machine"
mkdir -p /var/lib/openvidu
touch "/var/lib/openvidu/.openvidu-first-run"
# Domain
DOMAIN_OR_PUBLIC_IP=$(echo ${ASG_DATA} | grep -Po "(DOMAIN_OR_PUBLIC_IP=).+?(?=\s*(\||$))" | cut -d"=" -f2)
sed -i "s|DOMAIN_OR_PUBLIC_IP=|DOMAIN_OR_PUBLIC_IP=${DOMAIN_OR_PUBLIC_IP}|" $WORKINGDIR/.env
# Pro License
OPENVIDU_PRO_LICENSE=$(echo ${ASG_DATA} | grep -Po "(OPENVIDU_PRO_LICENSE=).+?(?=\s*(\||$))" | cut -d"=" -f2)
sed -i "s|OPENVIDU_PRO_LICENSE=|OPENVIDU_PRO_LICENSE=${OPENVIDU_PRO_LICENSE}|" $WORKINGDIR/.env
# Secret
OPENVIDU_SECRET=$(echo ${ASG_DATA} | grep -Po "(OPENVIDU_SECRET=).+?(?=\s*(\||$))" | cut -d"=" -f2)
sed -i "s|OPENVIDU_SECRET=|OPENVIDU_SECRET=${OPENVIDU_SECRET}|" $WORKINGDIR/.env
# Media Server
OPENVIDU_ENTERPRISE_MEDIA_SERVER=$(echo ${ASG_DATA} | grep -Po "(OPENVIDU_ENTERPRISE_MEDIA_SERVER=).+?(?=\s*(\||$))" | cut -d"=" -f2)
sed -i "s|OPENVIDU_ENTERPRISE_MEDIA_SERVER=|OPENVIDU_ENTERPRISE_MEDIA_SERVER=${OPENVIDU_ENTERPRISE_MEDIA_SERVER}|" $WORKINGDIR/.env
# ElasticSearch and Kibana
OPENVIDU_PRO_ELASTICSEARCH_HOST=$(echo ${ASG_DATA} | grep -Po "(OPENVIDU_PRO_ELASTICSEARCH_HOST=).+?(?=\s*(\||$))" | cut -d"=" -f2)
OPENVIDU_PRO_KIBANA_HOST=$(echo ${ASG_DATA} | grep -Po "(OPENVIDU_PRO_KIBANA_HOST=).+?(?=\s*(\||$))" | cut -d"=" -f2)
OPENVIDU_PRO_CLUSTER_ID=$(echo ${ASG_DATA} | grep -Po "(OPENVIDU_PRO_CLUSTER_ID=).+?(?=\s*(\||$))" | cut -d"=" -f2)
ELASTICSEARCH_USERNAME=$(echo ${ASG_DATA} | grep -Po "(ELASTICSEARCH_USERNAME=).+?(?=\s*(\||$))" | cut -d"=" -f2)
ELASTICSEARCH_PASSWORD=$(echo ${ASG_DATA} | grep -Po "(ELASTICSEARCH_PASSWORD=).+?(?=\s*(\||$))" | cut -d"=" -f2)
sed -i "s|#OPENVIDU_PRO_ELASTICSEARCH_HOST=|OPENVIDU_PRO_ELASTICSEARCH_HOST=${OPENVIDU_PRO_ELASTICSEARCH_HOST}|" $WORKINGDIR/.env
sed -i "s|#OPENVIDU_PRO_KIBANA_HOST=|OPENVIDU_PRO_KIBANA_HOST=${OPENVIDU_PRO_KIBANA_HOST}|" $WORKINGDIR/.env
sed -i "s|# OPENVIDU_PRO_CLUSTER_ID=|OPENVIDU_PRO_CLUSTER_ID=${OPENVIDU_PRO_CLUSTER_ID}|" $WORKINGDIR/.env
sed -i "s|ELASTICSEARCH_USERNAME=elasticadmin|ELASTICSEARCH_USERNAME=${ELASTICSEARCH_USERNAME}|" $WORKINGDIR/.env
sed -i "s|ELASTICSEARCH_PASSWORD=|ELASTICSEARCH_PASSWORD=${ELASTICSEARCH_PASSWORD}|" $WORKINGDIR/.env
sed -i "s|OPENVIDU_PRO_CLUSTER_ENVIRONMENT=on_premise|OPENVIDU_PRO_CLUSTER_ENVIRONMENT=aws|" $WORKINGDIR/.env
# S3 Bucket
OPENVIDU_RECORDING=$(echo ${ASG_DATA} | grep -Po "(OPENVIDU_RECORDING=).+?(?=\s*(\||$))" | cut -d"=" -f2)
# Recording
if [[ "${OPENVIDU_RECORDING}" == "true" ]]; then
sed -i "s|OPENVIDU_RECORDING=false|OPENVIDU_RECORDING=true|" $WORKINGDIR/.env
fi
sed -i "s|#OPENVIDU_PRO_RECORDING_STORAGE=|OPENVIDU_PRO_RECORDING_STORAGE=s3|" $WORKINGDIR/.env
sed -i "s|#OPENVIDU_PRO_AWS_S3_BUCKET=|OPENVIDU_PRO_AWS_S3_BUCKET=${OPENVIDU_PRO_CONFIG_S3_BUCKET}/recordings|" $WORKINGDIR/.env
# Deploy Coturn in media nodes
OPENVIDU_PRO_COTURN_IN_MEDIA_NODES=$(echo ${ASG_DATA} | grep -Po "(OPENVIDU_PRO_COTURN_IN_MEDIA_NODES=).+?(?=\s*(\||$))" | cut -d"=" -f2)
if [ "${OPENVIDU_PRO_COTURN_IN_MEDIA_NODES}" == "true" ]; then
sed -i "s|OPENVIDU_PRO_COTURN_IN_MEDIA_NODES=false|OPENVIDU_PRO_COTURN_IN_MEDIA_NODES=true|" $WORKINGDIR/.env
fi
# AWS Instance ID and region
sed -i "s|#AWS_INSTANCE_ID=|AWS_INSTANCE_ID=${AWS_INSTANCE_ID}|" $WORKINGDIR/.env
# AWS ASG
RM_REDIS_IP=$(echo ${ASG_DATA} | grep -Po "(RM_REDIS_IP=).+?(?=\s*(\||$))" | cut -d"=" -f2)
RM_REDIS_PORT=$(echo ${ASG_DATA} | grep -Po "(RM_REDIS_PORT=).+?(?=\s*(\||$))" | cut -d"=" -f2)
RM_SQS_QUEUE=$(echo ${ASG_DATA} | grep -Po "(RM_SQS_QUEUE=).+?(?=\s*(\||$))" | cut -d"=" -f2)
RM_CLOUDFORMATION_ARN=$(echo ${ASG_DATA} | grep -Po "(RM_CLOUDFORMATION_ARN=).+?(?=\s*(\||$))" | cut -d"=" -f2)
# Autoscaling group names
RM_MEDIA_NODES_AUTOSCALING_GROUP_NAME=$(echo ${ASG_DATA} | grep -Po "(RM_MEDIA_NODES_AUTOSCALING_GROUP_NAME=).+?(?=\s*(\||$))" | cut -d"=" -f2)
RM_MASTER_NODES_AUTOSCALING_GROUP_NAME=$(echo ${ASG_DATA} | grep -Po "(RM_MASTER_NODES_AUTOSCALING_GROUP_NAME=).+?(?=\s*(\||$))" | cut -d"=" -f2)
sed -i "s|RM_REDIS_IP=|RM_REDIS_IP=${RM_REDIS_IP}|" $WORKINGDIR/.env
sed -i "s|RM_REDIS_PORT=|RM_REDIS_PORT=${RM_REDIS_PORT}|" $WORKINGDIR/.env
sed -i "s|RM_SQS_QUEUE=|RM_SQS_QUEUE=${RM_SQS_QUEUE}|" $WORKINGDIR/.env
sed -i "s|RM_CLOUDFORMATION_ARN=|RM_CLOUDFORMATION_ARN=${RM_CLOUDFORMATION_ARN}|" $WORKINGDIR/.env
sed -i "s|RM_S3_CONFIGURATION_BUCKET=|RM_S3_CONFIGURATION_BUCKET=${OPENVIDU_PRO_CONFIG_S3_BUCKET}|" $WORKINGDIR/.env
sed -i "s|RM_S3_CONFIGURATION_BUCKET_REGION=|RM_S3_CONFIGURATION_BUCKET_REGION=${AWS_REGION}|" $WORKINGDIR/.env
sed -i "s|RM_MEDIA_NODES_AUTOSCALING_GROUP_NAME=|RM_MEDIA_NODES_AUTOSCALING_GROUP_NAME=${RM_MEDIA_NODES_AUTOSCALING_GROUP_NAME}|" $WORKINGDIR/.env
sed -i "s|RM_MASTER_NODES_AUTOSCALING_GROUP_NAME=|RM_MASTER_NODES_AUTOSCALING_GROUP_NAME=${RM_MASTER_NODES_AUTOSCALING_GROUP_NAME}|" $WORKINGDIR/.env
# Autorestart on .env changes in S3
OPENVIDU_ENTERPRISE_S3_CONFIG_AUTORESTART=$(echo ${ASG_DATA} | grep -Po "(OPENVIDU_ENTERPRISE_S3_CONFIG_AUTORESTART=).+?(?=\s*(\||$))" | cut -d"=" -f2)
if [[ "${OPENVIDU_ENTERPRISE_S3_CONFIG_AUTORESTART}" == "true" ]]; then
echo "OPENVIDU_ENTERPRISE_S3_CONFIG_AUTORESTART=true" >> $WORKINGDIR/.env
else
echo "OPENVIDU_ENTERPRISE_S3_CONFIG_AUTORESTART=false" >> $WORKINGDIR/.env
fi
# End with newline
echo "" >> $WORKINGDIR/.env
fi
# Watch docker tags changes in dockerhub
docker run -d \
--name watchtower \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower \
openvidu-replication-manager-1 openvidu-openvidu-server-1 -i 5 -d
# Stop openvidu
pushd "${WORKINGDIR}"
./openvidu stop
./openvidu start
popd
mode: "000755"
owner: "root"
group: "root"
Properties:
ImageId: !FindInMap [AMIMAP, !Ref 'AWS::Region', AMI]
InstanceType: "t2.2xlarge"
KeyName: AWS_KEY_NAME
Tags:
- Key: Name
Value: !Ref AWS::StackName
BlockDeviceMappings:
- DeviceName: /dev/sda1
Ebs:
VolumeType: gp2
DeleteOnTermination: true
VolumeSize: 10
UserData:
"Fn::Base64":
!Sub |
#!/bin/bash -x
set -eu -o pipefail
apt-get update && apt-get install -y \
python3-pip \
ec2-instance-connect
pip3 install https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-py3-latest.tar.gz
cfn-init --region ${AWS::Region} --stack ${AWS::StackId} --resource OpenviduServerPro
/usr/local/bin/installDockerAndDockerCompose.sh || { echo "[Openvidu] error installing docker and compose"; exit 1; }
/usr/local/bin/installOpenviduServerPRO.sh || { echo "[Openvidu] error installing Openvidu Server PRO"; exit 1; }
/usr/local/bin/getDockerImages.sh || { echo "[Openvidu] error getting docker images"; exit 1; }
# Launch on reboot
echo "@reboot /usr/local/bin/openvidu-init.sh >> /var/log/openvidu-init.log 2>&1" | crontab
# sending the finish call
/usr/local/bin/cfn-signal -e $? --stack ${AWS::StackId} --resource WaitCondition --region ${AWS::Region}
# Cleaning the house
shred -u /var/log/cloud-init-output.log
shred -u /etc/ssh/*_key /etc/ssh/*_key.pub
shred -u /usr/local/bin/installDockerAndDockerCompose.sh
shred -u /usr/local/bin/installOpenviduServerPRO.sh
shred -u /usr/local/bin/getDockerImages.sh
shred -u /usr/local/bin/installDependencies.sh
find /var/lib/cloud/instances/$(curl http://169.254.169.254/latest/meta-data/instance-id) -type f | xargs shred -u
rm -rf /var/lib/cloud/instances/$(curl http://169.254.169.254/latest/meta-data/instance-id)
WaitCondition:
Type: AWS::CloudFormation::WaitCondition
CreationPolicy:
ResourceSignal:
Timeout: PT20M
Count: 1

View File

@ -0,0 +1,111 @@
#!/bin/bash -x
set -eu -o pipefail
AWS_KEY_NAME=${AWS_KEY_NAME:-}
CF_RELEASE=${CF_RELEASE:-false}
if [[ $CF_RELEASE == "true" ]]; then
git checkout v$OPENVIDU_PRO_VERSION
fi
export AWS_DEFAULT_REGION=eu-west-1
DATESTAMP=$(date +%s)
TEMPJSON=$(mktemp -t cloudformation-XXX --suffix .json)
# Get Latest Ubuntu AMI id from specified region
getUbuntuAmiId() {
local AMI_ID=$(
aws --region ${1} ec2 describe-images \
--filters "Name=name,Values=*ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*" \
--query "sort_by(Images, &CreationDate)" |
jq -r 'del(.[] | select(.ImageOwnerAlias != null)) | .[-1].ImageId'
)
echo $AMI_ID
}
AMIEUWEST1=$(getUbuntuAmiId 'eu-west-1')
AMIUSEAST1=$(getUbuntuAmiId 'us-east-1')
# Copy templates to feed
cp cfn-crete-ov-aws-asg-ami.yaml.template cfn-crete-ov-aws-asg-ami.yaml
## Setting Openvidu Version and Ubuntu Latest AMIs
if [[ ! -z ${AWS_KEY_NAME} ]]; then
sed -i "s/ KeyName: AWS_KEY_NAME/ KeyName: ${AWS_KEY_NAME}/g" cfn-crete-ov-aws-asg-ami.yaml
else
sed -i '/ KeyName: AWS_KEY_NAME/d' cfn-crete-ov-aws-asg-ami.yaml
fi
sed -i "s/AWS_KEY_NAME/${AWS_KEY_NAME}/g" cfn-crete-ov-aws-asg-ami.yaml
sed -i "s/USE_MASTER_DOCKER_IMAGES/${USE_MASTER_DOCKER_IMAGES}/g" cfn-crete-ov-aws-asg-ami.yaml
sed -i "s/AWS_DOCKER_TAG/${AWS_DOCKER_TAG}/g" cfn-crete-ov-aws-asg-ami.yaml
sed -i "s/OPENVIDU_RECORDING_DOCKER_TAG/${OPENVIDU_RECORDING_DOCKER_TAG}/g" cfn-crete-ov-aws-asg-ami.yaml
sed -i "s/OPENVIDU_VERSION/${OPENVIDU_PRO_VERSION}/g" cfn-crete-ov-aws-asg-ami.yaml
sed -i "s/AMIEUWEST1/${AMIEUWEST1}/g" cfn-crete-ov-aws-asg-ami.yaml
sed -i "s/AMIUSEAST1/${AMIUSEAST1}/g" cfn-crete-ov-aws-asg-ami.yaml
## OpenVidu AMI
# Copy template to S3
aws s3 cp cfn-crete-ov-aws-asg-ami.yaml s3://aws.openvidu.io
TEMPLATE_URL=https://s3-eu-west-1.amazonaws.com/aws.openvidu.io/cfn-crete-ov-aws-asg-ami.yaml
aws cloudformation create-stack \
--stack-name openvidu-${DATESTAMP} \
--template-url ${TEMPLATE_URL} \
"$(if [ "$NIGHTLY" == "false" ]; then echo '--disable-rollback'; fi)"
aws cloudformation wait stack-create-complete --stack-name openvidu-${DATESTAMP}
echo "Getting instance ID"
INSTANCE_ID=$(aws ec2 describe-instances --filters "Name=tag:Name,Values=openvidu-${DATESTAMP}" | jq -r ' .Reservations[] | .Instances[] | .InstanceId')
echo "Stopping the instance"
aws ec2 stop-instances --instance-ids ${INSTANCE_ID}
echo "wait for the instance to stop"
aws ec2 wait instance-stopped --instance-ids ${INSTANCE_ID}
echo "Creating AMI"
OV_RAW_AMI_ID=$(aws ec2 create-image --instance-id ${INSTANCE_ID} --name OpenViduServerProASG-${OPENVIDU_PRO_VERSION}-dev-${DATESTAMP} --description "Openvidu Server Pro AWS ASG" --output text)
echo "Cleaning up"
aws cloudformation delete-stack --stack-name openvidu-${DATESTAMP}
echo "Create AMI with ID: ${OV_RAW_AMI_ID}"
# Wait for the instance
# Unfortunately, aws cli does not have a way to increase timeout
WAIT_RETRIES=0
WAIT_MAX_RETRIES=3
until [ "${WAIT_RETRIES}" -ge "${WAIT_MAX_RETRIES}" ]; do
aws ec2 wait image-available --image-ids ${OV_RAW_AMI_ID} && break
WAIT_RETRIES=$((WAIT_RETRIES + 1))
sleep 5
done
if [[ $CF_RELEASE == "true" ]]; then
aws ec2 modify-image-attribute --image-id ${OV_RAW_AMI_ID} --launch-permission "Add=[{Group=all}]"
aws ec2 describe-images --image-ids ${OV_RAW_AMI_ID} | jq -r '.Images[0].BlockDeviceMappings[0].Ebs.SnapshotId'
SNAPSHOT_ID=$(aws ec2 describe-images --image-ids ${OV_RAW_AMI_ID} | jq -r '.Images[0].BlockDeviceMappings[0].Ebs.SnapshotId')
aws ec2 modify-snapshot-attribute --snapshot-id ${SNAPSHOT_ID} --create-volume-permission "Add=[{Group=all}]"
fi
# Updating the template
if [[ "${USE_MASTER_DOCKER_IMAGES}" == "true" ]]; then
KMS_AMI_ID="$(aws ec2 describe-images --filters Name=image-type,Values=machine Name=is-public,Values=false \
--query 'Images[?starts_with(Name, `KMS-ov-master`) == `true`][CreationDate, Name, ImageId, Public]' \
--output text | sort -r -k1 | head -n1 | awk '{ print $3 }')"
fi
cd ..
sed "s/OV_MASTER_REPLICATION_AMI_ID/${OV_RAW_AMI_ID}/" CF-OpenVidu-Enterprise.yaml.template >CF-OpenVidu-Enterprise-dev-${OPENVIDU_PRO_VERSION}.yaml
sed -i "s/KMS_AMI_ID/${KMS_AMI_ID}/g" CF-OpenVidu-Enterprise-dev-${OPENVIDU_PRO_VERSION}.yaml
sed -i "s/AWS_DOCKER_TAG/${AWS_DOCKER_TAG}/g" CF-OpenVidu-Enterprise-dev-${OPENVIDU_PRO_VERSION}.yaml
# Update CF template
aws s3 cp CF-OpenVidu-Enterprise-dev-${OPENVIDU_PRO_VERSION}.yaml s3://aws.openvidu.io/CF-OpenVidu-Enterprise-dev-${OPENVIDU_PRO_VERSION}.yaml --acl public-read
cd dev
rm $TEMPJSON
mv cfn-crete-ov-aws-asg-ami.yaml CF-OpenVidu-Enterprise-AMI.yaml
aws s3api delete-object --bucket aws.openvidu.io --key cfn-crete-ov-aws-asg-ami.yaml

View File

@ -0,0 +1,169 @@
#!/bin/bash -x
set -eu -o pipefail
export AWS_DEFAULT_REGION=eu-west-1
fatal_error() {
printf "\n =======¡ERROR!======="
printf "\n %s" "$1"
printf "\n"
exit 1
}
TIMESTAMP=$(date +%s)
[[ -n "${DEPLOY_ELASTICSEARCH_AWS}" ]] || DEPLOY_ELASTICSEARCH_AWS=false
# Check all required variables
[[ -n "${OPENVIDU_LICENSE}" ]] || fatal_error "OPENVIDU_LICENSE must be defined"
[[ -n "${SSH_KEY_NAME}" ]] || fatal_error "SSH_KEY_NAME must be defined"
[[ -n "${VPC}" ]] || fatal_error "VPC must be defined"
[[ -n "${SUBNETS}" ]] || fatal_error "SUBNETS must be defined"
[[ -n "${LOAD_BALANCER_CERTIFICATE}" ]] || fatal_error "LOAD_BALANCER_CERTIFICATE must be defined"
[[ -n "${AWS_ACCOUNT_ID}" ]] || fatal_error "AWS_ACCOUNT_ID must be defined"
# Check variables with default values
[[ -n "${OPENVIDU_PRO_CLUSTER_ID:-}" ]] || OPENVIDU_PRO_CLUSTER_ID="ov-pro-multimaster-${TIMESTAMP}"
[[ -n "${OPENVIDU_SECRET:-}" ]] || OPENVIDU_SECRET="MY_SECRET"
[[ -n "${ELASTICSEARCH_USERNAME:-}" ]] || ELASTICSEARCH_USERNAME="elasticadmin"
[[ -n "${ELASTICSEARCH_PASSWORD:-}" ]] || ELASTICSEARCH_PASSWORD="My_Secret_123"
[[ -n "${MASTER_NODE_INSTANCE_TYPE:-}" ]] || MASTER_NODE_INSTANCE_TYPE="t2.large"
[[ -n "${MEDIA_NODE_INSTANCE_TYPE:-}" ]] || MEDIA_NODE_INSTANCE_TYPE="t2.large"
# Start elasticsearch
TEMP_JSON_ES_CONF=$(mktemp -t es-conf-XXX --suffix .json)
cat > "$TEMP_JSON_ES_CONF"<<EOF
{
"InstanceType": "t3.medium.elasticsearch",
"InstanceCount": 1,
"DedicatedMasterEnabled": false,
"ZoneAwarenessEnabled": false,
"WarmEnabled": false
}
EOF
TEMP_JSON_ES_EBS_OPT=$(mktemp -t es-ebs-XXX --suffix .json)
cat > "$TEMP_JSON_ES_EBS_OPT"<<EOF
{
"EBSEnabled": true,
"VolumeType": "gp2",
"VolumeSize": 10
}
EOF
TEMP_ACCESS_POLICY=$(mktemp -t es-acl-XXX --suffix .json)
cat > "$TEMP_ACCESS_POLICY"<<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "es:*",
"Resource": "${AWS_ACCOUNT_ID}:domain/ov-elasticsearch-${TIMESTAMP}/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": ["0.0.0.0/0", "::/0"]
}
}
}
]
}
EOF
TEMP_MASTER_USER=$(mktemp -t es-user-XXX --suffix .json)
cat > "$TEMP_MASTER_USER"<<EOF
{
"Enabled": true,
"InternalUserDatabaseEnabled": true,
"MasterUserOptions": {
"MasterUserName": "${ELASTICSEARCH_USERNAME}",
"MasterUserPassword": "${ELASTICSEARCH_PASSWORD}"
}
}
EOF
if [[ "${DEPLOY_ELASTICSEARCH_AWS}" == "true" ]] && [[ -z "${ELASTICSEARCH_HOST}" ]] && [[ -z "${KIBANA_HOST}" ]]; then
aws es create-elasticsearch-domain --domain-name "ov-elasticsearch-${TIMESTAMP}" \
--domain-endpoint-options EnforceHTTPS=true \
--elasticsearch-version 7.10 \
--elasticsearch-cluster-config file:///"${TEMP_JSON_ES_CONF}" \
--ebs-options file:///"${TEMP_JSON_ES_EBS_OPT}" \
--access-policies file:///"${TEMP_ACCESS_POLICY}" \
--advanced-security-options file://"${TEMP_MASTER_USER}" \
--node-to-node-encryption-options Enabled=true \
--encryption-at-rest-options Enabled=true
# Wait for elasticsearch
MAX_SECONDS_WAITING=2000
CURRENT_SECONDS=0
until [ "${CURRENT_SECONDS}" -ge "${MAX_SECONDS_WAITING}" ]
do
echo "Waiting for elasticsearch to be deployed..."
ELASTICSEARCH_ENDPOINT=$(aws es describe-elasticsearch-domain --domain-name "ov-elasticsearch-${TIMESTAMP}" | jq -r .DomainStatus.Endpoint)
if [[ "${ELASTICSEARCH_ENDPOINT}" != null ]]; then
break
fi
CURRENT_SECONDS=$((CURRENT_SECONDS+5))
sleep 5
done
if [[ "${ELASTICSEARCH_ENDPOINT}" == "null" ]]; then
fatal_error "Elasticsearch was not started correctly"
else
ELASTICSEARCH_HOST="https://${ELASTICSEARCH_ENDPOINT}:443"
KIBANA_HOST="https://${ELASTICSEARCH_ENDPOINT}:443/_plugin/kibana/"
fi
fi
TEMPJSON=$(mktemp -t cloudformation-XXX --suffix .json)
cat > "$TEMPJSON"<<EOF
[
{"ParameterKey":"DomainName","ParameterValue":"${DOMAIN_NAME}"},
{"ParameterKey":"KeyName","ParameterValue":"${SSH_KEY_NAME}"},
{"ParameterKey":"OpenViduLicense","ParameterValue":"${OPENVIDU_LICENSE}"},
{"ParameterKey":"OpenViduSecret","ParameterValue":"${OPENVIDU_SECRET}"},
{"ParameterKey":"MediaServer","ParameterValue":"mediasoup"},
{"ParameterKey":"OpenViduProClusterId","ParameterValue":"${OPENVIDU_PRO_CLUSTER_ID}"},
{"ParameterKey":"ElasticsearchUrl","ParameterValue":"${ELASTICSEARCH_HOST}"},
{"ParameterKey":"KibanaUrl","ParameterValue":"${KIBANA_HOST}"},
{"ParameterKey":"ElasticsearchUser","ParameterValue":"${ELASTICSEARCH_USERNAME}"},
{"ParameterKey":"ElasticsearchPassword","ParameterValue":"${ELASTICSEARCH_PASSWORD}"},
{"ParameterKey":"LoadBalancerCertificateARN","ParameterValue":"${LOAD_BALANCER_CERTIFICATE}"},
{"ParameterKey":"AwsInstanceTypeOV","ParameterValue":"${MASTER_NODE_INSTANCE_TYPE}"},
{"ParameterKey":"AwsInstanceTypeKMS","ParameterValue":"${MEDIA_NODE_INSTANCE_TYPE}"},
{"ParameterKey":"OpenViduVPC","ParameterValue":"${VPC}"},
{"ParameterKey":"OpenViduSubnets","ParameterValue":"${SUBNETS}"}
]
EOF
cat "$TEMPJSON"
KMS_AMI_ID="$(aws ec2 describe-images --filters Name=image-type,Values=machine Name=is-public,Values=false \
--query 'Images[?starts_with(Name, `KMS-ov-master`) == `true`][CreationDate, Name, ImageId, Public]' \
--output text | sort -r -k1 | head -n1 | awk '{ print $3 }')"
OV_AMI_ID="$(aws ec2 describe-images --filters Name=image-type,Values=machine Name=is-public,Values=false \
--query 'Images[?starts_with(Name, `OpenViduServerProASG-master-dev`) == `true`][CreationDate, Name, ImageId, Public]' \
--output text | sort -r -k1 | head -n1 | awk '{ print $3 }')"
sed -i "s/KMS_AMI_ID/${KMS_AMI_ID}/g" CF-OpenVidu-Enterprise-dev-master.yaml
sed -i "s/OV_MASTER_REPLICATION_AMI_ID/${OV_AMI_ID}/g" CF-OpenVidu-Enterprise-dev-master.yaml
CF_FILE="https://s3-eu-west-1.amazonaws.com/aws.openvidu.io/CF-OpenVidu-Enterprise-dev-master.yaml"
aws s3 cp CF-OpenVidu-Enterprise-dev-master.yaml s3://aws.openvidu.io --acl public-read
echo "Starting Multimaster cloudformation"
aws cloudformation create-stack \
--template-url "${CF_FILE}" \
--stack-name "${OPENVIDU_PRO_CLUSTER_ID}" \
--parameters file:///"${TEMPJSON}" \
--disable-rollback \
--capabilities CAPABILITY_IAM \
--capabilities CAPABILITY_NAMED_IAM
aws cloudformation wait stack-create-complete --stack-name "${OPENVIDU_PRO_CLUSTER_ID}"

View File

@ -0,0 +1,18 @@
#!/bin/bash
fatal_error() {
printf "\n =======¡ERROR!======="
printf "\n %s" "$1"
printf "\n"
exit 1
}
QUEUE_URL=$1
[[ -n ${QUEUE_URL} ]] || fatal_error "No queue url specified. You need to specify a SQS queue URL as first parameter"
while true; do
TIMESTAMP=$(date +%s)
aws sqs send-message \
--queue-url "${QUEUE_URL}" \
--message-body "{\"source\":\"custom.test\",\"id\":\"$TIMESTAMP\"}" \
--message-group-id "test"
sleep 0.5
done

View File

@ -56,15 +56,15 @@ new_ov_installation() {
# Download necessary files
printf '\n => Downloading OpenVidu Pro files:'
curl --silent ${DOWNLOAD_URL}/openvidu-server/deployments/enterprise/master-node/cluster/aws/openvidu_autodiscover.sh \
curl --silent ${DOWNLOAD_URL}/openvidu-server/deployments/enterprise/docker-compose/cluster/aws/openvidu_autodiscover.sh \
--output "${AWS_SCRIPTS_FOLDER}/openvidu_autodiscover.sh" || fatal_error "Error when downloading the file 'openvidu_autodiscover.sh'"
printf '\n - openvidu_autodiscover.sh'
curl --silent ${DOWNLOAD_URL}/openvidu-server/deployments/enterprise/master-node/cluster/aws/openvidu_drop.sh \
curl --silent ${DOWNLOAD_URL}/openvidu-server/deployments/enterprise/docker-compose/cluster/aws/openvidu_drop.sh \
--output "${AWS_SCRIPTS_FOLDER}/openvidu_drop.sh" || fatal_error "Error when downloading the file 'openvidu_drop.sh'"
printf '\n - openvidu_drop.sh'
curl --silent ${DOWNLOAD_URL}/openvidu-server/deployments/enterprise/master-node/cluster/aws/openvidu_launch_kms.sh \
curl --silent ${DOWNLOAD_URL}/openvidu-server/deployments/enterprise/docker-compose/cluster/aws/openvidu_launch_kms.sh \
--output "${AWS_SCRIPTS_FOLDER}/openvidu_launch_kms.sh" || fatal_error "Error when downloading the file 'openvidu_launch_kms.sh'"
printf '\n - openvidu_launch_kms.sh'