Writing JavaScript Applications with the AWS SDK (TLS303) | AWS re:Invent 2013

Post on 11-May-2015

1.971 views 1 download

Tags:

description

We give a guided tour of using the AWS SDK for JavaScript to create powerful web applications. Learn the best practices for configuration, credential management, streaming requests, as well as how to use some of the higher level features in the SDK. We also show a live demonstration of using AWS services with the SDK to build a real-world JavaScript application.

Transcript of Writing JavaScript Applications with the AWS SDK (TLS303) | AWS re:Invent 2013

© 2013 Amazon.com, Inc. and its affiliates. All rights reserved. May not be copied, modified, or distributed in whole or in part without the express consent of Amazon.com, Inc.

by Loren SegalNovember 15th, 2013

Writing JavaScript Applications with the AWS SDK

Wednesday, November 27, 13

JavaScriptis everywhere.

Wednesday, November 27, 13

AWS SDK forJavaScript in Node.js

Almost a year old!

Wednesday, November 27, 13

AWS SDK forJavaScript in the Browser

Desktop or mobile devices

Wednesday, November 27, 13

Let’s use them.

Wednesday, November 27, 13

Goals

Wednesday, November 27, 13

Goals

1. Learn about AWS SDK for Node.js

Wednesday, November 27, 13

Goals

1. Learn about AWS SDK for Node.js

2. Introduce AWS SDK for JavaScript in the Browser

Wednesday, November 27, 13

Goals

1. Learn about AWS SDK for Node.js

2. Introduce AWS SDK for JavaScript in the Browser

3. Write a two-tiered web application using JavaScript, HTML, and CSS

Wednesday, November 27, 13

AWS SDK for Node.js

Wednesday, November 27, 13

Full Service CoverageSupport for over 30 AWS services

Wednesday, November 27, 13

Extensible ClientsCustomize any part of the request cycle

Wednesday, November 27, 13

Standard Node.js IdiomsStreams, EventEmitter, Domains

Wednesday, November 27, 13

Open SourceApache License, Version 2.0

http://github.com/aws/aws-sdk-js

Wednesday, November 27, 13

Getting StartedAWS SDK for Node.js

Wednesday, November 27, 13

$ npm install aws-sdkBash

Installing

Wednesday, November 27, 13

var AWS = require(‘aws-sdk’);JS

Loading

Wednesday, November 27, 13

Configuringthe SDKAWS.config

Wednesday, November 27, 13

Configuringthe SDKAWS.config

Credentials *

* Required by the SDK

Wednesday, November 27, 13

Configuringthe SDKAWS.config

Credentials *Region *

* Required by the SDK

Wednesday, November 27, 13

Configuringthe SDKAWS.config

Credentials *Region *Extras

* Required by the SDK

Wednesday, November 27, 13

Configuring Credentials

Wednesday, November 27, 13

Configuring Credentials

IAM roles for EC2 Instances

Wednesday, November 27, 13

Configuring Credentials

IAM roles for EC2 InstancesEnvironment Variables

Wednesday, November 27, 13

Configuring Credentials

IAM roles for EC2 InstancesEnvironment VariablesFile System (outside source control)

Wednesday, November 27, 13

Do Not Hardcode Credentials

Unless they are read-only and scoped to specific resources.Wednesday, November 27, 13

IAM Roles for EC2 Instances

=Zero Configuration

Wednesday, November 27, 13

Environment VariablesAWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_REGION*

Wednesday, November 27, 13

ConfiguringRegion and Extras

Wednesday, November 27, 13

