ハンズオン(簡易版): IAM基礎(インスタンスプロファイル)

3.2. ユーザーデータファイルの作成 (handson-cli-iam-instance-profile-userdata)

手順の目的

ユーザーデータ名"handson-cli-iam-instance-profile-userdata"のファイルを作成します。

設定値の指定

設定値の指定

手順に必要な設定値を変数に格納をします。

1. ユーザーデータ用ディレクトリの指定

ユーザーデータ用ディレクトリを指定します。

変数の設定:

DIR_USER_DATA="${HOME}/environment/conf-handson-cli-iam-instance-profile"

ディレクトリが存在することを確認し、存在しない場合は作成します。

コマンド:

ls -d ${DIR_USER_DATA} > /dev/null 2>&1 \
  || mkdir -p ${DIR_USER_DATA}

結果(例):

(出力なし)

2. ユーザーデータファイル名の指定

ユーザーデータファイル名を指定します。

変数の設定:

USER_DATA_NAME='handson-cli-iam-instance-profile-userdata'

変数の設定:

FILE_USER_DATA="${DIR_USER_DATA}/${USER_DATA_NAME}.bash" \
  && echo ${FILE_USER_DATA}

結果(例):

${HOME}/environment/conf-handson-cli-iam-instance-profile/handson-cli-iam-instance-profile-userdata.bash

設定値の確認

各変数に正しい設定値が格納されていることを確認します。

変数の確認:

cat << END

  # 1. DIR_USER_DATA:"${HOME}/environment/conf-handson-cli-iam-instance-profile"
       DIR_USER_DATA="${DIR_USER_DATA}"
  # 2. FILE_USER_DATA:"${HOME}/environment/conf-handson-cli-iam-instance-profile/handson-cli-iam-instance-profile-userdata.bash"
       FILE_USER_DATA="${FILE_USER_DATA}"

END

各変数について、上の行と下の行の値の内容もしくは形式が同じであることを確認します。 もし異なる場合は、それぞれの手順番号に戻って変数の設定を行います。

処理の実行

ユーザーデータファイルの作成

ユーザーデータファイルを作成します。

コマンド:

cat << EOF1 > ${FILE_USER_DATA}
#!/bin/bash

EC2_METADATA_SECOND='900'

GIT_REPOSITORY_ORIGIN='https://github.com/opelab/jawsug-cli-sample-web.git'
GIT_REPOSITORY_NAME='jawsug-cli-sample-web'

yum -y update

EC2_METADATA_TOKEN=\$( \\
  curl -s \\
    -X PUT "http://169.254.169.254/latest/api/token" \\
    -H "X-aws-ec2-metadata-token-ttl-seconds: \${EC2_METADATA_SECOND}" \\
)
EC2_METADATA_HEADER="X-aws-ec2-metadata-token: \${EC2_METADATA_TOKEN}"

EC2_REGION_NAME=\$( \\
  curl -s -H "\${EC2_METADATA_HEADER}" \\
    http://169.254.169.254/latest/meta-data/placement/availability-zone \\
  | sed -e 's/[a-z]*$//' \\
)

# install cloudwatch agent
URL_DOWNLOAD_LINK="https://s3.\${EC2_REGION_NAME}.amazonaws.com/amazoncloudwatch-agent-\${EC2_REGION_NAME}/amazon_linux/amd64/latest/amazon-cloudwatch-agent.rpm"

cd /tmp/
wget \${URL_DOWNLOAD_LINK}
rpm -U ./amazon-cloudwatch-agent.rpm

# setup cloudwatch agent
LOGS_CONF='/opt/aws/amazon-cloudwatch-agent/etc/logs.conf'

# logs.conf
cat << EOF > \${LOGS_CONF}
{
  "logs": {
    "logs_collected": {
      "files": {
        "collect_list": [
          {
            "file_path": "/var/log/httpd/access_log*",
            "log_group_name": "httpd/access_log",
            "log_stream_name": "{instance_id}",
            "timezone": "Local"
          }
        ]
      }
    }
  }
}
EOF

# start cloudwatch agent
/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl \\
  -a fetch-config \\
  -m ec2 \\
  -c file:\${LOGS_CONF} \\
  -s


# setup httpd
yum install -y httpd
systemctl start httpd.service
systemctl enable httpd.service

# get contents
yum -y install git

cd /tmp/ \\
  && git clone \${GIT_REPOSITORY_ORIGIN}

# setup contents
cp /tmp/\${GIT_REPOSITORY_NAME}/* /var/www/html/
EOF1

cat ${FILE_USER_DATA}

結果(例):

#!/bin/bash

EC2_METADATA_SECOND='900'

GIT_REPOSITORY_ORIGIN='https://github.com/opelab/jawsug-cli-sample-web.git'
GIT_REPOSITORY_NAME='jawsug-cli-sample-web'

yum -y update

EC2_METADATA_TOKEN=$( \
  curl -s \
    -X PUT "http://169.254.169.254/latest/api/token" \
    -H "X-aws-ec2-metadata-token-ttl-seconds: ${EC2_METADATA_SECOND}" \
)
EC2_METADATA_HEADER="X-aws-ec2-metadata-token: ${EC2_METADATA_TOKEN}"

EC2_REGION_NAME=$( \
  curl -s -H "${EC2_METADATA_HEADER}" \
    http://169.254.169.254/latest/meta-data/placement/availability-zone \
  | sed -e 's/[a-z]*$//' \
)

# install cloudwatch agent
URL_DOWNLOAD_LINK="https://s3.${EC2_REGION_NAME}.amazonaws.com/amazoncloudwatch-agent-${EC2_REGION_NAME}/amazon_linux/amd64/latest/amazon-cloudwatch-agent.rpm"

cd /tmp/
wget ${URL_DOWNLOAD_LINK}
rpm -U ./amazon-cloudwatch-agent.rpm

# setup cloudwatch agent
LOGS_CONF='/opt/aws/amazon-cloudwatch-agent/etc/logs.conf'

# logs.conf
cat << EOF > ${LOGS_CONF}
{
  "logs": {
    "logs_collected": {
      "files": {
        "collect_list": [
          {
            "file_path": "/var/log/httpd/access_log*",
            "log_group_name": "httpd/access_log",
            "log_stream_name": "{instance_id}",
            "timezone": "Local"
          }
        ]
      }
    }
  }
}
EOF

# start cloudwatch agent
/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl \
  -a fetch-config \
  -m ec2 \
  -c file:${LOGS_CONF} \
  -s


# setup httpd
yum install -y httpd
systemctl start httpd.service
systemctl enable httpd.service

# get contents
yum -y install git

cd /tmp/ \
  && git clone ${GIT_REPOSITORY_ORIGIN}

# setup contents
cp /tmp/${GIT_REPOSITORY_NAME}/* /var/www/html/

完了確認

「ユーザーデータファイル名"${HOME}/environment/conf-handson-cli-iam-instance-profile/handson-cli-iam-instance-profile-userdata.bash"が存在する。」ことを確認します。

コマンド:

ls ${FILE_USER_DATA}

結果(例):

${HOME}/environment/conf-handson-cli-iam-instance-profile/handson-cli-iam-instance-profile-userdata.bash

手順の完了