AWS Application Load Balancer (ALB/ELBv2) CLIコマンドリファレンス

# elbv2 - Application Load Balancer

0. アプリケーションロードバランサの仕組み
===========

0.1. 構造について
---------------------

![component_architecture.png](https://qiita-image-store.s3.amazonaws.com/0/96018/c555f72f-99a8-f0d8-fec3-6bb1cc7b8590.png)

アプリケーションロードバランサは、L7ロードバランサです。
図のように３層構造になっています。

* ロードバランサ：骨組み
* リスナ：クライアントからのアクセスを受け付ける
 * リスナには（任意で）ルールを設定でき、URLパスによって振り分け先を分けることもできる
* ターゲットグループ：リスナが受けたトラヒックをターゲット（インスタンス）へ振り分ける

ロードバランサ作成、ターゲットグループ作成、ターゲット登録、リスナ作成、（ルール作成）の順に構築していくことで、ロードバランサが利用可能となります。

0.2. ELBとの違い
---------------------

ELBの機能を全て含んでいるわけではありません。用途に応じて使い分ける必要があります。

### 従来のELBだけができること

* サーバ生成のcookieによるstickinessセッション管理
 * また、ELB生成のcookieによるセッション管理でも期限を設定しないcookieの発行が可能
* TCPロードバランサ
 * sshや独自プロトコルなど非HTTP通信をバランシングする場合はELBを使用します。
 * HTTPSでクライアント認証を行う場合にはこちらが必要になります。これはELBでHTTPS終端するとインスタンスとの通信は平文HTTPになりクライアント認証ができないからです。
* Proxyプロトコルのサポート
 * TCPロードバランサと合わせて使用し、クライアントのアクセス元IPアドレスを伝えることができます。

### ELBv2だけができること

* 振り分け先ごとに異なるポート番号を設定
 * 同一インスタンス上の複数コンテナへの接続を想定
* URLパスによりターゲットグループ（振り分け先）を分ける
 * L7ロードバランサとしての機能です。
* HTTP/2に対応しています。
 * ターゲット（振り分け先）が非対応でもクライアントとの通信がHTTP/2対応になります。


1. ロードバランサ
===========

1.1. ロードバランサの作成 (create-load-balancer)
---------------------

アプリケーションロードバランサを作成します。
ロードバランサにリスナーを作成するには create-listener コマンドを使用します。
ロードバランサ作成時に、セキュリティグループ・サブネット・タグを追加することができます。またこれらは後から追加することもできます。
ロードバランサの内容を確認するには describe-load-balancers コマンドを使用します。
ロードバランサを削除するには delete-load-balancer を使用します。
１リージョンに作成可能ロードバランサは20までです。上限緩和申請が可能です。

### オプション

* --name (string)
	* ロードバランサに名前を付けます。リージョン内で一意で有る必要があり、半角32文字までです。半角英数字とハイフンが使用可能ですが最初と最後にハイフンは使用できません。
* --subnets (list)
	* 使用するサブネットをスペース区切りで指定します。AZ毎に1サブネットのみ指定可能です。また2以上のAZからサブネットを設定する必要があります。
* --security-groups (list)
	* ロードバランサに設定するセキュリティグループIDを指定します。複数指定する場合はスペース区切り。
* --scheme (string)
	* ロードバランサの動作を internet-facing または internal で指定します。デフォルトはinternet-facingです。
	* internet-facingのノードはパブリックIPアドレスを持ちます。internet-facingロードバランサのDNS名は外部から参照可能です。このためインターネットから接続可能です。
	* internalのノードはプライベートIPアドレスのみ持ちます。internalロードバランサのDNS名はプライベートIPアドレスが返されます。このためVPC内からのみアクセスできます。
* --tags (list)
	* タグを設定します。"Key=string,Value=string" のように。複数の場合はスペース区切り

### 実行例
```bash:コマンド(例):
aws elbv2 create-load-balancer \
 --name my-load-balancer \
 --subnets subnet-b7d581c0 subnet-8360a9e7 \
 --security-groups sg-99999999 
```
```text:結果(例):
      {
        "LoadBalancers": [
            {
                "VpcId": "vpc-3ac0fb5f",
                "LoadBalancerArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:loadbalancer/app/my-load-balancer/50dc6c495c0c9188",
                "State": {
                    "Code": "provisioning"
                },
                "DNSName": "my-load-balancer-424835706.us-west-2.elb.amazonaws.com",
      
                "SecurityGroups": [
                    "sg-5943793c"
                ],
                "LoadBalancerName": "my-load-balancer",
                "CreatedTime": "2016-03-25T21:26:12.920Z",
                "Scheme": "internet-facing",
                "Type": "application",
                "CanonicalHostedZoneId": "Z2P70J7EXAMPLE",
                "AvailabilityZones": [
                    {
                        "SubnetId": "subnet-8360a9e7",
                        "ZoneName": "us-west-2a"
                    },
                    {
                        "SubnetId": "subnet-b7d581c0",
                        "ZoneName": "us-west-2b"
                    }
                ]
            }
        ]
      }
```



2. ターゲットグループ
===========

2.1. ターゲットグループの作成 (create-target-group)
---------------------

ロードバランサにターゲットグループを作成します。
ターゲットグループを作成後、 register-targets コマンドでターゲットグループにターゲット（振り分け先のインスタンス）を登録する必要があります。
トラヒックをターゲットグループへ流すためには、 create-listener か create-rule コマンドでリスナかルールからactionでターゲットグループを指定することで実現されます。
ターゲットグループのヘルスチェックを更新するには modify-target-group 、ターゲットグループの各ターゲットの状況を確認するには describe-target-health コマンドを使用します。
ターゲットグループを削除するには delete-target-group を使用します。
ルールによりターゲットグループを分けたい場合、ターゲットグループを複数作成します。

### オプション
* --name (string)
	* ターゲットグループに名前を付けます。
* --protocol (string)
	* ターゲットへ流すプロトコルを指定します。HTTPかHTTPSのみ。
* --port (integer)
	* ターゲットへのデフォルト接続ポート番号を指定します。個別のターゲットにポート番号を指定しない場合、このポート番号が使用されます。
* --vpc-id (string)
	* VPCIDを指定します。
* --health-check-protocol (string)
	* ターゲットのヘルスチェックに使用するプロトコルを指定します。デフォルトはHTTPです。HTTP HTTPSから選択。
* --health-check-port (string)
	* ターゲットのヘルスチェックに使用するポート番号を指定します。デフォルトはロードバランサからトラヒックを受信するターゲットのポート番号です。
* --health-check-path (string)
	* ヘルスチェックに使用するURLパスを指定します。デフォルトは / です。
* --health-check-interval-seconds (integer)
	* ヘルスチェックの実行間隔を秒で指定します。デフォルトは 30 です。
* --health-check-timeout-seconds (integer)
	* ヘルスチェックのタイムアウト時間を秒で指定します。この時間内に期待した応答が無い場合ヘルスチェックがfailedとなります。デフォルトは 5 です。
* --healthy-threshold-count (integer)
	* この回数以上連続してヘルスチェックが成功するとunhealthyのターゲットがhealthyに変更されます。デフォルトは5です。
* --unhealthy-threshold-count (integer)
	* この回数以上連続してヘルスチェックが失敗するとhealthyのターゲットがunhealthyに変更されます。デフォルトは2です。
* --matcher (structure)
	* ヘルスチェックでターゲットから期待されるHTTPコードを指定します。デフォルトは200です。

実行例

```bash:コマンド(例):
aws elbv2 create-target-group \
 --name my-targets \
 --protocol HTTP \
 --port 80 \
 --vpc-id vpc-3ac0fb5f
```
```text:結果(例):
{
  "TargetGroups": [
      {
          "HealthCheckPath": "/",
          "HealthCheckIntervalSeconds": 30,
          "VpcId": "vpc-3ac0fb5f",
          "Protocol": "HTTP",
          "HealthCheckTimeoutSeconds": 5,
          "HealthCheckProtocol": "HTTP",
          "UnhealthyThresholdCount": 2,
          "HealthyThresholdCount": 5,
          "TargetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067",
          "Matcher": {
              "HttpCode": "200"
          },
          "HealthCheckPort": "traffic-port",
          "Port": 80,
          "TargetGroupName": "my-targets"
      }
  ]
}
```


2.2. ターゲットの登録 (register-targets)
---------------------

ターゲットグループにターゲット（インスタンス）を登録します。
ターゲットはターゲットグループのVPCサブネットになければなりません。
ターゲットグループからターゲットを削除するには deregister-targets を使用します。

### オプション
* --target-group-arn (string)
	* ターゲットグループのARNを指定します。
* --targets (list)
	* 登録したいターゲットのインスタンスIDを指定します。ターゲットグループのデフォルトポート番号以外のポート番号を設定する場合は、Portも記述します。 Id=string,Port=integer のように。複数登録する場合はスペース区切り。

実行例 (ターゲットを２台登録。１つ目のターゲットはデフォルトポート、２つ目のターゲットはポート指定）

```bash:コマンド(例):
aws elbv2 register-targets \
 --target-group-arn arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067 \
 --targets Id=i-11111111 Id=i-11111111,Port=8080
```
```text:結果(例):
無し
```



3. リスナ
===========

3.1. リスナの作成 (create-listener)
---------------------

ロードバランサにリスナを作成します。
作成後にリスナの設定変更をするには modify-listener を使用します。
リスナを削除するには delete-listener を使用します。ロードバランサごと削除する場合は delete-load-balancer を使用すると関連するリスナも自動で削除してくれます。

### オプション
* --load-balancer-arn (string)
	* ロードバランサのARNを指定します。
* --protocol (string)
	* プロトコルをHTTPまたはHTTPSで指定します。
* --port (integer)
	* 外部からの接続を待ち受けるポート番号。
* --certificates (list)
	* SSL終端時に証明書のARNを指定します。CertificateArn=<arn>で記載
* --ssl-policy (string)
	* SSL終端時にポリシーを指定します。省略可。デフォルトは最新の物。
* --default-actions (list)
	* デフォルトの動作を指定する。一般にターゲットグループへ転送するので Type=forward,TargetGroupArn=<arn> のように記載


実行例（HTTPSリスナの作成）

```bash:コマンド(例):
aws elbv2 create-listener \
 --load-balancer-arn arn:aws:elasticloadbalancing:us-west-2:123456789012:loadbalancer/app/my-load-balancer/50dc6c495c0c9188 \
 --protocol HTTPS --port 443 \
 --certificates CertificateArn=arn:aws:iam::123456789012:server-certificate/my-server-cert \
 --ssl-policy ELBSecurityPolicy-2015-05 \
 --default-actions Type=forward,TargetGroupArn=arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067
```
```text:結果(例):
      {
        "Listeners": [
            {
                "Protocol": "HTTPS",
                "DefaultActions": [
                    {
                        "TargetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067",
                        "Type": "forward"
                    }
                ],
                "SslPolicy": "ELBSecurityPolicy-2015-05",
                "Certificates": [
                    {
                        "CertificateArn": "arn:aws:iam::123456789012:server-certificate/my-server-cert"
                    }
                ],
                "LoadBalancerArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:loadbalancer/app/my-load-balancer/50dc6c495c0c9188",
                "Port": 443,
                "ListenerArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:listener/app/my-load-balancer/50dc6c495c0c9188/f2f7dc8efc522ab2"
            }
        ]
      }
```

3.2. ルールの作成 (create-rule)
---------------------

リスナにルールを作成します（任意）。ルールを作成しない場合、リスナのデフォルトルールが常に適用されます。
ルールは適用条件を指定するconditionsと動作を指定するactionsで構成されます。
ルールは優先順位があり、低い値から高い値へ順に処理され合致した場合には指定された動作をします（最初に合致したルールが適用され処理完了します）。いずれも合致しない場合はリスナのデフォルト動作をします。
現在のルールを確認するには describe-rules を、ルールを更新するには modify-rule を、ルールに優先順位を設定するには set-rule-priorities を、ルールを削除するには delete-rule コマンドを使用します。

### オプション
* --listener-arn (string)
	* リスナーのARNを指定します。
* --conditions (list)
	* ルールの条件を指定します。Field=string,Values=string,string ...
	* Fieldは現在 path-pattern のみ、Valuesはpathを指定。 ? と * でワイルドカード指定可能 '/img/*' 
* --priority (integer)
	* 優先順位を数字で指定します。最初に合致したルールのみ適用されます。
* --actions (list)
	* 動作を指定します。 Type=forward,TargetGroupArn=<ターゲットグループのARN> のように。

実行例(/img/ を個別のターゲットグループへ振り分けます)

```bash:コマンド(例):
aws elbv2 create-rule \
 --listener-arn arn:aws:elasticloadbalancing:us-west-2:123456789012:listener/app/my-load-balancer/50dc6c495c0c9188/f2f7dc8efc522ab2 \
 --priority 10 \
 --conditions Field=path-pattern,Values='/img/*' \
 --actions Type=forward,TargetGroupArn=arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067
```
```text:結果(例):
      {
        "Rules": [
            {
                "Priority": "10",
                "Conditions": [
                    {
                        "Field": "path-pattern",
                        "Values": [
                            "/img/*"
                        ]
                    }
                ],
                "RuleArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:listener-rule/app/my-load-balancer/50dc6c495c0c9188/f2f7dc8efc522ab2/9683b2d02a6cabee",
                "IsDefault": false,
                "Actions": [
                    {
                        "TargetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067",
                        "Type": "forward"
                    }
                ]
            }
        ]
      }
```



4. 設定追加・変更コマンド
===========

4.1. タグの追加 (add-tags)
---------------------

タグを追加します。load balancerとtarget groupにタグを設定することが出来ます。
タグはkeyと値の組み合わせで設定します。既に同じkeyが存在した場合、上書きされます。

### オプション
* --resource-arns (list)
	* タグを追加するリソースをARNで指定。複数の場合はスペース区切り
* --tags (list)
	* タグの内容を記述。"Key=string,Value=string" 複数の場合はスペース区切り

実行例

```bash:コマンド(例):
aws elbv2 add-tags \
 --resource-arns arn:aws:elasticloadbalancing:us-west-2:123456789012:loadbalancer/app/my-load-balancer/50dc6c495c0c9188 \
 --tags "Key=name,Value=hoge" "Key=foo,Value=bar"
```
```text:結果(例):
無し
```


4.2. ロードバランサの属性変更 (modify-load-balancer-attributes)
---------------------

ロードバランサの属性を変更します。
指定した内容に属性を変更できなかった場合はコマンド実行が失敗します。
指定しなかった属性は現在の内容が引き継がれます。

### オプション
* --load-balancer-arn (string)
	* ロードバランサのARNを指定します。
* --attributes (list)
	* 属性を指定します。 Key=string,Value=string のように。複数指定する場合はスペース区切り。

### 設定可能なKey,Value
|Key|Value|説明|
|:--|:--|:--|
|deletion_protection.enabled|true/false|削除保護機能が有効か|
|idle_timeout.timeout_seconds|秒|アイドリング時のタイムアウト時間|
|access_logs.s3.enabled|true/false|アクセスログをS3に保存するか|
|access_logs.s3.bucket|バケット名|アクセスログ保存先のS3バケット名|
|access_logs.s3.prefix|文字列|保存先S3バケットのプレフィックス(サブディレクトリ)|

### アクセスログのS3バケットへの保存
アクセスログは
S3バケット/プレフィックス/AWSLogs/アカウントID/elasticloadbalancing/リージョン/年/月/日/
の下に定期的に出力されます。出力時間間隔の指定はできませんが15分毎程度のようです。

また、ELBv2がS3バケットへ書き込み権限が無いと設定ができません。
これはリージョン毎に定められたプリシパルを記載したバケットポリシを設定する必要があります。
詳しくは [こちらの公式ドキュメント](http://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/classic/enable-access-logs.html#attach-bucket-policy) を参照。

実行例 (ロードバランサ削除保護機能を有効にします)

```bash:コマンド(例):
aws elbv2 modify-load-balancer-attributes \
 --load-balancer-arn arn:aws:elasticloadbalancing:us-west-2:123456789012:loadbalancer/app/my-load-balancer/50dc6c495c0c9188 \
 --attributes Key=deletion_protection.enabled,Value=true
```
```text:結果(例):
{
    "Attributes": [
        {
            "Value": "false",
            "Key": "access_logs.s3.enabled"
        },
        {
            "Value": "60",
            "Key": "idle_timeout.timeout_seconds"
        },
        {
            "Value": "",
            "Key": "access_logs.s3.prefix"
        },
        {
            "Value": "true",
            "Key": "deletion_protection.enabled"
        },
        {
            "Value": "",
            "Key": "access_logs.s3.bucket"
        }
    ]
}
```


4.3. ロードバランサのセキュリティグループ設定 (set-security-groups)
---------------------

ロードバランサにセキュリティグループを関連づけます。
これは以前の設定を上書きします。

### オプション
* --load-balancer-arn (string)	ロードバランサのARNを指定します。
* --security-groups (list)	ロードバランサに設定するセキュリティグループIDを指定します。複数指定する場合はスペース区切り。

実行例

```bash:コマンド(例):
aws elbv2 set-security-groups \
 --load-balancer-arn arn:aws:elasticloadbalancing:us-west-2:123456789012:loadbalancer/app/my-load-balancer/50dc6c495c0c9188 \
 --security-groups sg-5943793c
```
```text:結果(例):
{
  "SecurityGroupIds": [
      "sg-5943793c"
  ]
}
```


4.4. ロードバランサのサブネット設定 (set-subnets)
---------------------

ロードバランサにサブネットを設定します。
これは以前の設定を上書きします。

### オプション
* --load-balancer-arn (string)
	* ロードバランサのARNを指定します。
* --subnets (list)
	* 使用するサブネットをスペース区切りで指定します。AZ毎に1サブネットのみ指定可能です。また2以上のAZからサブネットを設定する必要があります。

実行例

```bash:コマンド(例):
aws elbv2 set-subnets \
 --load-balancer-arn arn:aws:elasticloadbalancing:us-west-2:123456789012:loadbalancer/app/my-load-balancer/50dc6c495c0c9188 \
 --subnets subnet-8360a9e7 subnet-b7d581c0
```
```text:結果(例):
{
  "AvailabilityZones": [
      {
          "SubnetId": "subnet-8360a9e7",
          "ZoneName": "us-west-2a"
      },
      {
          "SubnetId": "subnet-b7d581c0",
          "ZoneName": "us-west-2b"
      }
  ]
}
```


4.5. リスナ設定の変更 (modify-listener)
---------------------

リスナの設定内容を変更します。
指定しなかった項目は現在の内容が引き継がれます。
プロトコルをHTTPSからHTTPへ変更する場合、SSL証明書やSSLポリシは削除されます。
プロトコルをHTTPからHTTPSへ変更したい場合、SSL証明書とSSLポリシーも必要です。

### オプション
* --listener-arn (string)
	* 変更するリスナのARNを指定します。
* --port (integer)
	* ポート番号を指定します。
* --protocol (string)
	* 接続を受け付けるプロトコルを設定します。HTTPまたはHTTPS
* --ssl-policy (string)
	* SSL終端時のポリシーを指定します。
* --certificates (list)
	* SSL証明書を指定します。 CertificateArn=<証明書のARN> と記述
* --default-actions (list)
	* デフォルトのターゲットグループを指定します。 Type=forward,TargetGroupArn=<ターゲットグループのARN> と記述

実行例 (新しいSSL証明書ARNを指定して証明書を入れ替える)

```bash:コマンド(例):
aws elbv2 modify-listener \
 --listener-arn arn:aws:elasticloadbalancing:us-west-2:123456789012:listener/app/my-load-balancer/50dc6c495c0c9188/0467ef3c8400ae65 \
 --certificates CertificateArn=arn:aws:iam::123456789012:server-certificate/my-new-server-cert
```
```text:結果(例):
{
  "Listeners": [
      {
          "Protocol": "HTTPS",
          "DefaultActions": [
              {
                  "TargetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067",
                  "Type": "forward"
              }
          ],
          "SslPolicy": "ELBSecurityPolicy-2015-05",
          "Certificates": [
              {
                  "CertificateArn": "arn:aws:iam::123456789012:server-certificate/my-new-server-cert"
              }
          ],
          "LoadBalancerArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:loadbalancer/app/my-load-balancer/50dc6c495c0c9188",
          "Port": 443,
          "ListenerArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:listener/app/my-load-balancer/50dc6c495c0c9188/0467ef3c8400ae65"
      }
  ]
}
```


4.6. ルール設定内容の変更 (modify-rule)
---------------------

ルールの設定内容を変更します。
これはURLパス条件などのルールを変更するものです。
リスナデフォルトの動作を変更する場合は本機能でなく modify-listener を使用します。
指定しなかった内容は現在の内容が引き継がれます。

### オプション
* --rule-arn (string)
	* ルールのARNを指定します。
（変更したい内容のみ記述します）
* --conditions (list)
	* ルールの適用条件(URLパスなど)を指定します。 Field=path-pattern,Values='/images/*' のように。
* --actions (list)
	* 動作を指定します。 Type=forward,TargetGroupArn=<ターゲットグループのARN> のように。

実行例 (URLパスの合致条件を /cgi-bin/ へ変更)

```bash:コマンド(例):
aws elbv2 modify-rule \
 --rule-arn arn:aws:elasticloadbalancing:us-west-2:123456789012:listener-rule/app/my-load-balancer/50dc6c495c0c9188/f2f7dc8efc522ab2/9683b2d02a6cabee \
 --conditions Field=path-pattern,Values='/cgi-bin/*'
```
```text:結果(例):
{
  "Rules": [
      {
          "Priority": "10",
          "Conditions": [
              {
                  "Field": "path-pattern",
                  "Values": [
                      "/cgi-bin/*"
                  ]
              }
          ],
          "RuleArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:listener-rule/app/my-load-balancer/50dc6c495c0c9188/f2f7dc8efc522ab2/9683b2d02a6cabee",
          "IsDefault": false,
          "Actions": [
              {
                  "TargetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067",
                  "Type": "forward"
              }
          ]
      }
  ]
}
```


4.7. ルールの優先順位設定 (set-rule-priorities)
---------------------

ルールに優先順位を設定します。
これは以前の設定を上書きします。

### オプション
* --rule-priorities (list)
	* ルールのARNと設定したい優先順位を数値で指定します。 RuleArn=<ルールのARN>,Priority=<優先順位> のように。複数指定する場合はスペース区切り。

実行例

```bash:コマンド(例):
aws elbv2 set-rule-priorities \
 --rule-priorities RuleArn=arn:aws:elasticloadbalancing:us-west-2:123456789012:listener-rule/app/my-load-balancer/50dc6c495c0c9188/f2f7dc8efc522ab2/1291d13826f405c3,Priority=5
```
```text:結果(例):
{
  "Rules": [
      {
          "Priority": "5",
          "Conditions": [
              {
                  "Field": "path-pattern",
                  "Values": [
                      "/img/*"
                  ]
              }
          ],
          "RuleArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:listener-rule/app/my-load-balancer/50dc6c495c0c9188/f2f7dc8efc522ab2/1291d13826f405c3",
          "IsDefault": false,
          "Actions": [
              {
                  "TargetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067",
                  "Type": "forward"
              }
          ]
      }
  ]
}
```


4.8. ターゲットグループの設定変更 (modify-target-group)
---------------------

ターゲットグループのヘルスチェック設定を変更します。
指定しない項目は従前の設定が引き継がれます。設定内容は describe-target-health で確認できます。

### オプション
* --target-group-arn (string)
	* ターゲットグループのARNを指定します。
* --health-check-protocol (string)
	* ターゲットのヘルスチェックに使用するプロトコルを指定します。デフォルトはHTTPです。HTTP HTTPSから選択。
* --health-check-port (string)
	* ターゲットのヘルスチェックに使用するポート番号を指定します。デフォルトはロードバランサからトラヒックを受信するターゲットのポート番号です。
* --health-check-path (string)
	* ヘルスチェックに使用するURLパスを指定します。デフォルトは / です。
* --health-check-interval-seconds (integer)
	* ヘルスチェックの実行間隔を秒で指定します。デフォルトは 30 です。
* --health-check-timeout-seconds (integer)
	* ヘルスチェックのタイムアウト時間を秒で指定します。この時間内に期待した応答が無い場合ヘルスチェックがfailedとなります。デフォルトは 5 です。
* --healthy-threshold-count (integer)
	* この回数以上連続してヘルスチェックが成功するとunhealthyのターゲットがhealthyに変更されます。デフォルトは5です。
* --unhealthy-threshold-count (integer)
	* この回数以上連続してヘルスチェックが失敗するとhealthyのターゲットがunhealthyに変更されます。デフォルトは2です。
* --matcher (structure)
	* ヘルスチェックでターゲットから期待されるHTTPコードを指定します。デフォルトは200です。

実行例 (ヘルスチェックを行うURLパスを /login.jsp へ変更)

```bash:コマンド(例):
aws elbv2 modify-target-group \
 --target-group-arn arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-https-targets/2453ed029918f21f \
 --health-check-path /login.jsp
```
```text:結果(例):
{
  "TargetGroups": [
      {
          "HealthCheckIntervalSeconds": 30,
          "VpcId": "vpc-3ac0fb5f",
          "Protocol": "HTTPS",
          "HealthCheckTimeoutSeconds": 5,
          "HealthCheckProtocol": "HTTPS",
          "LoadBalancerArns": [
              "arn:aws:elasticloadbalancing:us-west-2:123456789012:loadbalancer/app/my-load-balancer/50dc6c495c0c9188"
          ],
          "UnhealthyThresholdCount": 2,
          "HealthyThresholdCount": 5,
          "TargetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-https-targets/2453ed029918f21f",
          "Matcher": {
              "HttpCode": "200"
          },
          "HealthCheckPort": "443",
          "Port": 443,
          "TargetGroupName": "my-https-targets"
      }
  ]
}
```

注：ヘルスチェックパスを変更しても、返値にはこれが有りません（仕様）。必要に応じて describe-target-groups などで確認してください。


4.9. ターゲットグループの属性変更 (modify-target-group-attributes)
---------------------

ターゲットグループの属性を変更します。
指定しなかった属性は現在の内容が引き継がれます。

### オプション
* --target-group-arn (string)
	* ターゲットグループのARNを指定します。
* --attributes (list)
	* 変更したい属性を記述します。 Key=string,Value=string のように。複数記述する場合はスペース区切り

### 設定可能なKey,Value
|Key|Value|説明|
|:--|:--|:--|
|deregistration_delay.timeout_seconds|秒|接続不能となったターゲットをdrainingからunusedに変更するまでの時間を0から3600秒の間で指定します。デフォルトは300秒。|
|stickiness.enabled|true/false|stickinessセッション管理が有効かどうか|
|stickiness.type|lb_cookie|sticky sessionの種類。現在は lb_cookie のみ|
|stickiness.lb_cookie.duration_seconds|秒|stickinessセッション管理で同じターゲットへ振り分けるためのcookieタイムアウト時間を1秒から604800秒(1週間)の間で指定します。デフォルトは1日(86400秒)|

実行例 (stickinessを無効に変更)

```bash:コマンド(例):
aws elbv2 modify-target-group-attributes \
 --target-group-arn arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067 \
 --attributes Key=stickiness.enabled,Value=false
```
```text:結果(例):
{
  "Attributes": [
      {
          "Value": "false",
          "Key": "stickiness.enabled"
      },
      {
          "Value": "600",
          "Key": "deregistration_delay.timeout_seconds"
      },
      {
          "Value": "lb_cookie",
          "Key": "stickiness.type"
      },
      {
          "Value": "86400",
          "Key": "stickiness.lb_cookie.duration_seconds"
      }
  ]
}
```


4.10. ターゲットの登録解除 (deregister-targets)
---------------------

ターゲットグループから指定したターゲットを登録解除します。
解除後は新しいトラヒックが来なくなりますが、接続中の通信は有効です。

### オプション
* --target-group-arn (string)
	* ターゲットグループのARNを指定します。
* --targets (list)
	* 登録解除したいターゲットのインスタンスIDを指定します。ターゲットグループのポート番号以外のポート番号を設定しているターゲットを登録解除する場合はポート番号も記載しなければなりません。 Id=string,Port=integer のように。複数指定する場合はスペース区切り。

実行例

```bash:コマンド(例):
aws elbv2 deregister-targets \
 --target-group-arn arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067 \
 --targets Id=i-0f76fade
```
```text:結果(例):
無し
```




5. 内容確認系コマンド
===========

5.1. SSLポリシ一覧表示 (describe-ssl-policies)
---------------------

HTTPS終端する場合に指定するSSL終端のポリシーを表示します。
namesを指定した場合は指定されたポリシーのみ、デフォルトでは全ポリシーを表示します。
現在は ELBSecurityPolicy-2015-05 のみで選択肢がありません。

### オプション
* --names (list)
	* ポリシー名を指定します。複数指定する場合はスペース区切り。
* ページ制御が可能です

実行例

```bash:コマンド(例):
aws elbv2 describe-ssl-policies
```
```text:結果(例):
{
  "SslPolicies": [
      {
          "SslProtocols": [
              "TLSv1",
              "TLSv1.1",
              "TLSv1.2"
          ],
          "Ciphers": [
              {
                  "Priority": 1,
                  "Name": "ECDHE-ECDSA-AES128-GCM-SHA256"
              },
              {
                  "Priority": 2,
                  "Name": "ECDHE-RSA-AES128-GCM-SHA256"
              },
              {
                  "Priority": 3,
                  "Name": "ECDHE-ECDSA-AES128-SHA256"
              },

              ...

              {
                  "Priority": 19,
                  "Name": "AES256-SHA"
              }
          ],
          "Name": "ELBSecurityPolicy-2015-05"
      }
  ]
}
```


5.2. ロードバランサの設定表示 (describe-load-balancers)
---------------------

ロードバランサの設定状況を表示します。
何も指定しなければリージョン内全てのロードバランサが表示されます。ロードバランサのARNまたはnameを指定することで出力結果を絞り込めます。

### オプション
* --load-balancer-arns (list)
	* ロードバランサのARNを指定します。複数指定する場合はスペース区切り。
* --names (list)
	* ロードバランサのnameを指定します。複数指定する場合はスペース区切り。
* ページ制御が可能です。

実行例

```bash:コマンド(例):
aws elbv2 describe-load-balancers
```
```text:結果(例):
{
  "LoadBalancers": [
      {
          "VpcId": "vpc-3ac0fb5f",
          "LoadBalancerArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:loadbalancer/app/my-load-balancer/50dc6c495c0c9188",
          "State": {
              "Code": "active"
          },
          "DNSName": "my-load-balancer-424835706.us-west-2.elb.amazonaws.com",

          "SecurityGroups": [
              "sg-5943793c"
          ],
          "LoadBalancerName": "my-load-balancer",
          "CreatedTime": "2016-03-25T21:26:12.920Z",
          "Scheme": "internet-facing",
          "Type": "application",
          "CanonicalHostedZoneId": "Z2P70J7EXAMPLE",
          "AvailabilityZones": [
              {
                  "SubnetId": "subnet-8360a9e7",
                  "ZoneName": "us-west-2a"
              },
              {
                  "SubnetId": "subnet-b7d581c0",
                  "ZoneName": "us-west-2b"
              }
          ]
      }
  ]
}
```


5.3. ロードバランサの属性表示 (describe-load-balancer-attributes)
---------------------

ロードバランサの属性を表示します。

### オプション
* --load-balancer-arn (string)
	* ロードバランサのARNを指定します。

実行例

```bash:コマンド(例):
aws elbv2 describe-load-balancer-attributes \
 --load-balancer-arn arn:aws:elasticloadbalancing:us-west-2:123456789012:loadbalancer/app/my-load-balancer/50dc6c495c0c9188
```
```text:結果(例):
{
    "Attributes": [
        {
            "Value": "false",
            "Key": "access_logs.s3.enabled"
        },
        {
            "Value": "60",
            "Key": "idle_timeout.timeout_seconds"
        },
        {
            "Value": "",
            "Key": "access_logs.s3.prefix"
        },
        {
            "Value": "true",
            "Key": "deletion_protection.enabled"
        },
        {
            "Value": "",
            "Key": "access_logs.s3.bucket"
        }
    ]
}
```


5.4. リスナの設定表示 (describe-listeners)
---------------------

リスナまたはロードバランサを指定して、リスナの設定状況を表示します。
リスナを指定（複数可）した場合、指定したリスナの設定状況が、ロードバランサを指定した場合、指定したロードバランサに関連づけられた全てのリスナが表示されます。

### オプション
* --load-balancer-arn (string)
	* ロードバランサのARNを指定します。
* --listener-arns (list)
	* リスナのARNを指定します。複数指定する場合はスペース区切り。
* ページ制御が可能です。

実行例 (リスナのARNを指定して出力)

```bash:コマンド(例):
aws elbv2 describe-listeners \
 --listener-arns arn:aws:elasticloadbalancing:us-west-2:123456789012:listener/app/my-load-balancer/50dc6c495c0c9188/f2f7dc8efc522ab2
```
```text:結果(例):
{
  "Listeners": [
      {
          "Protocol": "HTTP",
          "DefaultActions": [
              {
                  "TargetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067",
                  "Type": "forward"
              }
          ],
          "LoadBalancerArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:loadbalancer/app/my-load-balancer/50dc6c495c0c9188",
          "Port": 80,
          "ListenerArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:listener/app/my-load-balancer/50dc6c495c0c9188/f2f7dc8efc522ab2"
      }
  ]
}
```


5.5. ルールの設定表示 (describe-rules)
---------------------

ルールまたはリスナを指定して、ルールの設定状況を表示します。
ルールを指定（複数可）した場合、指定したルールの設定状況が、リスナを指定した場合、指定したリスナに関連づけられたデフォルトルールを含む全てのルールが表示されます。

### オプション
* --listener-arn (string)
	* リスナのARNを指定します。
* --rule-arns (list)
	* ルールのARNを指定します。複数指定する場合はスペース区切り

実行例 (ルールのARNを指定して出力)

```bash:コマンド(例):
aws elbv2 describe-rules \
 --rule-arns arn:aws:elasticloadbalancing:us-west-2:123456789012:listener-rule/app/my-load-balancer/50dc6c495c0c9188/f2f7dc8efc522ab2/9683b2d02a6cabee
```
```text:結果(例):
{
  "Rules": [
      {
          "Priority": "10",
          "Conditions": [
              {
                  "Field": "path-pattern",
                  "Values": [
                      "/img/*"
                  ]
              }
          ],
          "RuleArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:listener-rule/app/my-load-balancer/50dc6c495c0c9188/f2f7dc8efc522ab2/9683b2d02a6cabee",
          "IsDefault": false,
          "Actions": [
              {
                  "TargetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067",
                  "Type": "forward"
              }
          ]
      }
  ]
}
```


5.6. ターゲットグループの設定表示 (describe-target-groups)
---------------------

ターゲットグループの設定内容を表示します。デフォルトでは全てのターゲットグループを表示します。
ロードバランサのARNを指定すると指定したロードバランサに関連づけられた全てのターゲットグループが、ターゲットグループのnameかARNを指定すると指定したターゲットグループの設定内容が表示されます。
ターゲットグループのターゲットの状態を表示するには describe-target-health を、ターゲットグループの属性を表示するには describe-target-group-attributes を使用します。

### オプション
* --load-balancer-arn (string)
	* ロードバランサのARNを指定します。
* --target-group-arns (list)
	* ターゲットグループのARNを指定します。複数指定する場合はスペース区切り。
* --names (list)
	* ターゲットグループのnameを指定します。複数指定する場合はスペース区切り。
* ページ制御が可能です。

実行例 (ターゲットグループのARNを指定して表示)

```bash:コマンド(例):
aws elbv2 describe-target-groups \
 --target-group-arns arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067
```
```text:結果(例):
{
  "TargetGroups": [
      {
          "HealthCheckPath": "/",
          "HealthCheckIntervalSeconds": 30,
          "VpcId": "vpc-3ac0fb5f",
          "Protocol": "HTTP",
          "HealthCheckTimeoutSeconds": 5,
          "HealthCheckProtocol": "HTTP",
          "LoadBalancerArns": [
              "arn:aws:elasticloadbalancing:us-west-2:123456789012:loadbalancer/app/my-load-balancer/50dc6c495c0c9188"
          ],
          "UnhealthyThresholdCount": 2,
          "HealthyThresholdCount": 5,
          "TargetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067",
          "Matcher": {
              "HttpCode": "200"
          },
          "HealthCheckPort": "traffic-port",
          "Port": 80,
          "TargetGroupName": "my-targets"
      }
  ]
}
```


5.8. ターゲットグループの属性表示 (describe-target-group-attributes)
---------------------

ターゲットグループの属性を表示します。

### オプション
* --target-group-arn (string)
	* ターゲットグループのARNを指定します。

実行例

```bash:コマンド(例):
aws elbv2 describe-target-group-attributes \
 --target-group-arn arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067
```
```text:結果(例):
{
  "Attributes": [
      {
          "Value": "false",
          "Key": "stickiness.enabled"
      },
      {
          "Value": "300",
          "Key": "deregistration_delay.timeout_seconds"
      },
      {
          "Value": "lb_cookie",
          "Key": "stickiness.type"
      },
      {
          "Value": "86400",
          "Key": "stickiness.lb_cookie.duration_seconds"
      }
  ]
}
```


5.9. ターゲットの状態表示 (describe-target-health)
---------------------

ターゲットグループに登録されているターゲットの状態を表示します。

### オプション
* --target-group-arn (string)
	* ターゲットグループのARNを指定します。
* --targets (list)
	* ターゲットを指定して出力内容を絞り込む場合に使用します。 Id=<インスタンスID>,Port=<ポート番号>(オプション)  で記述。

実行例

```bash:コマンド(例):
aws elbv2 describe-target-health \
 --target-group-arn arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067
```
```text:結果(例):
{
  "TargetHealthDescriptions": [
      {
          "HealthCheckPort": "80",
          "Target": {
              "Id": "i-ceddcd4d",
              "Port": 80
          },
          "TargetHealth": {
              "State": "healthy"
          }
      },
      {
          "HealthCheckPort": "80",
          "Target": {
              "Id": "i-0f76fade",
              "Port": 80
          },
          "TargetHealth": {
              "State": "healthy"
          }
      }
  ]
}
```


5.10. リソースのタグの表示 (describe-tags)
---------------------

指定したリソースのタグを表示します。

### オプション
* --resource-arns (list)
	* リソースのARNを指定します。複数指定する場合はスペース区切り。

実行例 (ロードバランサに設定されたタグを表示)

```bash:コマンド(例):
aws elbv2 describe-tags \
 --resource-arns arn:aws:elasticloadbalancing:us-west-2:123456789012:loadbalancer/app/my-load-balancer/50dc6c495c0c9188
```
```text:結果(例):
{
  "TagDescriptions": [
      {
          "ResourceArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:loadbalancer/app/my-load-balancer/50dc6c495c0c9188",
          "Tags": [
              {
                  "Value": "name",
                  "Key": "hoge"
              },
              {
                  "Value": "foo",
                  "Key": "bar"
              }
          ]
      }
  ]
}
```




6. 削除系コマンド
===========

全てを削除したい場合、ロードバランサとターゲットグループを削除すれば関連したリソースも自動的に削除されます。(EC2などターゲット以外)

6.1. タグの削除 (remove-tags)
---------------------

指定したリソースから指定したタグを削除します。
現在のタグ確認には  describe-tags を使用します。

### オプション
* --resource-arns (list)
	* リソースのARNを指定します。複数指定する場合はスペース区切り。
* --tag-keys (list)
	* 削除するタグのKeyを指定します。複数指定する場合はスペース区切り。

実行例

```bash:コマンド(例):
aws elbv2 remove-tags \
 --resource-arns arn:aws:elasticloadbalancing:us-west-2:123456789012:loadbalancer/app/my-load-balancer/50dc6c495c0c9188 \
 --tag-keys hoge
```
```text:結果(例):
無し
```


6.2. ロードバランサの削除 (delete-load-balancer)
---------------------

ロードバランサを削除します。関連づけられたリスナやルールも自動的に削除されます。
deletion protectionが有効なロードバランサを削除することはできません。(まず modify-load-balancer-attributes で無効に設定する必要があります)
削除済みまたは存在しないロードバランサを指定した場合でも、コマンドは成功応答を返します。
ロードバランサの削除は登録されているターゲットに影響を与えません。例えばEC2インスタンスは実行され続けますし、ターゲットグループにも登録されたままです。もしEC2インスタンスが不要となった場合は別途停止させるか削除する必要があります。

### オプション
* --load-balancer-arn (string)
	* ロードバランサのARNを指定します。

実行例

```bash:コマンド(例):
aws elbv2 delete-load-balancer \
 --load-balancer-arn arn:aws:elasticloadbalancing:us-west-2:123456789012:loadbalancer/app/my-load-balancer/50dc6c495c0c9188
```
```text:結果(例):
無し
```


6.3. リスナの削除 (delete-listener)
---------------------

リスナを削除します。関連づけられたルールも自動的に削除されます。
なお、リスナが関連づけられているロードバランサを削除すると、リスナも自動的に削除されます。

### オプション
* --listener-arn (string)
	* 削除するリスナのARNを指定します。

実行例

```bash:コマンド(例):
aws elbv2 delete-listener \
 --listener-arn arn:aws:elasticloadbalancing:ua-west-2:123456789012:listener/app/my-load-balancer/50dc6c495c0c9188/f2f7dc8efc522ab2
```
```text:結果(例):
無し
```


6.4. ルールの削除 (delete-rule)
---------------------

ルールを削除します。

### オプション
* --rule-arn (string)
	* ルールのARNを指定します。

実行例

```bash:コマンド(例):
aws elbv2 delete-rule \
 --rule-arn arn:aws:elasticloadbalancing:us-west-2:123456789012:listener-rule/app/my-load-balancer/50dc6c495c0c9188/f2f7dc8efc522ab2/1291d13826f405c3
```
```text:結果(例):
無し
```


6.5. ターゲットグループの削除 (delete-target-group)
---------------------

ターゲットグループを削除します。
どのリスナやルールのactionからも参照されていないことが必要です。
ターゲットグループを削除すると関連したヘルスチェックも削除されます。

### オプション
* --target-group-arn (string)
	* ターゲットグループのARNを指定します。

実行例

```bash:コマンド(例):
aws elbv2 delete-target-group \
 --target-group-arn arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067
```
```text:結果(例):
無し
```