123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471 |
- [[cloud-aws]]
- === AWS Cloud Plugin
- The Amazon Web Service (AWS) Cloud plugin uses the
- https://github.com/aws/aws-sdk-java[AWS API] for unicast discovery, and adds
- support for using S3 as a repository for
- {ref}/modules-snapshots.html[Snapshot/Restore].
- [[cloud-aws-install]]
- [float]
- ==== Installation
- This plugin can be installed using the plugin manager:
- [source,sh]
- ----------------------------------------------------------------
- sudo bin/plugin install cloud-aws
- ----------------------------------------------------------------
- The plugin must be installed on every node in the cluster, and each node must
- be restarted after installation.
- [[cloud-aws-remove]]
- [float]
- ==== Removal
- The plugin can be removed with the following command:
- [source,sh]
- ----------------------------------------------------------------
- sudo bin/plugin remove cloud-aws
- ----------------------------------------------------------------
- The node must be stopped before removing the plugin.
- [[cloud-aws-usage]]
- ==== Getting started with AWS
- The plugin will default to using
- http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html[IAM Role]
- credentials for authentication. These can be overridden by, in increasing
- order of precedence, system properties `aws.accessKeyId` and `aws.secretKey`,
- environment variables `AWS_ACCESS_KEY_ID` and `AWS_SECRET_KEY`, or the
- elasticsearch config using `cloud.aws.access_key` and `cloud.aws.secret_key`:
- [source,yaml]
- ----
- cloud:
- aws:
- access_key: AKVAIQBF2RECL7FJWGJQ
- secret_key: vExyMThREXeRMm/b/LRzEB8jWwvzQeXgjqMX+6br
- ----
- [[cloud-aws-usage-security]]
- ===== Transport security
- By default this plugin uses HTTPS for all API calls to AWS endpoints. If you wish to configure HTTP you can set
- `cloud.aws.protocol` in the elasticsearch config. You can optionally override this setting per individual service
- via: `cloud.aws.ec2.protocol` or `cloud.aws.s3.protocol`.
- [source,yaml]
- ----
- cloud:
- aws:
- protocol: https
- s3:
- protocol: http
- ec2:
- protocol: https
- ----
- In addition, a proxy can be configured with the `proxy_host` and `proxy_port` settings (note that protocol can be
- `http` or `https`):
- [source,yaml]
- ----
- cloud:
- aws:
- protocol: https
- proxy_host: proxy1.company.com
- proxy_port: 8083
- ----
- You can also set different proxies for `ec2` and `s3`:
- [source,yaml]
- ----
- cloud:
- aws:
- s3:
- proxy_host: proxy1.company.com
- proxy_port: 8083
- ec2:
- proxy_host: proxy2.company.com
- proxy_port: 8083
- ----
- [[cloud-aws-usage-region]]
- ===== Region
- The `cloud.aws.region` can be set to a region and will automatically use the relevant settings for both `ec2` and `s3`.
- The available values are:
- * `us-east` (`us-east-1`)
- * `us-west` (`us-west-1`)
- * `us-west-1`
- * `us-west-2`
- * `ap-southeast` (`ap-southeast-1`)
- * `ap-southeast-1`
- * `ap-southeast-2`
- * `ap-northeast` (`ap-northeast-1`)
- * `eu-west` (`eu-west-1`)
- * `eu-central` (`eu-central-1`)
- * `sa-east` (`sa-east-1`)
- * `cn-north` (`cn-north-1`)
- [[cloud-aws-usage-signer]]
- ===== EC2/S3 Signer API
- If you are using a compatible EC2 or S3 service, they might be using an older API to sign the requests.
- You can set your compatible signer API using `cloud.aws.signer` (or `cloud.aws.ec2.signer` and `cloud.aws.s3.signer`)
- with the right signer to use. Defaults to `AWS4SignerType`.
- [[cloud-aws-discovery]]
- ==== EC2 Discovery
- ec2 discovery allows to use the ec2 APIs to perform automatic discovery (similar to multicast in non hostile multicast
- environments). Here is a simple sample configuration:
- [source,yaml]
- ----
- discovery:
- type: ec2
- ----
- The ec2 discovery is using the same credentials as the rest of the AWS services provided by this plugin (`repositories`).
- See <<cloud-aws-usage>> for details.
- The following are a list of settings (prefixed with `discovery.ec2`) that can further control the discovery:
- `groups`::
- Either a comma separated list or array based list of (security) groups.
- Only instances with the provided security groups will be used in the
- cluster discovery. (NOTE: You could provide either group NAME or group
- ID.)
- `host_type`::
- The type of host type to use to communicate with other instances. Can be
- one of `private_ip`, `public_ip`, `private_dns`, `public_dns`. Defaults to
- `private_ip`.
- `availability_zones`::
- Either a comma separated list or array based list of availability zones.
- Only instances within the provided availability zones will be used in the
- cluster discovery.
- `any_group`::
- If set to `false`, will require all security groups to be present for the
- instance to be used for the discovery. Defaults to `true`.
- `ping_timeout`::
- How long to wait for existing EC2 nodes to reply during discovery.
- Defaults to `3s`. If no unit like `ms`, `s` or `m` is specified,
- milliseconds are used.
- [[cloud-aws-discovery-permissions]]
- ===== Recommended EC2 Permissions
- EC2 discovery requires making a call to the EC2 service. You'll want to setup
- an IAM policy to allow this. You can create a custom policy via the IAM
- Management Console. It should look similar to this.
- [source,js]
- ----
- {
- "Statement": [
- {
- "Action": [
- "ec2:DescribeInstances"
- ],
- "Effect": "Allow",
- "Resource": [
- "*"
- ]
- }
- ],
- "Version": "2012-10-17"
- }
- ----
- [[cloud-aws-discovery-filtering]]
- ===== Filtering by Tags
- The ec2 discovery can also filter machines to include in the cluster based on tags (and not just groups). The settings
- to use include the `discovery.ec2.tag.` prefix. For example, setting `discovery.ec2.tag.stage` to `dev` will only
- filter instances with a tag key set to `stage`, and a value of `dev`. Several tags set will require all of those tags
- to be set for the instance to be included.
- One practical use for tag filtering is when an ec2 cluster contains many nodes that are not running elasticsearch. In
- this case (particularly with high `ping_timeout` values) there is a risk that a new node's discovery phase will end
- before it has found the cluster (which will result in it declaring itself master of a new cluster with the same name
- - highly undesirable). Tagging elasticsearch ec2 nodes and then filtering by that tag will resolve this issue.
- [[cloud-aws-discovery-attributes]]
- ===== Automatic Node Attributes
- Though not dependent on actually using `ec2` as discovery (but still requires the cloud aws plugin installed), the
- plugin can automatically add node attributes relating to ec2 (for example, availability zone, that can be used with
- the awareness allocation feature). In order to enable it, set `cloud.node.auto_attributes` to `true` in the settings.
- [[cloud-aws-discovery-endpoint]]
- ===== Using other EC2 endpoint
- If you are using any EC2 api compatible service, you can set the endpoint you want to use by setting
- `cloud.aws.ec2.endpoint` to your URL provider.
- [[cloud-aws-repository]]
- ==== S3 Repository
- The S3 repository is using S3 to store snapshots. The S3 repository can be created using the following command:
- [source,json]
- ----
- PUT _snapshot/my_s3_repository
- {
- "type": "s3",
- "settings": {
- "bucket": "my_bucket_name",
- "region": "us-west"
- }
- }
- ----
- // AUTOSENSE
- The following settings are supported:
- `bucket`::
- The name of the bucket to be used for snapshots. (Mandatory)
- `region`::
- The region where bucket is located. Defaults to US Standard
- `endpoint`::
- The endpoint to the S3 API. Defaults to AWS's default S3 endpoint. Note
- that setting a region overrides the endpoint setting.
- `protocol`::
- The protocol to use (`http` or `https`). Defaults to value of
- `cloud.aws.protocol` or `cloud.aws.s3.protocol`.
- `base_path`::
- Specifies the path within bucket to repository data. Defaults to
- value of `repositories.s3.base_path` or to root directory if not set.
- `access_key`::
- The access key to use for authentication. Defaults to value of
- `cloud.aws.access_key`.
- `secret_key`::
- The secret key to use for authentication. Defaults to value of
- `cloud.aws.secret_key`.
- `chunk_size`::
- Big files can be broken down into chunks during snapshotting if needed.
- The chunk size can be specified in bytes or by using size value notation,
- i.e. `1g`, `10m`, `5k`. Defaults to `100m`.
- `compress`::
- When set to `true` metadata files are stored in compressed format. This
- setting doesn't affect index files that are already compressed by default.
- Defaults to `false`.
- `server_side_encryption`::
- When set to `true` files are encrypted on server side using AES256
- algorithm. Defaults to `false`.
- `buffer_size`::
- Minimum threshold below which the chunk is uploaded using a single
- request. Beyond this threshold, the S3 repository will use the
- http://docs.aws.amazon.com/AmazonS3/latest/dev/uploadobjusingmpu.html[AWS Multipart Upload API]
- to split the chunk into several parts, each of `buffer_size` length, and
- to upload each part in its own request. Note that positioning a buffer
- size lower than `5mb` is not allowed since it will prevents the use of the
- Multipart API and may result in upload errors. Defaults to `5mb`.
- `max_retries`::
- Number of retries in case of S3 errors. Defaults to `3`.
- `read_only`::
- Makes repository read-only. coming[2.1.0] Defaults to `false`.
- The S3 repositories use the same credentials as the rest of the AWS services
- provided by this plugin (`discovery`). See <<cloud-aws-usage>> for details.
- Multiple S3 repositories can be created. If the buckets require different
- credentials, then define them as part of the repository settings.
- [[cloud-aws-repository-permissions]]
- ===== Recommended S3 Permissions
- In order to restrict the Elasticsearch snapshot process to the minimum required resources, we recommend using Amazon
- IAM in conjunction with pre-existing S3 buckets. Here is an example policy which will allow the snapshot access to an
- S3 bucket named "snaps.example.com". This may be configured through the AWS IAM console, by creating a Custom Policy,
- and using a Policy Document similar to this (changing snaps.example.com to your bucket name).
- [source,js]
- ----
- {
- "Statement": [
- {
- "Action": [
- "s3:ListBucket",
- "s3:GetBucketLocation",
- "s3:ListBucketMultipartUploads",
- "s3:ListBucketVersions"
- ],
- "Effect": "Allow",
- "Resource": [
- "arn:aws:s3:::snaps.example.com"
- ]
- },
- {
- "Action": [
- "s3:GetObject",
- "s3:PutObject",
- "s3:DeleteObject",
- "s3:AbortMultipartUpload",
- "s3:ListMultipartUploadParts"
- ],
- "Effect": "Allow",
- "Resource": [
- "arn:aws:s3:::snaps.example.com/*"
- ]
- }
- ],
- "Version": "2012-10-17"
- }
- ----
- You may further restrict the permissions by specifying a prefix within the bucket, in this example, named "foo".
- [source,js]
- ----
- {
- "Statement": [
- {
- "Action": [
- "s3:ListBucket",
- "s3:GetBucketLocation",
- "s3:ListBucketMultipartUploads",
- "s3:ListBucketVersions"
- ],
- "Condition": {
- "StringLike": {
- "s3:prefix": [
- "foo/*"
- ]
- }
- },
- "Effect": "Allow",
- "Resource": [
- "arn:aws:s3:::snaps.example.com"
- ]
- },
- {
- "Action": [
- "s3:GetObject",
- "s3:PutObject",
- "s3:DeleteObject",
- "s3:AbortMultipartUpload",
- "s3:ListMultipartUploadParts"
- ],
- "Effect": "Allow",
- "Resource": [
- "arn:aws:s3:::snaps.example.com/foo/*"
- ]
- }
- ],
- "Version": "2012-10-17"
- }
- ----
- The bucket needs to exist to register a repository for snapshots. If you did not create the bucket then the repository
- registration will fail. If you want elasticsearch to create the bucket instead, you can add the permission to create a
- specific bucket like this:
- [source,js]
- ----
- {
- "Action": [
- "s3:CreateBucket"
- ],
- "Effect": "Allow",
- "Resource": [
- "arn:aws:s3:::snaps.example.com"
- ]
- }
- ----
- [[cloud-aws-repository-endpoint]]
- ===== Using other S3 endpoint
- If you are using any S3 api compatible service, you can set a global endpoint by setting `cloud.aws.s3.endpoint`
- to your URL provider. Note that this setting will be used for all S3 repositories.
- Different `endpoint`, `region` and `protocol` settings can be set on a per-repository basis
- See <<cloud-aws-repository>> for details.
- [[cloud-aws-testing]]
- ==== Testing AWS
- Integrations tests in this plugin require working AWS configuration and therefore disabled by default. Three buckets
- and two iam users have to be created. The first iam user needs access to two buckets in different regions and the final
- bucket is exclusive for the other iam user. To enable tests prepare a config file elasticsearch.yml with the following
- content:
- [source,yaml]
- ----
- cloud:
- aws:
- access_key: AKVAIQBF2RECL7FJWGJQ
- secret_key: vExyMThREXeRMm/b/LRzEB8jWwvzQeXgjqMX+6br
- repositories:
- s3:
- bucket: "bucket_name"
- region: "us-west-2"
- private-bucket:
- bucket: <bucket not accessible by default key>
- access_key: <access key>
- secret_key: <secret key>
- remote-bucket:
- bucket: <bucket in other region>
- region: <region>
- external-bucket:
- bucket: <bucket>
- access_key: <access key>
- secret_key: <secret key>
- endpoint: <endpoint>
- protocol: <protocol>
- ----
- Replace all occurrences of `access_key`, `secret_key`, `endpoint`, `protocol`, `bucket` and `region` with your settings.
- Please, note that the test will delete all snapshot/restore related files in the specified buckets.
- To run test:
- [source,sh]
- ----
- mvn -Dtests.aws=true -Dtests.config=/path/to/config/file/elasticsearch.yml clean test
- ----
|