[JAWS-UG CLI] SQS:#1 キューの作成


AWS CLIを利用して、SQSのキューを作成し、キューを利用するために必要なそのURLを取得してみます。


前提条件
========


SQSへの権限
-----------

SQSに対してフル権限があること。


AWS CLIのバージョン
-------------------

以下のバージョンで動作確認済

* AWS CLI 1.10.6
* AWS CLI 1.6.10

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

```text:結果(例):
aws-cli/1.9.20 Python/2.7.5 Darwin/13.4.0 botocore/1.3.20
```


0. 準備
=======


0.1. リージョンの決定
---------------------

利用するリージョンを決めます。 (カレントユーザが利用するカレントリージョンも切り変わります。)

```bash:変数の設定(東京リージョンの場合):
export AWS_DEFAULT_REGION='ap-northeast-1'
```


0.2. 変数の確認
---------------

プロファイルが想定のものになっていることを確認します。

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

```text:結果(例)
            Name                    Value             Type    Location
            ----                    -----             ----    --------
         profile         sqs-prjz-mbp13        env    AWS_DEFAULT_PROFILE
      access_key     ****************XXXX shared-credentials-file
      secret_key     ****************XXXX shared-credentials-file
          region                         ap-northeast-1  env    AWS_DEFAULT_REGION
```


1. 事前作業
===========

キュー名の決定
--------------

作成するキューの名前を決めます。

```bash:変数の設定:
SQS_QUEUE_NAME=$(date +%Y%m%d)-handson-queue \
  && echo ${SQS_QUEUE_NAME}
```

そのリージョンでユニークである必要があります。

同名キューの確認

すでに同じ名前のキューが存在しないことを確認します。

```bash:コマンド:
aws sqs list-queues \
        --queue-name-prefix ${SQS_QUEUE_NAME}
```

```text:結果(例):
      (戻り値なし)
```





2. キューの作成
===============


2.1. キューの作成
-----------------

キューを作成します。

```bash:変数の確認:
cat << ETX

        SQS_QUEUE_NAME: ${SQS_QUEUE_NAME}

ETX
```

```bash:コマンド:
aws sqs create-queue \
        --queue-name ${SQS_QUEUE_NAME}
```

```json:結果(例):
      {
        "QueueUrl": "https://ap-northeast-1.queue.amazonaws.com/XXXXXXXXXXXX/20160509-handson-queue"
      }
```


2.2. キューの確認
-----------------

作成したキューがキュー一覧に表示されることを確認します。

```bash:コマンド:
aws sqs list-queues \
        --queue-name-prefix ${SQS_QUEUE_NAME}
```

```json:結果(例):
      {
        "QueueUrls": [
          "https://ap-northeast-1.queue.amazonaws.com/XXXXXXXXXXXX/20160509-handson-queue"
        ]
      }
```

反映されるまでにタイムラグがあるようです。


3. キューのURL取得
==================

SQSでキューを操作するときは、対象キューのURLを特定する必要があります。

このURLを変数に取り込みます。

```bash:コマンド:
SQS_QUEUE_URL=$( \
        aws sqs get-queue-url \
          --queue-name ${SQS_QUEUE_NAME} \
          --output text \
      ) \
       && echo ${SQS_QUEUE_URL}
```

```text:結果(例):
      https://ap-northeast-1.queue.amazonaws.com/XXXXXXXXXXXX/20160509-handson-queue
```


4. キューの属性(Attributes)
===========================

SQSのキューの属性は、get-queue-attributesコマンドのオプションで属性名を指定することで確認することができます。

(属性名を指定しないと何も表示されません...)

キュー作成直後のデフォルトの属性を確認してみましょう。

```bash:コマンド:
aws sqs get-queue-attributes \
        --queue-url ${SQS_QUEUE_URL} \
        --attribute-names \
          Policy \
          VisibilityTimeout \
          MaximumMessageSize \
          MessageRetentionPeriod \
          ApproximateNumberOfMessages \
          ApproximateNumberOfMessagesNotVisible \
          CreatedTimestamp \
          LastModifiedTimestamp \
          QueueArn \
          ApproximateNumberOfMessagesDelayed \
          DelaySeconds \
          ReceiveMessageWaitTimeSeconds \
          RedrivePolicy
```

```json:結果(例):
      {
        "Attributes": {
          "ApproximateNumberOfMessagesNotVisible": "0",
          "VisibilityTimeout": "30",
          "LastModifiedTimestamp": "1456735033",
          "MaximumMessageSize": "262144",
          "CreatedTimestamp": "1456735033",
          "ApproximateNumberOfMessages": "0",
          "ReceiveMessageWaitTimeSeconds": "0",
          "DelaySeconds": "0",
          "MessageRetentionPeriod": "345600",
          "ApproximateNumberOfMessagesDelayed": "0",
          "QueueArn": "arn:aws:sqs:ap-northeast-1:XXXXXXXXXXXX:20160509-handson-queue"
        }
      }
```

以下の属性は、キュー作成直後は値が存在しないようです。

* Policy
* RedrivePolicy


5. キューの属性の変更 (VisibilityTimeout)
=========================================

SQSのキューの属性は、set-queue-attributesコマンドで変更が可能です。

ここでは、VisibilityTimeoutの値を変更してみましょう。


5.1. VisibilityTimeoutの確認
----------------------------

VisibilityTimeoutは、受信操作を行うとそのメッセージが見えなくなる一定の時間のことです。 Timeout前にそのメッセージに対して削除操作がされないと、再度キューに戻されます。

一つのメッセージを複数のクライアントが同時に取得しないための仕組みです。

キュー属性のVisibilityTimeoutは、キューにおけるVisibilityTimeoutのデフォルト値を設定します。

初期値は30秒です。

```bash:コマンド:
aws sqs get-queue-attributes \
        --queue-url ${SQS_QUEUE_URL} \
        --attribute-names VisibilityTimeout
```

```json:結果(例):
      {
          "Attributes": {
              "VisibilityTimeout": "30"
          }
      }
```


5.2. VisibilityTimeoutの変更
----------------------------

キュー属性のVisibilityTimeoutを60秒に変更してみましょう。

```bash:変数の設定:
SQS_VTOUT=60
```

```bash:変数の確認
cat << ETX
  SQS_QUEUE_URL: ${SQS_QUEUE_URL}
  SQS_VTOUT:     ${SQS_VTOUT}
ETX
```

```bash:コマンド:
aws sqs set-queue-attributes \
        --queue-url ${SQS_QUEUE_URL} \
        --attributes VisibilityTimeout=${SQS_VTOUT}
```

```text:結果(例):
      (戻り値なし)
```


5.3. VisibilityTimeoutの確認
----------------------------

キュー属性のVisibilityTimeoutが60秒になっていることを確認します。

```bash:コマンド:
aws sqs get-queue-attributes \
        --queue-url ${SQS_QUEUE_URL} \
        --attribute-names VisibilityTimeout
```

```json:結果:
      {
        "Attributes": {
             "VisibilityTimeout": "60"
        }
      }
```


完了
====