# Domain App Using Amazon S3 as Data Source

## Goal:

Our goal is to help users explore the functionality of the ixHello platform without requiring integrations with any external platform. We will create an Alexa Skill named “**Retail Demo**”. Retail Demo is an app set aimed for retail customer and retail customer service provider. We will be using a Json data source and perform data retrieval operations on them.

## Steps:

The following shows the general steps/activities that will be carried out in setting up this integration. **Note:** It is advisable to use same email for signup across the 3 channels below. Step 1 -3 below are required.

1. [Sign up for Alexa account](http://alexa.amazon.com/)
2. [Sign up for Alexa developer account](file:///G:/Rami/Projects/VoiceworxDocuments/loper.amazon.com/alexa/console/ask).
3. [Sign up for ixHello platform](https://bots.ixhello.com/Account/Login?ReturnUrl=%2F)
4. Ensure you Login with Amazon (LWA) account is setup by your admin. If you are the account admin, you can follow this instruction to set it up.
5. Set up connection to the Json data source on Amazon S3
6. Create a custom skill in ixHello.
7. Publish the skill
8. Test the Alexa skill.

## Prerequisite:

1. **An active AWS Account**

You should have an active AWS Account. If you do not have it, you can create an AWS account at <https://portal.aws.amazon.com/billing/signup#/start>

*AWS Accounts Include 12 Months of Free Tier Access*

1. **An ixHello Account**

For steps to create an ixHello account, follow the steps at <https://docs.ixhello.com/general/voiceworx-create-account>

1. **Access Key, Secret access key and AWS Region Name**\
   To be able to connect to Amazon Lex from the ixHello platform, one IAM user is required and user should have the required permissions to access Lex service.

Following is a Json document which you can use to create an IAM policy and assign it to the IAM user in the AWS console.

![](/files/-MlOf_MIUeAdRHqziqnO)

For more information on creating IAM users and assigning policies, refer to the AWS official documentation <https://aws.amazon.com/premiumsupport/knowledge-center/create-access-key/>

You can also refer to the simplified ixHello documentation at <https://docs.ixhello.com/aws-iam-users>

The user shall have Amazon console account, with permission for S3 data. S3 is used as a storage for the Json data file, which the domain skills use as a data source. You can get guidance for S3 Json data source creation [here](https://app.gitbook.com/@voiceworx/s/voiceworx-ai-api/~/drafts/-MlOfLZ-yJ7fIXaI38Ch/blueprints/untitled).

## Set Up Connection to External Web API

1. To begin, login to the ixHello platform <https://bots.ixhello.com/>

**On the left navigation menu do the following:**

**Click:** Integration

**Select:** Connect System

**Click:** Add new connections

<figure><img src="/files/EXwURCcXOY8HBZpw1rt1" alt=""><figcaption></figcaption></figure>

1. In the resulting popup, choose:

**Select External System:** Custom

**Select System Type:** Amazon S3

<figure><img src="/files/HcmbujkNAm5mUgtF3wkp" alt="" width="563"><figcaption></figcaption></figure>

1. Add the following in the Amazon S3 Instance Configuration:

**Service Instance Name:** This can be any name you choose. (Remember name as you will need this for step #16).

**Consumer Key:** If you do not have a Consumer Key or Consumer Secret follow step 12 to gain Access Keys.

**Consumer secret:** If you do not have a Consumer Key or Consumer Secret follow step 12 to gain Access Keys.

**Region:** See print screen below to locate your region if you are unsure of this information.

**Click**: Validate and Save Settings.

![](/files/-MlOf_MLZyYezjJCdUL-)

1. You can access your **Consumer Key** and **Consumer Secret** from your AWS management console.

<figure><img src="/files/QguhdUK4M2cvZf8T579O" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/GN5ky9uwVihvNvY1rVxa" alt="" width="563"><figcaption></figcaption></figure>

If you are unsure of your **region**, it is also located in the AWS Management Console.

![](/files/-MlOf_MOBdV4TP5A22UP)

1. Download the key file and keep it safe for future use.

<figure><img src="/files/AcVUUA2rfA4X4GyC6SFh" alt="" width="563"><figcaption></figcaption></figure>

Amazon S3 Instance Configuration:

1. Add the following in the Amazon S3 Instance Configuration:

**Service Instance Name:** This can be any name you choose. (Remember name as you will need this for step #16).

**Consumer Key:** If you do not have a Consumer Key or Consumer Secret follow step 12 to gain Access Keys.

**Consumer secret:** If you do not have a Consumer Key or Consumer Secret follow step 12 to gain Access Keys.

**Region:** See print screen below to locate your region if you are unsure of this information.

**Click**: Validate and Save Settings.

<figure><img src="/files/60lcFgPAbBbPBQkVRJOq" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/yproNKGhFE9bk5uR3Hlm" alt=""><figcaption></figcaption></figure>

## Create Custom Skill in ixHello

1. To create a custom app in ixHello:

**Click:** Apps in left navigation menu.

**Select:** Custom Apps

**Click:** New Custom App button

<figure><img src="/files/rhFYYcyhgISFAZDRVS4A" alt=""><figcaption></figcaption></figure>

Then complete the following steps:

**Name:** Retail Demo

**Custom Skill Type: Search**

**Category:** None

**Click:** Save

<figure><img src="/files/vZIVOQfH8dgUM3KBkLsT" alt="" width="375"><figcaption></figcaption></figure>

1. In the top menu select “**Data Sources**” tab, then select “**Create New Data Source**”.

**Enter the following in the fields:**

**Name:** Retail DS

**Integration Configuration:** Amazon S3- Select the instance created in Step 11 to create the Amazon S3 integration.

**Click:** Save

<figure><img src="/files/eqSq8lN8gGZoX8Y8xpQJ" alt="" width="375"><figcaption></figcaption></figure>

1. In the top menu select “**Methods”** tab, then “**Create New Methods**”.

Enter the following in the fields:

| **Method Name**: GetProductInfoMethod                                                                                |
| -------------------------------------------------------------------------------------------------------------------- |
| **Request Type**: GetFileContents                                                                                    |
| **Parameters**: BucketName, FileName. Bucket name and filename shall match the one that are in Amazon S3.            |
| **Result Type**: ListofRecords                                                                                       |
| **Record JsonPath**: $.productCatalog\[?(@.productName=="{{ProductName}}")]                                          |
| **Empty Result Template:** I'm sorry, I could not find your product.                                                 |
| **Result Template:** Here is what i found for {{Input.ProductName}} :{{Records}}                                     |
| **Record Template:** Price : {{price}}, restock amount: {{restockAmount}}, discount : {{discount}} and tax: {{tax}}, |

![](/files/-MlOf_MTWkf86Wg5Y4nO)

![](/files/-MlOf_MUAy9dJbij8q3h)

![](/files/-MlOf_MVJjhJZtRsWqTC)

1. After the method has been created, let us test it.

![](/files/-MlOf_MWtjHhyaYPVUT4)

1. If you observe the following result in your Test Result tab, your method build is successful. You can now proceed to the next step. Otherwise, you might want to re-check your previous steps first. Since method defines the functionality of the App, this is a very crucial step.

![](/files/-MlOf_MXPbOVLTVLBCYF)

1. In the top menu select “**Intent”** tab and “**Create New Intent**”.

![](/files/-MlOf_MYnZFC7P14j3gm)

1. &#x20;Make sure to select the same method you created on Step 16.

**Name:** GetProductInfoInput

**Intent Type:** Search

**Intent Action:** Execute Method

**Data Source:** Retail DS

**Data Source Method:** GetProductInfoInput

**Click:** Save

![](/files/-MlOf_MZi6tkVIYzn13X)

1. In the top menu select “**Slots**” tab, select “**Create New Slot**”.

![](/files/-MlOf_M_viqgEs4xIGR1)

1. Note the Reprompt message is what Alexa will ask if it can’t fill/resolve the person slot.

**Name:** ProductName

**Slot Order:** 1

**Reprompt Message:** what’s the product name

**Type:** Text

**Skill:** Retail Demo

**Intent:** GetProductInfoInput

**Click:** Save

![](/files/-MlOf_MarY7LYSHyqGcx)

1. In the top menu select “**Utterance**” tab, then select “**Create New Utterance**”. Utterance are words spoken to launch specific intents.

**Value:** find product

**Custom Skill:** Retail Demo

**Intent:** GetProductInfoInput

**Click:** Save

![](/files/-MlOf_Mb7lQJQo3ybUsB)

![](/files/-MlOf_Mc2Td063NNfYxE)

1. In the top menu select “Input”, then select “**Create New Input**”.

![](/files/-MlOf_Mdm8scmxlAduI7)

Fill the following details:

**Name:** GetProductInfoInput

**Description:** (leave blank)

**Custom Skill:** Retail Demo

**Custom Intent:** GetProductInfoIntent

**Data Source:** Retail DS

**Data Source Method:** GetProductInfoMethod

**Click:** Save

![](/files/-MlOf_MevrflVf7vmbJ8)

1. Add parameters for the Custom Input GetProductInfoInput.

![](/files/-MlOf_MfbpXusnjI8X2C)

![](/files/-MlOf_Mgn-A0Cmepp8fV)

![](/files/-MlOf_Mh4N3M0u6dzEqP)

The Parameter drop down shall select the corresponding parameter described in Method section.

## Publish to Alexa

1. To publish to Alexa, create an app publishing. Select the publishing tab and click “Add App Publishing” button.

![](/files/-MlOf_Mi7inpIbYE2nea)

1. Fill the following fields:
   * **External Skill Name:** For instructional purposes we used “Retail Demo”, but this will be the name you create the skill in Alexa. Therefore, make it unique and different from the names of your other skills in Alexa.
   * **Skill Type:** Search
   * **Channel:** Alexa
   * **Uncheck the following:** Require account linking
   * **Auto Publish:** Check Auto Publish
   * **Skill Invocation:** For instructional purposes we used “**retail assistant”**. This will be what users say to launch your skill in Alexa. It must be in lower case alphabets cannot contain **START, BEGIN, STOP, EXIT, LAUNCH** and cannot contain number or special characters.
   * **Welcome Message:** Welcome to Retail Demo. How can I help you?
   * **Reprompt Message:** Find the nearest store. How else can I help you?
   * **Help Message:** Replace with sample request
   * **Optional**: Replace all placeholder values in all “Message”
   * Uncheck all the settings shown in the second image below.
   * **Click:** Publish

![](/files/-MlOf_Mjfahf6xMY9-78)

![](/files/-MlOf_Mkcz_n77PHQm28)![](/files/-MlOf_MlU8SPaEk8bSQ8)

2. Now, Publish to Alexa.

<figure><img src="/files/NoN4Z0LJ776ApgGntjDj" alt=""><figcaption></figcaption></figure>

3. Select the LWA account setup by your admin and click the “Publish to Alexa” button.

<figure><img src="/files/5OP2ZlbUwkJNNN0hfr7y" alt=""><figcaption></figcaption></figure>

4. After publishing to Alexa, you see the confirmation message and then click on Go to Alexa Skill

<figure><img src="/files/zisscsypFuBiAscqB61G" alt=""><figcaption></figcaption></figure>

1. On the Alexa skill page, ensure “**Full Build Successful**” message is shown before starting to test skill.

![](/files/-MlOf_Mo4ylSWoyqhVFG)

1. Go to “**test”** tab and change the skill test status to from “**Off**” to “**Development**”.

![](/files/-MlOf_MpVQjYV7qcicqM)

1. Invoke skill by typing the invocation name inserted in the publishing step in ixHello. If the invocation is successful, your configured welcome message will be displayed in the developer console.

![](/files/-MlOf_MqeZlTxFD4e-4B)

Congratulations! You have successfully created a domain app using S3 data.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.ixhello.com/ixhc/blueprints/domain-skill-template-using-s3-data.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
