[JAWS-UG CLI]Directory Service:#32-2 ディレクトリの作成（Simple-AD）、スナップショットの取得

# このハンズオンについて

- このハンズオンでは、Directory Serviceで作成したディレクトリのユーザでManagement Consoleにログインするまでの作業を実施します。
- 今回のハンズオンでは、AD-Connectorは対象外とします。
- 一部の操作はManagement Consoleで実施します。
- Macをお使いの方は、Windows Serverでリモートデスクトップ接続が出来るアプリをご用意ください。
- Windows Serverをドメインに参加させるため、SSMを使用します。SSMが利用可能なリージョンを利用してください。この手順ではオレゴンを利用します。

# 前提条件

- この手順は、全部で5つの投稿から構成されており、本投稿は以下の投稿の内容を実施していることが前提となります。途中から実施した場合、変数が空欄のためにコマンドの実行に失敗する場合があります。

  - [[JAWS-UG CLI]Directory Service:#32-1 VPCおよびユーザ管理用インスタンスの作成](http://qiita.com/domokun70cm/items/38ffd040b805e2928d62)

## バージョン確認

このハンズオンは以下のバージョンで動作確認を行いました。

```bash:コマンド
aws --version
```

```text:結果
aws-cli/1.9.5 Python/2.7.10 Linux/4.1.10-17.31.amzn1.x86_64 botocore/1.3.5
```

## 必要な権限

作業にあたっては、以下の権限を有したIAMユーザもしくはIAMロールを利用してください。

- EC2に対するフルコントロール権限
- Directory Serviceに関するフルコントロール権限
- IAMに関するフルコントロール権限
- SSMに関するフルコントロール権限


# 0. 準備

## リージョンを指定

```bash:コマンド
export AWS_DEFAULT_REGION='us-west-2'
```

## 資格情報を確認

```bash:コマンド
aws configure list
```

```text:結果
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************PZ4A         iam-role
secret_key     ****************AZ55         iam-role
    region                us-west-2              env    AWS_DEFAULT_REGION
```

## 変数の確認

```bash:コマンド
cat << ETX

    DS_VPC: "${VPC_ID}"
    DS_SUBNET1: "${SUBNET_A_ID}"
    DS_SUBNET2: "${SUBNET_A_ID}"

ETX
```

```text:結果
    DS_VPC: "vpc-********"
    DS_SUBNET1: "subnet-********"
    DS_SUBNET2: "subnet-********"
```

# 1. ディレクトリの作成

## ドメイン名を指定

```bash:コマンド
DS_NAME="jawsug.local"
echo ${DS_NAME}
```

## パスワードを指定
（パスワードらしいパスワードを設定してください）
[強度の高いパスワードを設定することの重要性はこちら](https://www.ipa.go.jp/security/keihatsu/munekyun-pw/)

```bash:コマンド
DS_PASSWORD="Passw0rd"
echo ${DS_PASSWORD}
```

## ディレクトリのサイズを指定

```bash:コマンド
DS_SIZE="Small"
echo ${DS_SIZE}
```

## パラメータを確認

```bash:コマンド
cat << ETX

    DS_VPC: "${VPC_ID}"
    DS_SUBNET1: "${SUBNET_A_ID}"
    DS_SUBNET2: "${SUBNET_A_ID}"
    DS_NAME: "${DS_NAME}"
    DS_PASSWORD: "${DS_PASSWORD}"
    DS_SIZE: "${DS_SIZE}"

ETX
```

```text:結果
    DS_VPC: "vpc-********"
    DS_SUBNET1: "subnet-********"
    DS_SUBNET2: "subnet-********"
    DS_NAME: "jawsug.local"
    DS_PASSWORD: "Passw0rd"
    DS_SIZE: "Small"
```

## ディレクトリの構築先のVPCを指定

```bash:コマンド
VPCSETTINGS_FILE='VPC_Settings.json'
```

```bash:コマンド
cat << EOF > ${VPCSETTINGS_FILE}
{
  "VpcId": "${VPC_ID}",
  "SubnetIds": ["${SUBNET_A_ID}", "${SUBNET_C_ID}"]
}
EOF
cat "${VPCSETTINGS_FILE}"
```

```json:結果
{
  "VpcId": "vpc-********",
  "SubnetIds": ["subnet-********", "subnet-********"]
}
```

JSONファイルを検証

```bash:コマンド
jsonlint -q ${VPCSETTINGS_FILE}
```

## ディレクトリを作成

```bash:コマンド
aws ds create-directory --name "${DS_NAME}" --password "${DS_PASSWORD}" --size "${DS_SIZE}" --vpc-settings file://${VPCSETTINGS_FILE}
```

```json:結果
{
    "DirectoryId": "d-**********"
}
```

```bash:コマンド
DS_ID=`aws ds describe-directories | jq -r ".DirectoryDescriptions | .[] | .DirectoryId"` && echo ${DS_ID}
```

```text:結果
ds-**********
```

## ディレクトリの詳細を確認

Activeになるまで数分かかります。
気長に待ちましょう( ´_ﾉ`)ｙ━~~

```bash:コマンド
DS_STAGE=$( \
  aws ds describe-directories \
    --query "DirectoryDescriptions[?Name==\`${DS_NAME}\`].Stage" \
    --output text \
) \
  && echo ${DS_STAGE}
```

```text:結果
Active
```

## ディレクトリ数の確認

```bash:コマンド
aws ds get-directory-limits
```

```json:結果
{
    "DirectoryLimits": {
        "ConnectedDirectoriesLimitReached": false,
        "CloudOnlyDirectoriesLimit": 10,
        "ConnectedDirectoriesCurrentCount": 0,
        "CloudOnlyDirectoriesCurrentCount": 1,
        "ConnectedDirectoriesLimit": 10,
        "CloudOnlyDirectoriesLimitReached": false
    }
}
```

# 2. スナップショットの確認

## スナップショットの確認

```bash:コマンド
aws ds describe-snapshots --directory-id ${DS_ID}
```

```json:結果
{
    "Snapshots": []
}
```

## スナップショットの取得
ディレクトリの作成中はスナップショットを作成できません。
数分お待ちください。

```bash:コマンド
aws ds create-snapshot --directory-id ${DS_ID}
```

```json:結果
{
    "SnapshotId": "s-**********"
}
```

## スナップショットの確認

```bash:コマンド
aws ds describe-snapshots --directory-id ${DS_ID}
```

```json:結果
{
    "Snapshots": [
        {
            "Status": "Completed",
            "DirectoryId": "d-**********",
            "Type": "Manual",
            "StartTime": 1444552262.026,
            "SnapshotId": "s-**********"
        }
    ]
}
```

## スナップショット数の確認

```bash:コマンド
aws ds get-snapshot-limits --directory-id ${DS_ID}
```


```json:結果
{
    "SnapshotLimits": {
        "ManualSnapshotsCurrentCount": 1,
        "ManualSnapshotsLimit": 5,
        "ManualSnapshotsLimitReached": false
    }
}
```

# 3. DHCPオプションの作成

管理用のインスタンスがドメインに参加する際、名前解決が必要となるためDHCPでDNSサーバが自動で設定されるようにします。

## DNSサーバのIPアドレスを取得

```bash:コマンド
DNS_IP1=`aws ds describe-directories --directory-ids ${DS_ID} | jq -r ".[] | .[].DnsIpAddrs | .[]" | sed -n '1,1p'`
DNS_IP2=`aws ds describe-directories --directory-ids ${DS_ID} | jq -r ".[] | .[].DnsIpAddrs | .[]" | sed -n '2,2p'`

echo ${DNS_IP1}
echo ${DNS_IP2}
```

## DHCPオプションを作成

```bash:コマンド
DHCPOPTIONS_FILE='DHCP_Options.json'
```

```bash:コマンド
cat << EOF > ${DHCPOPTIONS_FILE}
[
  {
    "Key": "domain-name",
    "Values": ["${DS_NAME}"]
  },
  {
    "Key": "domain-name-servers",
    "Values": ["${DNS_IP1}", "${DNS_IP2}"]
  }
]
EOF
cat "${DHCPOPTIONS_FILE}"
```

```json:結果
[
  {
    "Key": "domain-name",
    "Values": ["jawsug.local"]
  },
  {
    "Key": "domain-name-servers",
    "Values": ["10.0.0.150", "10.0.1.216"]
  }
]
```

JSONファイルを検証

```bash:コマンド
jsonlint -q ${DHCPOPTIONS_FILE}
```

```bash:コマンド
DHCP_ID=`aws ec2 create-dhcp-options --dhcp-configuration file://${DHCPOPTIONS_FILE} | jq -r .DhcpOptions.DhcpOptionsId` && echo ${DHCP_ID}
```

## 作成されたDHCPオプションを確認

```bash:コマンド
aws ec2 describe-dhcp-options --dhcp-options-ids ${DHCP_ID}
```

```json:結果
{
    "DhcpOptions": [
        {
            "DhcpConfigurations": [
                {
                    "Values": [
                        {
                            "Value": "jawsug.local"
                        }
                    ],
                    "Key": "domain-name"
                },
                {
                    "Values": [
                        {
                            "Value": "10.0.0.150"
                        },
                        {
                            "Value": "10.0.1.216"
                        }
                    ],
                    "Key": "domain-name-servers"
                }
            ],
            "DhcpOptionsId": "dopt-********"
        }
    ]
}
```

VPCにDHCPオプションを関連づけます

## VPCの状態を確認

```bash:コマンド
aws ec2 describe-vpcs --vpc-ids ${VPC_ID}
```

```json:結果
{
    "Vpcs": [
        {
            "VpcId": "vpc-********",
            "InstanceTenancy": "default",
            "Tags": [
                {
                    "Value": "jawsug-cli",
                    "Key": "Name"
                }
            ],
            "State": "available",
            "DhcpOptionsId": "dopt-********",
            "CidrBlock": "10.0.0.0/16",
            "IsDefault": false
        }
    ]
}
```

## DHCPオプションをVPCに関連づける

```bash:コマンド
aws ec2 associate-dhcp-options --dhcp-options-id ${DHCP_ID} --vpc-id ${VPC_ID}
```

```text:結果
（返値無し）
```

## DHCPオプションがVPCに関連づけられたことを確認

```bash:コマンド
aws ec2 describe-vpcs --vpc-ids ${VPC_ID}
```

```
{
    "Vpcs": [
        {
            "VpcId": "vpc-********",
            "InstanceTenancy": "default",
            "State": "available",
            "DhcpOptionsId": "dopt-********",
            "CidrBlock": "10.0.0.0/16",
            "IsDefault": false
        }
    ]
}
```

以上です。