aws
===

TPAは、AWS
EC2での運用クラスターのプロビジョニングを完全にサポートしています。

APIアクセス設定
---------------

AWS APIを使用するには、次のことを行う必要があります。

- `Obtain an access keypair <https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html>`_ 

- `Add it to your configuration <https://boto.readthedocs.org/en/latest/boto_config_tut.html>`_ 

例

.. code:: shell

   cat > ~/.aws/credentials

.. code:: output

   [default]
   aws_access_key_id = AKIAIOSFODNN7EXAMPLE
   aws_secret_access_key = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

tpaexecがそれを使用してec2リソースをプロビジョニングできるように、IAMユーザーは少なくとも次の権限セットを持っている必要があります。

::

   ec2:AssociateRouteTable
   ec2:AttachInternetGateway
   ec2:AuthorizeSecurityGroupIngress
   ec2:CreateInternetGateway
   ec2:CreateRoute
   ec2:CreateRouteTable
   ec2:CreateSecurityGroup
   ec2:CreateSubnet
   ec2:CreateTags
   ec2:CreateVpc
   ec2:DeleteKeyPair
   ec2:DeleteRouteTable
   ec2:DeleteSecurityGroup
   ec2:DeleteSubnet
   ec2:DeleteVpc
   ec2:DescribeImages
   ec2:DescribeInstanceStatus
   ec2:DescribeInstances
   ec2:DescribeInternetGateways
   ec2:DescribeKeyPairs
   ec2:DescribeRouteTables
   ec2:DescribeSecurityGroups
   ec2:DescribeSubnets
   ec2:DescribeTags
   ec2:DescribeVolumes
   ec2:DescribeVpcAttribute
   ec2:DescribeVpcClassicLink
   ec2:DescribeVpcClassicLinkDnsSupport
   ec2:DescribeVpcs
   ec2:DisassociateRouteTable
   ec2:ImportKeyPair
   ec2:ModifyVpcAttribute
   ec2:RevokeSecurityGroupIngress
   ec2:RunInstances
   ec2:TerminateInstances
   iam:AddRoleToInstanceProfile
   iam:CreateInstanceProfile
   iam:CreateRole
   iam:DeleteInstanceProfile
   iam:DeleteRole
   iam:DeleteRolePolicy
   iam:GetInstanceProfile
   iam:GetRole
   iam:GetRolePolicy
   iam:ListAttachedRolePolicies
   iam:ListGroups
   iam:ListInstanceProfiles
   iam:ListInstanceProfilesForRole
   iam:ListRolePolicies
   iam:ListRoles
   iam:ListUsers
   iam:PassRole
   iam:PutRolePolicy
   iam:RemoveRoleFromInstanceProfile
   kms:CreateGrant
   kms:GenerateDataKeyWithoutPlaintext
   s3:CreateBucket
   s3:GetBucketVersioning
   s3:GetObject
   s3:GetObjectTagging
   s3:ListAllMyBuckets
   s3:ListBucket
   s3:ListBucketVersions
   s3:PutBucketOwnershipControls
   s3:PutObject
   s3:PutObjectAcl

はじめに
--------

サービスは物理的に `regions and availability zones <https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html>`_ 
に分割されます。アベイラビリティーゾーンは、リージョンコードに続いて1文字のeu-west-1aなどで表されますが、その名前は、異なるAWSアカウントの異なる場所を参照する場合があり、アカウント間の解釈を調整する方法はありません。

AWSリージョンは互いに完全に分離され、リソースを共有しません。リージョン内のアベイラビリティーゾーンは物理的に分離され、論理的にほとんど分離されていますが、低遅延リンクで接続され、特定のネットワークリソースを共有できます。

ネットワーキング
^^^^^^^^^^^^^^^^

AWSのすべてのネットワーク構成は、 `Virtual Private Cloud <https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-vpc.html>`_ のコンテキストで発生します

リージョン内で。 VPC内で、 `subnets <https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_Subnets.html>`_ を作成できます

インターネットゲートウェイ、ルーティングテーブルなどとともに、特定のアベイラビリティーゾーンに関連付けられています。

`Security Groups <https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-network-security.html#vpc-security-groups>`_ は、いくつでも作成できます

インスタンスに許可されるインバウンドおよびアウトバウンドトラフィックのルール、プロトコル、宛先ポートレンジ、およびソースまたは宛先IPアドレスレンジの観点から。

インスタンス
^^^^^^^^^^^^

AWS EC2は、さまざまな `instance types <https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html>`_ を提供します

異なる価格/パフォーマンスポイントで異なるハードウェア構成を使用します。特定のアベイラビリティーゾーンのサブネット内に、
`EC2 instances <https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Instances.html>`_ を作成できます。

