Right way to block ANIs using Amazon Connect

April 20, 2018

In this blog I’ll cover a potential financial issue you might face if you try to ANI block customers and they are calling you through a SIP trunk.

As I continue my journey of getting familiar with Amazon Connect I ran into an interesting and a bit worrisome issue. The use case I was working on was to create a table which blocks or allows specific ANIs to call in. Ultimately, when a blocked caller came in I wanted to just hang up on the call. My original flow looked like this:

image

Pretty straight forward, invoke Lambda, check attribute and if blocked = true, disconnect the call. When calling from my cellphone this worked great. However, when calling from my home phone (using a Flowroute SIP trunk) I got a nice surprise in the logs:

image

What you’re seeing is a partial log of my home phone constantly retrying to connect to Amazon Connect and generating a new call each time. Since there was no prompt play and no ring back heard I assume the network believes there as a connection issue and continues to try and connect. Which means that you could easily incur a huge expense both on your phone provider and on your Amazon AWS bill.

The way to fix this was to play a 1 second of silence prompt before disconnecting the call.

image

~david

Amazon Connect and Sticky Queue

April 14, 2018

In this blog I’ll discuss how to achieve a sticky queue using Amazon Connect.

When a customer calls back within a short amount of time, it’s fairly safe to assume they are calling back for the same reason as before. This is often referred as sticky agent or sticky queue. Because you’re trying to “stick” a queue or agent to a specific customer. As a best practice avoid using anything sticky as it could force your customer down the wrong path or create long hold times when too many callers are stuck to a single agent or queue, but for my use case it’s safe to use because I want to use it. :)

I assume you already have a Lambda function or two working with your flow, if you don’t then you might want to skip this functionality until you get that working. The first thing you need to do is find the ARN for your queues. I’m going to be honest, this is not intuitive at all and I wish the Connect team would allow you to retrieve this information via the flow without having to do the following steps.

To get your Queue ARN go to your queues via https://<your instance>.awsapps.com/connect/queues, select a single queue, and notice the bold section of the url https://<your instance>.awsapps.com/connect/queues/edit?id=arn:aws:connect:us-east-1:64:instance/4d92ab25-8XXX-4bXX-aXXX-XXXXXXX/queue/XXXXXX-2022-XXXX-a275-xxXXXXxxxXXX That’s your queue’s ARN.

– Set an attribute (e.g. Queue) with your ARN.
– Set your queue name to the attribute you just set.

image

– Save your attribute to your DB.

Next time your customer calls, you can retrieve the last queue they went through and give them the option to go to that queue again, hopefully saving your customer some frustration.

image

~david

Amazon Connect Flow Designer Review

April 12, 2018

I’m trying to capture my initial notes and reactions to Amazon’s contact center offering. In this blog I’m going to focus solely on their flow designer tool. I’ll provide a brief overview of the tool, some best practices I’ve come up with, as well as some things I wish were different. Remember that I come from the Cisco contact center world, so my view is slightly tainted and what I’ve lived and loved has been the Cisco tools.

Amazon Connect provides a web based call flow tool called flow designer. Those of you familiar with ICM Script Editor and CVP Studio will feel at home. Below is one of the flows I’ve created. Note that the designer allows you to snap steps or what Amazon calls “action blocks” into the grid for cleaner looking flows.

Flow designer with flow

In the left hand side of the designer is your “palette” you can find an explanation of each action block here.

Flow Designer Palete

Building your first flow is truly easy and requires very little technical knowledge. The Play prompt block allows both playing audio files as well as text-to-speech (TTS) in a variety of voices and languages. Setting a queue and building a queue is just as easy.