AWS.config.update({ region: ‘us-west-2’, // AWS_REGION maxRetries: 10, // default: 3 logger: process.stdout, // ... more options ...});

JS

Wednesday, November 27, 13

AWS.config.loadFromPath(‘./config.json’);JS

Config From a File

If this file contains credentials, keep it out of source control

Wednesday, November 27, 13

Working with Services

Wednesday, November 27, 13

Service Objects

Wednesday, November 27, 13

Service Objects

AWS.S3

Wednesday, November 27, 13

Service Objects

AWS.S3AWS.EC2

Wednesday, November 27, 13

Service Objects

AWS.S3AWS.EC2AWS.DynamoDB

Wednesday, November 27, 13

Service Objects

AWS.S3AWS.EC2AWS.DynamoDBAWS.SQS

Wednesday, November 27, 13

Service Objects

AWS.S3AWS.EC2AWS.DynamoDBAWS.SQSAWS.SNS

Wednesday, November 27, 13

Service Objects

AWS.S3AWS.EC2AWS.DynamoDBAWS.SQSAWS.SNS...

Wednesday, November 27, 13

var ec2 = new AWS.EC2([config]);JS

Constructing a Service Object

Wednesday, November 27, 13

ec2.describeInstances(params, callback);JS

Calling an Operation

Wednesday, November 27, 13

function (err, data) { ... }JS

The Callback

Wednesday, November 27, 13

var req = ec2.describeInstances(params);JS

Getting a Request Object

Wednesday, November 27, 13

var resp = req.send(callback);JS

Sending the Request Object

Wednesday, November 27, 13

req.on(‘complete’, function(resp) { ... });JS

Adding Listenersto the Request Object

Wednesday, November 27, 13

The Request Cycle

Wednesday, November 27, 13

Send AWS.RequestGet AWS.Response

Wednesday, November 27, 13

Request Lifecycle

Wednesday, November 27, 13

Operation

Request Lifecycle

Wednesday, November 27, 13

Operation

Request Lifecycle

Wednesday, November 27, 13

AWS.Request

Operation

Request Lifecycle

Wednesday, November 27, 13

AWS.Request

Operation

Request Lifecycle

send()

Wednesday, November 27, 13

AWS.Request

Operation

build sign send

completesuccess

error

Emitted Lifecycle Events

... ... ...

Request Lifecycle

send()

Wednesday, November 27, 13

AWS.Request

Operation

build sign send

completesuccess

error

Emitted Lifecycle Events

... ... ...

Request Lifecycle

callbacksend()

Wednesday, November 27, 13

AWS.Request

Operation

AWS.Response

build sign send

completesuccess

error

Emitted Lifecycle Events

... ... ...

Request Lifecycle

callbacksend()

Wednesday, November 27, 13

AWS.Request

Wednesday, November 27, 13

AWS.Request.send(callback)

Wednesday, November 27, 13

AWS.Request.send(callback).on(event, callback)

Wednesday, November 27, 13

AWS.Request.send(callback).on(event, callback).httpRequest

Wednesday, November 27, 13

AWS.Request.send(callback).on(event, callback).httpRequest...

Wednesday, November 27, 13

AWS.Response

Wednesday, November 27, 13

AWS.Response

.error

Wednesday, November 27, 13

AWS.Response

.error

.data

Wednesday, November 27, 13

AWS.Response

.error

.data

.retryCount

Wednesday, November 27, 13

AWS.Response

.error

.data

.retryCount

.httpResponse

Wednesday, November 27, 13

AWS.Response

.error

.data

.retryCount

.httpResponse

...Wednesday, November 27, 13

RequestLifecycleRecap

Wednesday, November 27, 13

RequestLifecycleRecap

Send AWS.Request

Wednesday, November 27, 13

RequestLifecycleRecap

Send AWS.RequestEmits Lifecycle Events

Wednesday, November 27, 13

RequestLifecycleRecap

Send AWS.RequestEmits Lifecycle EventsCallback with AWS.Response

Wednesday, November 27, 13

Featuresof the SDK

Wednesday, November 27, 13

SDK Features

Wednesday, November 27, 13

SDK Features

Global Configuration Object

Wednesday, November 27, 13

SDK Features

Global Configuration ObjectBound Parameters

Wednesday, November 27, 13

SDK Features

Global Configuration ObjectBound ParametersResponse Pagination

Wednesday, November 27, 13

SDK Features

Global Configuration ObjectBound ParametersResponse PaginationEvent Listeners (Per-Service and Global)

Wednesday, November 27, 13

SDK Features

Global Configuration ObjectBound ParametersResponse PaginationEvent Listeners (Per-Service and Global)API Version Locking

Wednesday, November 27, 13

SDK Features

Global Configuration ObjectBound ParametersResponse PaginationEvent Listeners (Per-Service and Global)API Version LockingSecure Credential Management

Wednesday, November 27, 13

AWS SDKfor JavaScriptin the Browser

Wednesday, November 27, 13

Developer PreviewLooking for Feedback

Wednesday, November 27, 13

language

Getting the SDK<script src=”https://sdk.amazonaws.com/js/aws-sdk-2.0.0-rc1.min.js” />

Wednesday, November 27, 13

5 Supported Services

Wednesday, November 27, 13

5 Supported Services

Amazon S3

Wednesday, November 27, 13

5 Supported Services

Amazon S3Amazon DynamoDB

Wednesday, November 27, 13

5 Supported Services

Amazon S3Amazon DynamoDBAmazon SQS

Wednesday, November 27, 13

5 Supported Services

Amazon S3Amazon DynamoDBAmazon SQSAmazon SNS

Wednesday, November 27, 13

5 Supported Services

Amazon S3Amazon DynamoDBAmazon SQSAmazon SNSSTS

Wednesday, November 27, 13

All Modern Browsers

28.0+ 23.0+ 10+ 17.0+ 5.1+

Wednesday, November 27, 13

Usage is the same.But in your browser or mobile device

Wednesday, November 27, 13

Configurationis Different

Wednesday, November 27, 13

Two-Tier Web Applications

Why is it different?

Wednesday, November 27, 13

Traditional Application Architecture

Other ServicesNode.js Backend

nodeJS

Your Services

Wednesday, November 27, 13

Two-Tier Application Architecture

Your ServicesnodeJS

nodeJS

nodeJS

SDK on the Device

Wednesday, November 27, 13

Benefits

Wednesday, November 27, 13

Benefits

Fewer moving parts

Wednesday, November 27, 13

Benefits

Fewer moving partsEasy prototyping

Wednesday, November 27, 13

Benefits

Fewer moving partsEasy prototypingDeploying as simple as copying files to Amazon S3

Wednesday, November 27, 13

Benefits

Fewer moving partsEasy prototypingDeploying as simple as copying files to Amazon S3Fully dynamic app for pennies a month

Wednesday, November 27, 13

Next LevelWeb Apps

Wednesday, November 27, 13

AppIdeas

Wednesday, November 27, 13

AppIdeas

Forum Software

Wednesday, November 27, 13

AppIdeas

Forum SoftwareBlog Commenting Service

Wednesday, November 27, 13

AppIdeas

Forum SoftwareBlog Commenting ServiceBlogging Platform

Wednesday, November 27, 13

AppIdeas

Forum SoftwareBlog Commenting ServiceBlogging PlatformFirefox/Chrome Extensions

Wednesday, November 27, 13

AppIdeas

Forum SoftwareBlog Commenting ServiceBlogging PlatformFirefox/Chrome ExtensionsWinRT (Metro Style) Apps

Wednesday, November 27, 13

AppIdeas

Forum SoftwareBlog Commenting ServiceBlogging PlatformFirefox/Chrome ExtensionsWinRT (Metro Style) AppsAny Mobile App!

Wednesday, November 27, 13

Let’s Look at aWeb Application

Using nothing butHTML, CSS, and JavaScript

Wednesday, November 27, 13

A Simple BlogContent stored in Amazon DynamoDB

Assets in Amazon S3

Wednesday, November 27, 13

Key DifferencesThree-Tier to Two-Tier

Wednesday, November 27, 13

Key DifferencesThree-Tier to Two-Tier

Browser Security

Wednesday, November 27, 13

Key DifferencesThree-Tier to Two-Tier

Browser SecurityCORS in the browser Credentials on device

Wednesday, November 27, 13

Cross-Origin Resource Sharing

Wednesday, November 27, 13

CORS

Wednesday, November 27, 13

CORSBrowser sends pre-flight request to external host.

Wednesday, November 27, 13

CORSBrowser sends pre-flight request to external host.Host acknowledges browser.

Wednesday, November 27, 13

CORSBrowser sends pre-flight request to external host.Host acknowledges browser.Browser sends XHR request.

Wednesday, November 27, 13

CORS+ S3

Wednesday, November 27, 13

CORS+ S3

CORS needs special configuration on Amazon S3.

Wednesday, November 27, 13

CORS+ S3

CORS needs special configuration on Amazon S3.Configure CORS with bucket policy.

Wednesday, November 27, 13

Configuring CORS on Amazon S3

Wednesday, November 27, 13

Getting CredentialsOnto Your Device

Wednesday, November 27, 13

GettingCredentials

Onto Your Device

Wednesday, November 27, 13

GettingCredentials

Onto Your Device

Never hardcode credentials

Wednesday, November 27, 13

GettingCredentials

Onto Your Device

Never hardcode credentialsUse Web Identity Federation

Wednesday, November 27, 13

Web Identity FederationUse Facebook, Google, or Login with

Amazon as third-party identity providers

Wednesday, November 27, 13

Web Identity FederationSet up IAM roles for

these identity providers

Wednesday, November 27, 13

1

2

3

Wednesday, November 27, 13

Web Identity FederationSet up permissions for IAM role

Wednesday, November 27, 13

AWS.config.credentials = new AWS.WebIdentityCredentials({ RoleArn: ‘arn:aws:iam::<ACCOUNT_ID>:role/<ROLE_NAME>’, ProviderId: ‘graph.facebook.com’, WebIdentityToken: fbAccessToken});

JS

AWS.WebIdentityCredentials

Wednesday, November 27, 13

// 1. Load the FB JS SDK// 2. Call FB.login()FB.login(function (response) { if (response.authResponse) { fbAccessToken = response.authResponse.accessToken; AWS.config.credentials = new AWS.WebIdentityCredentials({...});});

JS

Get a Facebook Access Token

Wednesday, November 27, 13

Same ConceptFor other identity providers

Wednesday, November 27, 13

Our Community

Wednesday, November 27, 13

We ♥Open Source

Wednesday, November 27, 13

https://github.com/aws/aws-sdk-js

Wednesday, November 27, 13

Contributingto the SDK

Wednesday, November 27, 13

Contributingto the SDK

Improve Documentation

Wednesday, November 27, 13

Contributingto the SDK

Improve DocumentationReport Issues

Wednesday, November 27, 13

Contributingto the SDK

Improve DocumentationReport IssuesSubmit Pull Requests

Wednesday, November 27, 13

Contributingto the SDK

Improve DocumentationReport IssuesSubmit Pull RequestsThird-Party Plugins

Wednesday, November 27, 13

Third Party PluginsA great way to add features

Wednesday, November 27, 13

Node.js

Wednesday, November 27, 13

Wednesday, November 27, 13

Write More!

Wednesday, November 27, 13

Please give us your feedback on this presentation

As a thank you, we will select prize winners daily for completed surveys!

TLS303 Thank You

Wednesday, November 27, 13