From 3a9dd0fcb5ef33ec2bee0cc285401ab2383dfae1 Mon Sep 17 00:00:00 2001 From: Jason Hu Date: Mon, 25 Mar 2019 14:03:57 -0700 Subject: [PATCH] AWS component (#9002) * AWS component * Move notify under aws component config * tweak * :pencil2: Tweaks --- source/_components/aws.markdown | 185 +++++++++++++++++++++++++ source/images/supported_brands/aws.png | Bin 0 -> 23000 bytes 2 files changed, 185 insertions(+) create mode 100644 source/_components/aws.markdown create mode 100644 source/images/supported_brands/aws.png diff --git a/source/_components/aws.markdown b/source/_components/aws.markdown new file mode 100644 index 00000000000..c13be5b492c --- /dev/null +++ b/source/_components/aws.markdown @@ -0,0 +1,185 @@ +--- +layout: page +title: "Amazon Web Services" +description: "Instructions on how to integrate Amazon Web Services with Home Assistant." +date: 2019-03-21 00:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: aws.png +ha_category: + - Notifications +ha_release: "0.91" +--- + +The `aws` integration provides a single place to interact [Amazon Web Services](https://aws.amazon.com/). Current it provide a notification platform can send a message to [AWS SQS](https://aws.amazon.com/sqs/), [AWS SNS](https://aws.amazon.com/sns/), or invoke [AWS Lambda](https://aws.amazon.com/lambda/) functions. + +## {% linkable_title Setup %} + +You have to have an AWS account to use Amazon Web Services, create one [here](https://aws.amazon.com/free/) with a 12 months free tier benefit. Please note, even in the first 12-months, you may still be billed if you use more resources than offered in the free tier. We advise you to monitor your costs in the [AWS Billing Console](https://console.aws.amazon.com/billing/) closely. You can read the [Control your AWS costs](https://aws.amazon.com/getting-started/tutorials/control-your-costs-free-tier-budgets/) guide for more information. + +The `lambda`, `sns` and `sqs` services, used in the `aws` component, all provide an **Always Free** tier for all users even after the 12-month period. The general usage in Home Automation will most likely not reach the free tier limit. Please read [Lambda Pricing](https://aws.amazon.com/lambda/pricing/), [SNS Pricing](https://aws.amazon.com/sns/pricing/) and [SQS Pricing](https://aws.amazon.com/sqs/pricing/) for more details. + +The `aws` component is using [botocore](https://botocore.amazonaws.com/v1/documentation/api/latest/index.html) to communicate with Amazon Web Services, which is also used by the [AWS Command Client Interface](https://aws.amazon.com/cli/) tool. Therefore, `aws` shares the same credential and profiles with `awscli` tool. Please read [Configuring the AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html) to learn how to get access keys and how to manage them on your local system securely. + +## {% linkable_title Configuration %} + +To use the `aws` component and the `notify` platform in your installation, add the following to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +aws: + credentials: + - name: My AWS Account + aws_access_key_id: AWS_ID + aws_secret_access_key: AWS_SECRET + notify: + # use the first credential defined in aws component by default + - service: lambda + region_name: us-east-1 +``` + +### {% linkable_title Configuration for credentials %} + +{% configuration %} +name: + description: Give your AWS credential a name, so that you can refer it in other AWS platforms. + required: true + type: string +aws_access_key_id: + description: Your AWS Access Key ID. If provided, you must also provide an `aws_secret_access_key` and must **not** provide a `profile_name`. + required: Required if aws_secret_access_key is provided + type: string +aws_secret_access_key: + description: Your AWS Secret Access Key. If provided, you must also provide an `aws_access_key_id` and must **not** provide a `profile_name`. + required: Required if aws_access_key_id is provided + type: string +profile_name: + description: A credentials profile name. + required: false + type: string +region_name: + description: The region identifier to connect to. + required: true + default: "`us-east-1`" + type: string +name: + description: Setting the optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the service `notify.NOTIFIER_NAME`. + required: false + default: notify + type: string +context: + description: An optional dictionary you can provide to pass custom context through to the Lambda function. + required: false + type: string +{% endconfiguration %} + +### {% linkable_title Configuration for notify %} + +{% configuration %} +service: + description: Amazon Web Services will be used for notification. You can choose from `lambda`, `sns`, or `sqs`. + required: true + type: string +region_name: + description: The region identifier to connect to, for example, `us-east-1`. + required: true + type: string +credential_name: + description: A reference to a `aws` credential. Notify platform will use the `default profile` defined in `~/.aws` if none of `credential_name`, `aws_access_key_id`, or `profile_name` was given. + required: false + type: string +aws_access_key_id: + description: Your AWS Access Key ID. If provided, you must also provide an `aws_secret_access_key`. + required: false + type: string +aws_secret_access_key: + description: Your AWS Secret Access Key. If provided, you must also provide an `aws_access_key_id`. + required: Required if aws_access_key_id is provided + type: string +profile_name: + description: A credentials profile name. + required: false + type: string +name: + description: Setting the optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the service `notify.NOTIFIER_NAME`. + required: false + default: notify + type: string +context: + description: An optional dictionary you can provide to pass custom context through to the notification handler. + required: false + type: string +{% endconfiguration %} + +## {% linkable_title Lambda Notify Usage %} + +AWS Lambda is a notification platform and thus can be controlled by calling the `notify` service [as described here](/components/notify/). It will invoke a Lambda for all targets given in the notification payload. A target can be formatted as a function name, an entire ARN ([Amazon Resource Name](http://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html)) or a partial ARN. For more information, please see the [botocore docs](https://botocore.amazonaws.com/v1/documentation/api/latest/reference/services/lambda.html#Lambda.Client.invoke). + +The Lambda event payload will contain everything passed in the service call payload. Here is an example payload that would be sent to Lambda: + +```json +{ + "title": "Test message!", + "target": "arn:aws:lambda:us-east-1:123456789012:function:ProcessKinesisRecords", + "data": { + "test": "okay" + }, + "message": "Hello world!" +} +``` + +The context will look like this: + +```json +{ + "custom": { + "two": "three", + "test": "one" + } +} +``` + +## {% linkable_title SNS Notify Usage %} + +AWS SNS is a notification platform and thus can be controlled by calling the `notify` service [as described here](/components/notify/). It will publish a message to all targets given in the notification payload. A target must be a SNS topic or endpoint ARN ([Amazon Resource Name](http://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html)). For more information, please see the [botocore docs](https://botocore.amazonaws.com/v1/documentation/api/latest/reference/services/sns.html#SNS.Client.publish). + +If one exists, the SNS Subject will be set to the title. All attributes from the payload, except the message, will be sent as stringified message attributes. + +### {% linkable_title Setting up SNS within AWS %} + +- Log into your AWS console and under "Security and Identity", select "Identity & Access Management". +- On the left-hand side, select "Users" then click "Create New Users". Enter a name here and then click "Create". +- You can either download the credentials or click the arrow to display them one time. + +

+ If you do not download them, you will lose them and will have to recreate a new user. +

+ +- Copy/Paste the two keys that are shown here in your `configuration.yaml` file. +- On the left-hand side of the screen go back to "Users" and select the user you just created. On the "Permissions" tab click the "Attach Policy" icon. Search for "SNS" and attach the policy "AmazonSNSFUullAccess". +- Back to the AWS Console you now need to find "SNS" and click in to that service. It is under the Mobile Services group. +- On the left-hand side, select "Topics" then "Create new topic". +- Choose a Topic Name and Display Name. +- Now check the box next to the Topic you just created and under Actions, select "Subscribe to topic". +- In the box that pops up, select the Protocol = SMS and enter in the phone number next to "Endpoint" you wish to SMS. Now click "Create". +- Repeat for additional numbers. +- Back in the "Users" section you will see a long alphanumeric line that starts with "arn:" and ends with the Topic Name you choose previously. This is what your "target" in Home Assistant will be. + +## {% linkable_title SQS Notify Usage %} + +AWS SQS is a notification platform and thus can be controlled by calling the `notify` service [as described here](/components/notify/). It will publish a message to the queue for all targets given in the notification payload. A target must be a SQS topic URL. For more information, please see the [SQS docs](http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/ImportantIdentifiers.html) and [bototcore docs](https://botocore.amazonaws.com/v1/documentation/api/latest/reference/services/sqs.html#SQS.Client.send_message) + +The SQS event payload will contain everything passed in the service call payload. SQS payloads will be published as stringified JSON. All attributes from the payload, except message, will also be sent as stringified message attributes. Here is an example message that would be published to the SQS queue: + +```json +{ + "title": "Test message!", + "target": "http://sqs.us-east-1.amazonaws.com/123456789012/queue2", + "data": { + "test": "okay" + }, + "message": "Hello world!" +} +``` diff --git a/source/images/supported_brands/aws.png b/source/images/supported_brands/aws.png new file mode 100644 index 0000000000000000000000000000000000000000..5417dcde712b3bf65d4cf150809db260d3050c71 GIT binary patch literal 23000 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