`AMI <https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AMIs.html>`_ と呼ばれるディストリビューションイメージに基づいて、1つ以上の `EBS volumes <https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AmazonEBS.html>`_ をアタッチします

インスタンスに永続ストレージを提供します。
`SSH public key <https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html>`_ を登録することにより、インスタンスにSSH接続できます。

インスタンスには、サブネット内のプライベートIPアドレスが常に割り当てられます。サブネット構成によっては、
`ephemeral public IP address <https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-instance-addressing.html#concepts-public-addresses>`_ が割り当てられる場合があります。

これは、インスタンスがシャットダウンすると失われ、再起動されたときに別のエフェメラルIPが割り当てられます。代わりに、
`Elastic IP <https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html>`_ と呼ばれる静的リージョン固有のルーティング可能IPアドレスを割り当てることができます。

任意のインスタンスに。

外部からインスタンスに到達できるようにするには、ルーティング可能なIPアドレスを持つだけでなく、VPCのネットワーク構成インターネットゲートウェイ、ルーティングテーブル、セキュリティグループもアクセスを許可するように調整する必要があります。

構成
----

ここでは、 ``tpaexec configure``
を介して指定できる、またはconfig.ymlで直接定義できるAWS固有の設定の簡単な説明を示します。

リージョン
^^^^^^^^^^

``--region`` または\ ``--regions``
で使用するクラスターの1つ以上のリージョンを指定できます。
TPAは、それぞれに関連する必要なvpcエントリを生成し、可能な場合は異なるアベイラビリティーゾーンを使用してロケーションをこれらのリージョンに均等に分散します。

``regions`` は\ ``locations``
とは異なり、各ロケーションはリージョンおよびこのリージョン内のアベイラビリティーゾーンに属します。
``regions`` はAWS固有のオブジェクト、\ ``locations``
はクラスターオブジェクトです。

注
複数のリージョンを指定する場合、ネットワーク構成を手動で編集する必要があります。

- ``ec2_vpc`` エントリにAWS
  vpcピアリングを使用できるように、オーバーラップしないcidrネットワークが必要です。デフォルトでは、TPAはすべてのcidrを\ ``10.33.0.0/16``
  に設定します。詳細については、 :ref:`VPC必須 <VPC必須>` を参照してください。

- 各\ ``location`` は、それらが属している\ ``ec2_vpc`` ``cidr``
  と一致する\ ``subnet`` で更新する必要があります。詳細については、
  :ref:`サブネットオプショナル <サブネットオプショナル>` を参照してください。

- TPAは\ ``cluster_rules``
  の下で基本的なルールを使用してセキュリティグループを作成します。これらは、各\ ``subnet``
  cidrの\ ``ec2_vpc``
  cidrと一致するように更新する必要があります。詳細については、
  :ref:`セキュリティグループオプショナル <セキュリティグループオプショナル>` を参照してください。

- ``tpaexec deploy`` の前にVPCピアリングを手動で設定する必要があります。
  ``tpaexec configure`` を実行し、config.ymlで\ ``vpc-id``
  を使用する前に、VPCと必要なVPCピアリングを作成することをお勧めします。詳細については、
  :ref:`VPC必須 <VPC必須>` を参照してください。

VPC必須
^^^^^^^

使用するVPCを指定する必要があります。

::

   ec2_vpc:
     Name: Test
     cidr: 10.33.0.0/16

これはデフォルト構成であり、指定されたCIDRでTestという名前のVPCが存在しない場合は作成し、それ以外の場合は既存のVPCを使用します。

VPCを作成するには、名前とcidrの両方を指定する必要があります。
VPC名のみを指定した場合、一致するVPCが存在しない場合、TPAは失敗します。

TPAがVPCを作成すると、\ ``tpaexec deprovision``
はそれを削除しようとしますが、既存のVPCはそのままにしておきます。
AWSにはアカウントごとのVPC数に1桁のデフォルト制限があるため、新しいVPCを作成する前によく考えてください。

より詳細なマッチングが必要な場合、またはさまざまなリージョンでさまざまなVPCを指定する場合、展開されたフォームを使用できます。

::

   ec2_vpc:
     eu-west-1:
       Name: Test
       cidr: 172.16.0.0/16
     us-east-1:
       filters:
         vpc-id: vpc-nnn
     us-east-2:
       Name: Example
       filters:
         [filter expressions]

AMI 必須
^^^^^^^^

使用するAMIを指定する必要があります。

::

   ec2_ami:
     Name: xxx
     Owner: self

より正確なマッチングのためにフィルタ仕様を追加できます。

::

   ec2_ami:
     Name: xxx
     Owner: self
     filters:
       architecture: x86_64
       [more key/value filters]

