Front-End Web & Mobile
Integrate the AWS SDK for JavaScript into a React App
In our last blog post, I showed how to create a React app using the create-react-app tool provided by Facebook, and then deploy the app to a content delivery network driven by AWS Mobile Hub, Amazon S3, and Amazon CloudFront. This enables you to produce dynamic single page applications (SPAs) and serve them to a global audience.
Very few web apps are static web sites. Ideally, you also deploy a serverless backend that includes identity, database, storage, and custom APIs that provide the dynamic data for your SPA. AWS provides this kind of serverless backend. You can compose this backend by using the AWS Mobile Hub console. You still need to integrate the AWS SDK for JavaScript into your SPA. In this post, we walk through that integration.
Add the AWS SDK for JavaScript to your project
The SDK is distributed via the npm package manager. To install the SDK into your project, use the following command:
npm install –save aws-sdk
This downloads the SDK and adds an entry into the package.json file so that the SDK is downloaded automatically when it is needed. In addition, any dependencies for the SDK are downloaded and included in your project.
Download the AWS configuration for your project
In the last article, we showed you how to create an AWS Mobile Hub project and turn on the Hosting and Streaming service. This also generates two files in the Amazon S3 bucket that is created:
- aws-config.js is used by browser sessions to configure the SDK.
- aws-exports.js is used by SPA applications that are packed (by Webpack, Browserify, or similar tools) to configure the SDK.
You need the aws-exports.js file for the React app. You can download this file from the Amazon S3 bucket using either the AWS Mobile Hub console or the AWS CLI. To download via the CLI, use the following:
aws s3 cp s3://bucket/aws-exports.js ./src/aws-exports.js
From the AWS Mobile Hub console:
- Sign in to the AWS Mobile Hub console.
- Choose your project.
- Choose Hosting and Streaming.
- Click Download aws-exports.js file.
You can (and should) do this before every build. I have included the following in my package.json:
{
"scripts": {
"prebuild": "aws s3 cp s3://${S3BUCKET}/aws-exports.js ./src/aws-exports.js",
"build": "react-scripts build",
"deploy": "aws s3 cp ./build s3://${S3BUCKET}/ --recursive",
"start": "react-scripts start",
"test": "react-scripts test –env=jsdom",
"eject": "react-scripts eject"
},
…
}
Set the S3BUCKET environment variable and build the React app as follows:
# For MacOS or Linux
export S3BUCKET=reacttestapp-hosting-mobilehub-1234567890
# For Windows cmd
# set S3BUCKET=reacttestapp-hosting-mobilehub-1234567890
# For Windows PowerShell
# $env:S3BUCKET="reacttestapp-hosting-mobilehub-1234567890"
# Now run the build
npm run build
Integrate the SDK into your app
In each SPA, there is an entry point. The entry point for all apps created by create-react-app is the src/App.js file. The create-react-app tool uses ES2015 modules. This means we can use the import keyword to bring in the aws-exports.js file:
/*
* Import the SDK and Project Configuration
*/
import AWS from 'aws-sdk';
import awsmobile from './aws-exports';
/*
* Configure the SDK to use anonymous identity
*/
AWS.config.update({
region: awsmobile.aws_cognito_region,
credentials: new AWS.CognitoIdentityCredentials({
IdentityPoolId: awsmobile.aws_cognito_identity_pool_id
})
});
In this snippet, we import both the SDK and the configuration of the backend, and then automatically create identity credentials for Amazon Cognito based on the configuration. We can also use this to instantiate an Amazon DynamoDB connection or call an Amazon API Gateway REST endpoint using the SDK.
What’s in the aws-exports.js
The aws-exports.js file is a standard JavaScript file that is maintained by AWS Mobile Hub on your behalf. It changes when you add, remove, or edit features within AWS Mobile Hub. An example from one of my apps is below:
// WARNING: DO NOT EDIT. This file is Auto-Generated by AWS Mobile Hub. It will be overwritten.
// Copyright 2017 Amazon.com, Inc. or its affiliates (Amazon). All Rights Reserved.
// Code generated by AWS Mobile Hub. Amazon gives unlimited permission to
// copy, distribute and modify it.
// AWS Mobile Hub Project Constants
const awsmobile = {
aws_app_analytics : 'enable',
aws_cognito_identity_pool_id : 'us-east-1:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX',
aws_cognito_region : 'us-east-1',
aws_content_delivery : 'enable',
aws_content_delivery_bucket : 'XXXXXX-hosting-mobilehub-1234567890',
aws_content_delivery_bucket_region : 'us-east-1',
aws_content_delivery_cloudfront : 'enable',
aws_content_delivery_cloudfront_domain : 'XXXXXXXXXXX.cloudfront.net',
aws_mobile_analytics_app_id : 'XXXXXXXXXXXXXXXXXXXXXXX',
aws_project_id : XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX ',
aws_project_name : 'XXXXXX’,
aws_project_region : 'us-east-1',
aws_resource_name_prefix : 'XXXXXX-mobilehub-1234567890’,
}
export default awsmobile;
var AWS = require('aws-sdk');
AWS.config.region = awsmobile.aws_project_region;
AWS.config.update({customUserAgent: 'MobileHub v0.1'});
This project has the following enabled:
- Analytics (from the Messaging and Analytics feature)
- Hosting and Streaming
You can see the appropriate IDs are available through constants that are then exported as a module. You should never edit this file directly. Instead, change the features within your AWS Mobile Hub project and then copy the file to your source code control again.
Best Practices
We consider the following best practices for integrating the SDK:
- Always use the latest version of the SDK.
- Add the src/aws-exports.js file to your .gitignore (or similar) file. Do not check this file into your source code repository.
- Copy the aws-exports.js file from your AWS Mobile Hub project during the build phase of your app.
Now that you know how to integrate the SDK into your app, you can start using the AWS SDK for JavaScript to access your AWS services. In future articles, we will explore adding AWS service access to your React app. Until then, please see the AWS SDK for JavaScript Developer Guide for more details.