Now a few items which bother me about contact flow as well as some best practices I’ve found. I touched on a few of these in my earlier post.

  • DO NOT hit the back button or navigate away from the flow designer without saving. There is no auto save!
  • You can’t copy and paste a block. You must build a block from scratch every time. I keep a file with Lambda names and variables I’m using for easy copy/paste.
  • You can’t have the block properties of multiple blocks open at the same time.
  • There is no move of multiple blocks. You must move each one at a time.
  • Build your flow strictly with TTS and only add audio files once you’re happy with the product. If you’re using dynamic speech you’ll have a better sense of what the audio files need to say.
  • Plan your error conditions flow early. This is important when handling error/default/timeout from menus, but applies across multiple different types of blocks. You should come up with a few standard error correction flows and branch out all your error conditions appropriately based on where you are in the flow. This will also avoid a spider web flow.
  • No easy way to get from flow to flow. Once you’re in the designer, you click the back button in your browser or go through the main menu to jump to another flow. Ideally Amazon provides a drop down in the designer to switch between flows to save a few clicks.
  • No infinite scroll. Specifically you can’t scroll and build your flow up or to the left. This means that you should think of starting your flows somewhere in the middle of your screen to give you a bit of real estate for last minutes changes/branches. When you create a new flow Amazon “conveniently” starts you off like in the left image, but you should move your fist block off to the right a bit, like right image. Also make sure you immediately enable “Snap to grid” for cleaner looking flows.

image image

  • You are able to move blocks behind the unmovable left hand margin. The only reason I discovered this is because I wanted to add a log block and didn’t want to pile up blocks on top of each other.

Flow designer with nodes hidden.

  • You need to be aware of where your lines are going and try to avoid overlap and tight spaces, specially when using the Get customer input block. Trying to modify a line in the middle of the block can be difficult and will require for you to delete other lines to get to the line you want to delete or modify.

image

  • DO NOT hit the back button or navigate away from the flow designer without saving. There is no auto save! Yes, it’s a repeat, happened to me multiple times.
  • When saving a flow or publishing a flow you get the same confirmation. It would be nice to be reminded what was the last action you took for those of us who are jumping from screen to screen.

Flow designer save message.

~david

Initial Observations of Amazon Connect

April 11, 2018

If you don’t know what Amazon Connect is and you’re in the contact center world, you might want to consider a new career path. Amazon Connect is AWS’s answer to the Ciscos, Genesys, Avayas of the world. Not only that, but also a competitor for Twilio, Microsoft, and anyone who carries voice from point A to point B. Needless to say, when the Amazon giant moves everyone pays attention. A lot of these are just a brain dump so pardon the brevity. I’m still trying to dig a bit deeper and come up with specific ideas to blog specially comparing Amazon’s solutions with Cisco’s offering(s).

Things which are awesome:

– Agent logs are in JSON format, holy crap that’s awesome!
– Hours of operations are available out of the box and are granular to the minute. Ability to add exceptions for the same day is a nice touch.
– If you associate an email with your agent your agent can reset their own password.

Things which are strange:

– Can’t change agent state while reserved or talking.
– If you use a desk phone, you can’t reject the call.  
– Changes take about a minute or two to propagate and there’s no notification if your changes are live or not.      
– If you create a new agent and then login as that agent using the same browser as before your admin session will be moved over to the new agent credentials. Painful when trying to test permissions on agents.     
– You can’t re-route a connector by clicking on the start point, you must first delete the existing line and then create your new connector.

Things which absolutely make no sense:

– Every step should have a Lambda invocation option. This would make the scripting a lot cleaner.
– If you reject a call and you’re the only agent you’re automatically set back to ready. Queue must be drained before last agent can change states out of available.
– No default routing? I disabled the only queue and calls just dropped when I tried to route to that queue. You would think that the system would force some sort of default routing option just in case you make a mistake.  
– Contact flow editor, no easy way to get back to all your contact flows.
– Agent auto accept takes about 12 seconds to trigger using softphone, this would impact agent stats and I really don’t see the point of having this feature if it’s going to take this long to connect an agent.
– When you save or publish a contact flow you get the same message "Contact flow saved successfully!" Different message for publish would be nice.
– No easy way to move the whole script. Work area should have infinite scroll to all sides.
– You can’t select multiple nodes and move them, you must move one by one.
– Flows don’t auto save drafts, if for some reason you don’t remember to save you’re SOL.
– How draft flows and published flows are handled is confusing. Not very user friendly.
– Checking contact attributes doesn’t offer a NULL or NOT NULL condition check.
– When a connector goes behind a flow node, you can’t delete the connector.
– No way to duplicate nodes. You must configure a new node from scratch every time.   

~david

Connecing an ESXi host to a QNAP NAS using NFS

January 30, 2018

Interesting little issue I ran into when trying to create a new datastore in my ESXi server. I had to use NFS v2/v3 even though the ESXi documention states v4 is supported. Here are my specs:

– QNAP TS-219P II 4.3.3.0404

– VMWare ESXi v6.0.0 Build 5050593

To configure the NFS share in the NAS. Control Panel > Win/MAC/NFS > NFS Service

QNAP NFS Service

To ensure your share has NFS partitions click on the link that says “Click here to set the NFS access…” Choose your shared folder and Edit Shared Folder Permissions. And click

QNAP NFS host access screen

In ESXi, click on the host server. Configuration > Storage > Add Storage…

1. Network File System

2. Server IP, Folder, Datastore Name

3. Finish

ESXi Locate Network File System

When done, you should see your NAS as a data store.

ESXi Datastore Configuration

~david

Installing Laravel 5.5 & MySQL in Ubuntu 16.04 with Nginix already installed

September 30, 2017

Here are my notes on how to install these components.

sudo apt-get install php7.0-mbstring php7.0-xml composer unzip
sudo apt-get install -y php7.0 php7.0-fpm php7.0-mysql php7.0-zip php7.0-gd
sudo apt-get install mcrypt php7.0-mcrypt
sudo apt-get install -y php7.0-mbstring php7.0-xml –force-yes
sudo apt-get install php7.0-curl php7.0-json
sudo vi /etc/php/7.0/fpm/php.ini
    cgi.fix_pathinfo=0
sudo service php7.0-fpm restart
sudo mkdir -p /var/www/laravel
sudo vi /etc/nginx/sites-available/default
server {
        listen 80;
        listen [::]:80 ipv6only=on;

        root /var/www/laravel/public;
        index index.php index.html index.htm;

        # Make site accessible from http://localhost/
        server_name <serverName>;

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ /index.php?$query_string;
                # Uncomment to enable naxsi on this location
                # include /etc/nginx/naxsi.rules
        }
        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include fastcgi_params;
        }
}
cd ~
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
sudo composer create-project laravel/laravel /var/www/laravel
sudo chown -R :www-data /var/www/laravel
sudo chmod -R 775 /var/www/laravel/storage
sudo chmod -R guo+w storage
sudo apt-get update
sudo apt-get install mysql-server
sudo mysql_secure_installation

Cisco Spark Webhooks using Node.js

February 20, 2017

I’ve been trying to come up with a reason to play around with node.js. I’ve also been trying to make some time to play around with the Cisco Spark API. So I figured I would merry the two of them. My intention was to setup a webhook on a channel, then in my node application display the messages being posted in my room. Pretty simple example, but it touches a few different things.

First, you need to setup your webhook to point to your server.

Second, you need to have node installed, in this case I’m using Ubuntu 16.04.

Third, write some code. Check out my comments to follow along.

//will use these for the POST request

var express = require("express");
var myParser = require("body-parser");
var app = express();

//will use this for the GET request

var http = require(‘https’);

app.use(myParser.json());
app.post("/", function(request, response){

console.log(request.method);

//console the webhook name as well as the name of the author of the message
console.log(‘Webhook:’+request.body.name);
console.log(‘Email:’+request.body.data.personEmail);

//setup your GET request to find out the actual message posted by the author

var options = {
host: ‘api.ciscospark.com’,
path: ‘/v1/messages/’+request.body.data.id,
headers: {
  ‘User-Agent’: ‘request’,
  ‘Authorization’: ‘Bearer MyAuth’
}
}

//make the request

http.request(options, OnResponse).end();
});

//capture the request response

function OnResponse(response){
var data = ”;
response.on(‘data’, function(chunk){
  data += chunk;
});

response.on(‘end’, function(){
  data = JSON.parse(data);

//console out the actual text
  console.log(data.text);
});
}

app.listen(8080);

~david

Cisco Finesse Desktop Tabs for Supervisors

February 13, 2017

This came up on this thread and figured I would post something about it is an easy mistake. The Finesse layout is devided into an Agent and Supervisor section. So adding a tab to the top of the default layout will only add it to the Agent view. You can tell the layouts apart by the following tags:

<layout>
    <role>Agent</role>
    <page>

</layout>

or

<layout>
    <role>Supervisor</role>
    <page>
</layout>

~david

Travels to India

January 30, 2017

I had the pleasure of traveling to India this past week. Here are a few observations for those of you who might be venturing out for the first time.

– I was expecting 3rd world, but really India is a new industrialized country (NIC). The media, stories from past colleagues, and just general lack of knowledge all were preparing me for some pretty grim experiences around the have and have nothings. Although there is some stark poverty and you see it often, it felt that the big cities were all moving in the right direction of the monetary spectrum.

– The honor system of driving. My preference would be to never drive in Mexico City, however I don’t think I could drive in India even if you put a gun to my head. There is a direct link between the driver and the car horn and this link is unbroken and used every 10 seconds. Imagine every motorized vehicle on the road using the horn for everything. You’re going to try and pass someone, horn. You’re going to make a turn, horn. You’re entering a lane, horn. The explanation was that this was the way to keep everyone around you informed that you were there and to mind you, honestly with so many horns going off at the same time, it’s difficult for me to not understand how do people not become immune to that sound. The system seems to work as I didn’t see a single accident, and traffic cops were few and far between.

– When two wheels will inherit the earth. Motorbikes and mopeds outnumber cars in the big cities. Followed by these little 3 wheel “taxis”. These vehicles are like ants, they can get into any space and will utilize any lane available. Which generally means a lane which is not a lane. What Americans would consider a normal 3 lane road for 3 cars, in India the space will allow 2 cars, 5 motorbikes, and 2 taxies to weave in and around each other in a single car length.

– Expecting Mexican Spicy. I love spicy food and I eat a lot of India food in the US which you can generally ask for it to be made spicier. No matter how much I tried, I couldn’t get anyone to give me any decent heat on any of my meals.

– Personal space means nothing. In the US we generally will occupy an elevator by moving towards the walls. You start with the call directly opposite to the door, then move to the wall closes to the controls, and finally the corners. When the walls are occupied, it’s now time to take the centered most area created by this square of people. Not in India. If the walls are utilized, someone will stand closest to whoever they see first. This means an 8 inches away, face to face ride where I found myself asking, “Is this gentleman going to try and kiss me?” I had a few other occurrences where strangers would look over my shoulder at my phone and where hand holding, hugging, and all around physical contact was significantly different than what you see in the states.

– Time zones where sleep goes to die. If you’re expecting to conduct business with your US counterparts and will be in India for any significant amount of time, prepare to hurt. The first few nights it was not so bad to have a meeting at 10:30 PM India Standard Time (IST), but anything beyond that and things got very difficult or impossible. Add to the fact that you’ll never really be on IST, but on some nebulous I’ll sleep for short periods of time and feel exhausted most of the time I’m awake time zone. Move all your meetings as early as possible. Send emails which don’t require some back and forth.

– IT is it. If you’ve been to Silicon Valley you’ll see vast zones with big building dedicated to technology. In India, you’ll see the same thing with bigger buildings an more people. I knew IT was big in India, I didn’t know just how big. I’m not sure if it’s just that the building seems larger and that people tend to spend more time outside, but it just felt bigger than any single US city.

I’m looking forward to going back, hopefully with more time and with an opportunity to travel all over the country.

~david

Armada by Ernest Cline (Who wrote Ready Player One)

November 22, 2016

This book has been on my nightstand for a long while and I finally sat down and got a chance to finish it. I didn’t hate the book, but I didn’t love it either.

First, it was a very similar premise to Ready Player One*. A young kid who lives his life playing video games and has an afinity for 80s music. Second, a lot of things felt very rushed. The book could have spent more time on the attacks and talked a bit more about Earth’s reaction. Instead it just focused on a few “dog fights” and didn’t deliver on the bigger effect accross the world. Finally, the love story seemed very forced. I understand the need to use this element, but it seemed so unecessary in the context of this book. Almost, felt like she was written in after the fact and to just check a box off.

If you’re on the fence on which book to read first or which book to read at all, skip Armada* and go for Ready Player One.

~david

*ref links

 
Powered by Wordpress and MySQL. Theme by Shlomi Noach, openark.org