デフォルトでは、 ``tpaexec configure`` は\ ``--distribution``
引数に基づいて、適切な\ ``ec2_ami`` を選択します。

サブネットオプショナル
^^^^^^^^^^^^^^^^^^^^^^

すべてのインスタンスは、そのサブネットをCIDR形式で、またはsubnet-xxx
IDとして指定する必要があります。オプションで、作成する各サブネットの名前とアベイラビリティーゾーンを指定できます。

::

   ec2_vpc_subnets:
     us-east-1:
       192.0.2.0/27:
         az: us-east-1b
         Name: example1
       192.0.2.100/27:
         az: us-east-1b
         Name: example2

セキュリティグループオプショナル
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

デフォルトでは、クラスターのセキュリティグループを作成します。
1つ以上の既存のセキュリティグループを使用するには、次のように設定します。

::

   ec2_groups:
     us-east-1:
       group-name:
         - foo

デフォルトのセキュリティグループのルールをカスタマイズする場合は、
``cluster_rules`` を設定します。

::

   cluster_rules:

   - cidr_ip: 0.0.0.0/0
     from_port: 22
     proto: tcp
     to_port: 22

   - cidr_ip: 192.0.2.0/27
     from_port: 0
     proto: tcp
     to_port: 65535

   - cidr_ip: 192.0.2.100/27
     from_port: 0
     proto: tcp
     to_port: 65535

この例では、任意のアドレスからのsshポート22、および特定のIPレンジからの任意のポートでのTCP接続を許可します。注
from_portおよびto_portは、ソースと宛先ではなく、ポートの数値範囲を定義します。

カスタムルールを設定するか、既存のセキュリティグループを使用する場合、クラスター内のインスタンスが必要に応じて相互に通信を許可されていることを確認する必要がありますたとえば、PostgresのTCP/5432を許可します。

インターネットゲートウェイオプショナル
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

デフォルトでは、次を設定しない限り、すべてのVPCのインターネットゲートウェイを作成します。

::

   ec2_instance_reachability: private

より詳細な制御のために、次を設定できます。

::

   ec2_vpc_igw:
     eu-west-1: yes
     eu-central-1: yes
     us-east-1: no

SSHキーオプション
^^^^^^^^^^^^^^^^^

.. code:: yaml


   #  Set this to change the name under which we register our SSH key.

   #  ec2_key_name: tpa_cluster_name

   # 
   #  Set this to use an already-registered key.

   #  ec2_instance_key: xxx

S3バケットオプション
^^^^^^^^^^^^^^^^^^^^

TPAでは、AWSクラスターをプロビジョニングするためにS3バケットへのアクセスが必要です。このバケットは、SSHホストキーなどのファイルを一時的に保存するために使用されますが、他のクラスターデータバックアップなどに使用される場合があります。

デフォルトでは、TPAはプロビジョニングするクラスターに\ ``edb-tpa-<aws-account-user-id>``
という名前のS3バケットを使用します。バケットが存在しない場合、TPAにバケットを作成するかどうかを確認するメッセージが表示されます。

代わりに既存のS3バケットを使用するには、次のように設定します

::

   cluster_bucket: name-of-bucket

確認プロンプトを表示せずにデフォルトのバケット名を受け入れるように\ ``cluster_bucket: auto``
を設定することもできます。

クラスターのプロビジョニングを解除するときに、TPAはS3バケットを削除しません。バケットを自分で削除するには、次を実行します。

::

   aws s3 rb s3://<bucket> --force

インスタンスのプロビジョニングに使用しているIAMユーザーには、このバケットへの読み取りおよび書き込みアクセスが必要です。プロビジョニング中に、tpaexecは、インスタンスプロファイルを介してcluster_bucketへの読み取り専用アクセスをインスタンスに提供します。

Elastic IPアドレス
^^^^^^^^^^^^^^^^^^

Elastic IPアドレスを使用するには、 config.ymlで\ ``assign_elastic_ip``
を\ ``true``
に設定します。クラスター内のすべてのインスタンスに影響を与えるように\ ``instance_defaults``
で、または必要に応じて別のインスタンスに個別に。デフォルトでは、これにより、新しいElastic
IPアドレスが割り当てられ、新しいインスタンスに割り当てられます。割り当て済みだがまだ割り当てられていないElastic
IPアドレスを使用するには、 ``elastic_ip: 34.252.55.252``
を使用して、割り当てられたアドレスに置き換えます。

インスタンスプロファイルオプショナル
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. code:: yaml


   #  Set this to change the name of the instance profile role we create.

   #  cluster_profile: cluster_name_profile

   # 
   #  Set this to use an existing instance profile (which must have all the

   #  required permissions assigned to it).

   #  instance_profile_name: xxx
