Here is my solution to run the GUI on Amazon AMI. I used this post as a starting point, but I had to make a lot of changes to make it work on Amazon AMI. I also added additional information to make this work automated enough so that a person who needs to repeatedly raise this environment can do it without much hassle.
Note: I include a lot of comments in this post. I apologize in advance, but I thought it might be useful for those who need to make changes if they can understand why various choices were made along the way.
, , . . 4 , .
1.
"-"
sudo yum groupinstall -y "Desktop"
Amazon AMI. Amazon AMI ( AAMI). AAMI Amazon, . epel, . epel Desktop, . Xfce ( ), . Xfce, Desktop. , , .
, , , centos Desktop. . . , , AAMI, .
Xfce Epel. epel AAMI, , Amazon. . epel, Amazon. , , Centos, . , - Centos, , Amazon Epel. , . . Xfce
installGui.sh
set -x
YUM_RSRC_DIR=$RSRC_DIR/yum
sudo yum -y update
sudo yum-config-manager --enable epel
sudo cp $YUM_RSRC_DIR/yum.repos.d/centos.repo /etc/yum.repos.d/
sudo yum --enablerepo centos install -y gdk-pixbuf2.x86_64
sudo yum --enablerepo centos install -y gtk2.x86_64
sudo yum --enablerepo centos install -y libnotify.x86_64
sudo yum --enablerepo centos install -y gnome-icon-theme
sudo yum --enablerepo centos install -y redhat-menus
sudo yum --enablerepo centos install -y gstreamer-plugins-base.x86_64
sudo yum install -y python
sudo yum --enablerepo centos install -y vte.x86_64
sudo yum --enablerepo centos install -y libical.x86_64
sudo yum --enablerepo centos install -y gnome-keyring.x86_64
sudo yum erase -y generic-logos
sudo yum --disablerepo amzn-main --enablerepo centos install -y redhat-logos
yumdownloader --enablerepo centos dbus-x11.x86_64
sudo rpm -ivh --nodeps dbus-x11-1.2.24-8.el6_6.x86_64.rpm
rm dbus-x11-1.2.24-8.el6_6.x86_64.rpm
sudo yum install -y xfdesktop.x86_64
if [ $IS_EMR -eq 1 ]
then
yumdownloader --enablerepo centos tumbler.x86_64
sudo rpm -ivh --nodeps tumbler-0.1.21-1.el6.x86_64.rpm
else
sudo yum --disablerepo amzn-main --disablerepo amzn-updates --disablerepo epel --enablerepo centos install -y poppler-glib
fi
sudo yum install --enablerepo centos -y polkit-gnome.x86_64
sudo yum install --enablerepo centos -y control-center-filesystem.x86_64
sudo yum groupinstall -y Xfce
centos:
centos.repo
[centos]
name=CentOS mirror
baseurl=http://repo1.ash.innoscale.net/centos/6/os/x86_64/
failovermethod=priority
enabled=0
gpgcheck=1
gpgkey=https://www.centos.org/keys/RPM-GPG-KEY-CentOS-6
Amazon AMI, . , VNC SSH , .
2. VNC
. , - 1 . , ec2, emr, root, ec2.
- libXfont
- tiger-vnc-
- VNC
- .vnc
- xstartup .vnc
- passwd .vnc
- VNC
, :
, VNC SSH. , . , , SSH, - . , / VNC . , . vncservers. -localhost vnc . "-nolisten tcp" xserver . , [-SecurityTypes None " VNC , - ssh, .
xstartup , , VNC . , . Xfce, VNC. .
, , VNC , , passwd .vnc . . ssh vncpasswd. passwd .vnc, . , , VNC passwd. , , .
installGui.sh
#!/bin/bash
set -x
BIN_DIR="${BASH_SOURCE%/*}"
ROOT_DIR=$(dirname $BIN_DIR)
RSRC_DIR=$ROOT_DIR/rsrc
VNC_DIR=$RSRC_DIR/vnc
if [ -d "/home/ec2-user" ]
then
USER_ACCT=ec2-user
else
USER_ACCT=hadoop
fi
HOME_DIR="/home"
if [ -d "/home/hadoop" ]
then
IS_EMR=1
else
IS_EMR=0
fi
. "$BIN_DIR/installXfce.sh"
sudo yum install -y pixman pixman-devel libXfont
sudo yum -y install tigervnc-server
sudo cp $VNC_DIR/vncservers-$USER_ACCT /etc/sysconfig/vncservers
sudo mkdir $HOME_DIR/$USER_ACCT/.vnc
sudo chown $USER_ACCT:$USER_ACCT $HOME_DIR/$USER_ACCT/.vnc
sudo cp $VNC_DIR/xstartup $HOME_DIR/$USER_ACCT/.vnc/
sudo chown $USER_ACCT:$USER_ACCT $HOME_DIR/$USER_ACCT/.vnc/xstartup
sudo cp $ROOT_DIR/home/user/.vnc/passwd $HOME_DIR/$USER_ACCT/.vnc/
sudo chown $USER_ACCT:$USER_ACCT $HOME_DIR/$USER_ACCT/.vnc/passwd
sudo su -c "sudo service vncserver start" -s /bin/sh $USER_ACCT
vncservers
VNCSERVERS="1:ec2-user"
VNCSERVERARGS[1]="-geometry 1280x1024 -nolisten tcp -localhost -SecurityTypes None"
XStartup
#!/bin/sh
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
/usr/share/vte/termcap/xterm &
/usr/bin/startxfce4 &
3.
, VNC- EC2, . SSH . 5901 - , VNC 1 vncservers. 2 5902 .. 5901 5901 .
ssh -i ~/.ssh/<YOUR_KEY_FILE>.pem -L 5901:localhost:5901 -N ec2-user@<YOUR_SERVER_PUBLIC_IP>
VNC. , IP- , :
: 5901
, vnc, , , , , vncservers
, , , Xfce xstartup.
4.
, sftp'ing- - . , , .
EFS, , . Amazon . , . , , , EFS. EFS ( NFS_Mount), TCP- 2049, , MasterVNC. , , MasterVNC . EFS .
EFS:
sudo mkdir /mnt/YOUR_MOUNT_POINT_DIR
sudo mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 fs-YOUR_EFS_ID.efs.us-east-1.amazonaws.com:/ /mnt/YOUR_MOUNT_POINT_DIR
/mnt/YOUR_MOUNT_POINT_DIR 6 , 1 2, . , passwd , vncpasswd. ~/.vnc/passwd.
/mnt/YOUR_MOUNT_POINT_DIR/bin/installGui.sh/mnt/YOUR_MOUNT_POINT_DIR/bin/installXfce.sh
/mnt/YOUR_MOUNT_POINT_DIR/rsrc/vnc/vncservers-ec2-user/mnt/YOUR_MOUNT_POINT_DIR/rsrc/vnc/xstartup/mnt/YOUR_MOUNT_POINT_DIR/rsrw/vnc
/mnt/YOUR_MOUNT_POINT_DIR/rsrc/yum/yum.repos.d/centos.repo
. , ( MasterVNC), ssh , EFS installGui.sh.
5.
1 , CLI AWS . EFS installGui.sh, AWS CLI. CLI.
, . EC2 EMR . , , EMR , ( ).
EC2 --user-data. , .
aws ec2 run-instances --user-data file:///PATH_TO_YOUR_SCRIPT/top.sh ... other options
EMR . S3 URI .
aws emr create-cluster --bootstrap-actions '[{"Path":"s3://YOUR_BUCKET/YOUR_DIR/top.sh","Name":"Custom action"}]' ... other options
, top.sh , - , , EC2 EMR. , 3 . , "run-if" . run-if , S3.
. , , - : /var/log/cloud-init-output.log. , .
top.sh
#!/bin/bash
check_if_master_or_non_emr() {
python - <<'__SCRIPT__'
import sys
import json
instance_file = "/mnt/var/lib/info/instance.json"
try:
with open(instance_file) as f:
props = json.load(f)
is_master_or_non_emr = props.get('isMaster', False)
except IOError as ex:
is_master_or_non_emr = True
if is_master_or_non_emr:
sys.exit(1)
else:
sys.exit(0)
__SCRIPT__
}
check_if_master_or_non_emr
IS_MASTER_OR_NON_EMR=$?
if [ $IS_MASTER_OR_NON_EMR -eq 1 ]
then
sudo mkdir /mnt/YOUR_MOUNT_POINT_DIR
sudo mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 fs-YOUR_EFS_ID.efs.us-east-1.amazonaws.com:/ /mnt/YOUR_MOUNT_POINT_DIR
. /mnt/YOUR_MOUNT_POINT_DIR/bin/installGui.sh
fi
exit 0