Last active
August 24, 2016 14:36
-
-
Save mwkorver/1ef45abac3871360f2b1 to your computer and use it in GitHub Desktop.
EC2 user data script to deploy MapServer container mounting USDA NAIP data (about 100TB) in aws-naip bucket.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#cloud-boothook | |
#!/bin/bash | |
set -x | |
# This EC2 user-data file will run a Mapserver docker container. | |
# Still working on getting it to reboot properly. See this link for more info on user-data scripts | |
# http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html#user-data-shell-scripts | |
# Because this setup uses data stored in an S3 bucket located in the standard region, it needs to be run in us-east-1 (Virginia Region). | |
# It mounts S3 data by using danilop/yas3fs. USDA CONUS NAIP data, Mapfile and shapefile indexes are made available to Mapserver in this way. | |
# Just running this instance will give you access to all of the NAIP data via the EC2 instance's filesystem. | |
# One caveat is that the combination of mapfile and UTM projected geotifs only supports WMS requests near native 1m/pixel resolution or level 17, | |
# meaning it gets slow at level 15. | |
# For the container to work, you need to run this using an EC2 type that includes ephemeral storage. Local SSDs. It works with m3.medium, | |
# but something larger such as c3.2xlarge is better. | |
exec > >(tee /var/log/user-data.log|logger -t user-data -s 2>/dev/console) 2>&1 | |
# fix for "unable to resolve host" error even when dns hostnames/resolution are turned on for VPC | |
echo "127.0.0.1 $(hostname)" >> /etc/hosts | |
function mountbucket { | |
echo "Running Yas3fs" | |
# use yas3fs to mount s3 buckets | |
# first one is CONUS NAIP in experimental Amazon S3 bucket named AWS. The bucket is marked 'requester pays' | |
yas3fs --mkdir --requester-pays --no-metadata --cache-check=100 --cache-path=/mnt/cache/naip --cache-disk-size 102400 --download-num=16 s3://aws-naip /data/naip | |
# second bucket has mapfiles and shapefile indexes to RGB files in aws-naip | |
yas3fs --mkdir --no-metadata --cache-check=100 --cache-path=/mnt/cache/map --cache-disk-size 102400 s3://aws-naip-config /data/map | |
} | |
if [ -x "$(command -v docker)" ] | |
then | |
echo "Already ran" | |
# Use yas3fs to mount S3 buckets | |
mountbucket | |
else | |
echo "Running first time install scripts." | |
apt-get update -y | |
DEBIAN_FRONTEND=noninteractive | |
apt-get install -y fuse python-pip linux-image-extra-$(uname -r) | |
pip install yas3fs # assume root installation | |
# fuse config | |
sed -i'' 's/^# *user_allow_other/user_allow_other/' /etc/fuse.conf | |
chmod a+r /etc/fuse.conf | |
# use yas3fs to mount S3 buckets | |
mountbucket | |
# install docker | |
modprobe aufs | |
#curl -sSL https://get.docker.com/ | sh | |
wget -O docker.deb https://apt.dockerproject.org/repo/pool/main/d/docker-engine/docker-engine_1.9.1-0~trusty_amd64.deb | |
dpkg -i docker.deb | |
# run mwkorver/docker-mapserver7 image from docker hub | |
docker run --detach --publish 80:8080 --restart="always" -v /data/naip:/data/naip:ro -v /data/map:/data/map --name mapserver mwkorver/mapserver7 | |
# log file setup in the now running mapserver container | |
# the location of the log file is dependent on what you specify in your map file. | |
# looks like - CONFIG "MS_ERRORFILE" "/var/log/ms_error.log" in map file | |
docker exec mapserver touch /var/log/ms_error.log | |
docker exec mapserver chown www-data /var/log/ms_error.log | |
docker exec mapserver chmod 644 /var/log/ms_error.log | |
fi |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment