Enterprise Framework

Software Solutions in the Enterprise

CloudFormation SAM Template: Give AWS::Serverless::Function role to access DynamoDB

Type: AWS::Serverless::Function
Description: Do Something
FunctionName: 'DoSomething'
- AmazonDynamoDBFullAccess
Handler: 'do_something.lambda_handler'
Runtime: !Ref LambdaRunTimeVersion
MemorySize: !Ref LambdaMemorySize
Timeout: !Ref LambdaTimeout
Type: SQS
Queue: !GetAtt SqsQueue.Arn
BatchSize: 10
SecurityGroupIds: !Ref VpcSecurityGroupIds
SubnetIds: !Ref VpcSubnetIds
'dynamodb_table_name': !Ref DynamoDBTable
'sqs_url': !Ref SqsQueue
Name: 'do_something.lambda_handler'
Role: !GetAtt LambdaExecutionRole.Arn

Type: AWS::IAM::Role
Version: '2012-10-17'
- Effect: Allow
- lambda.amazonaws.com
- sts:AssumeRole
- PolicyName: allowLambdaLogs
Version: '2012-10-17'
- Effect: Allow
- logs:*
Resource: arn:aws:logs:*:*:*
- PolicyName: AllowDynamoDb
Version: '2012-10-17'
- Effect: Allow
- dynamodb:*
Resource: !GetAtt DynamoDBTable.Arn
- PolicyName: AllowSqs
Version: '2012-10-17'
- Effect: Allow
- sqs:ReceiveMessage
- sqs:DeleteMessage
- sqs:GetQueueAttributes
- sqs:ChangeMessageVisibility
Resource: !GetAtt SqsQueue.Arn

React Boilerplate - Add State Property to Container

Adding New State Property setting constants, actions, selectors, reducer, index

  • Container/Dashboard/constants.js
    • // Add constant for CHANGE_TAB
      export const CHANGE_TAB = 'boilerplate/Dashboard/CHANGE_TAB';
  • Container/Dashboard/actions.js
    • import { CHANGE_TAB } from './constants';
       * Changes the selected tab of the dashboard
       * @param  {selectedTab} name The new text of the input field
       * @return {object}    An action object with a type of CHANGE_SENSOR
      export function changeTab(selectedTab) {
        const action = {
          type: CHANGE_TAB,
        console.log(`changeTab(${selectedTab})`, action);
        return action;
  • Container/Dashboard/selectors.js
    • // Create a selector that will get selectedTab from State
      const makeSelectSelectedTab = () =>
        createSelector(selectDashboard, dashboardState => 
      // Add makeSelectSelectedTab to export
      export { makeSelectSelectedTab };
  • Container/Dashboard/reducer.js
    • import { CHANGE_TAB } from './constants';
      // The initial state of the App
      export const initialState = fromJS({
        selectedTab: 0
      // Add CHANGE_TAB to reducer
      function dashboardReducer(state = initialState, action) {
        switch (action.type) {
          case CHANGE_TAB:
            // Set selected tab
            return state.set('selectedTab', action.selectedTab);
           return state;
  • Container/Dashboard/index.js
    • import { changeTab } from './actions';
      import { makeSelectSelectedTab } from './selectors';
      class Dashboard extends React.PureComponent {
        handleTabChange = (e, f) => {
        render() {
          return (
      // Add selectedTab, and onChangeTab to propTypes
      DashboardPage.propTypes = {
        loading: PropTypes.bool,
        error: PropTypes.oneOfType([PropTypes.object, PropTypes.bool]),
        repos: PropTypes.oneOfType([PropTypes.array, PropTypes.bool]),
        onSubmitForm: PropTypes.func,
        selectedTab: PropTypes.number,
        onChangeTab: PropTypes.func,
      // Add onChangeTab method to props, it will be dispatch on calling.
      export function mapDispatchToProps(dispatch) {
        return {
          onChangeTab: selectedTab => {
      // Add selectedTab to props.  It retrieves from selector from state
      const mapStateToProps = (state, ownProps) => {
        return createStructuredSelector({
            selectedTab: makeSelectSelectedTab(),
            loading: makeSelectLoading(),
            error: makeSelectError(),
  • Save and review

Google Cloud switch between multiple accounts project in App Engine

View gcloud configuration:

$ gcloud config list

You should see something like:

account = your.account@gmail.com
disable_usage_reporting = True
project = myproject-somename-123467

Your active configuration is: [default]

Unset the current cloud project

$ gcloud config unset project

Set the new project.  Your current App Engine name is something like:  my-other-project.appspot.com
Just use the first part without the appspot.com

$ gcloud config set project my-other-project

Run gcloud app deploy now

$ gcloud app deploy

You should see it now say something like

Services to deploy:

descriptor:      [/Users/yourname/Source/Repos/appengine/app.yaml]
source:          [/Users/yourname/Source/Repos/appengine]
target project:  [my-other-project]
target service:  [default]
target version:  [20181218t202435]
target url:      [https://my-other-project.appspot.com]

Do you want to continue (Y/n)?  y

sls deploy error - sh: sls: command not found

Running "sls deploy" generates error.  sh: sls: command not found after running 

sls is a part of the serverless framework.  You can install it by going to:


or run the following

npm install -g serverless

Splunk Forwarder Linux Setup

Splunk Forwarder Linux Setup

                      # Get splunk wget -O splunkforwarder-7.2.1-be11b2c46e23-Linux-x86_64.tgz 'https://www.splunk.com/bin/splunk/DownloadActivityServlet?architecture=x86_64&platform=linux&version=7.2.1&product=universalforwarder&filename=splunkforwarder-7.2.1-be11b2c46e23-Linux-x86_64.tgz&wget=true' sudo tar -xvzf splunkforwarder-7.2.1-be11b2c46e23-Linux-x86_64.tgz -C /opt cd /opt/splunkforwarder/bin # Start splunk forwarder sudo ./splunk start --accept-license sudo ./splunk enable boot-start # Change the default password from changeme sudo ./splunk edit user admin -password newp@$$w0rd -role admin -auth admin:changeme # Add forward server (Where to send data) sudo ./splunk add forward-server YourSplunkServer.com:9997 -auth admin:newp@$$w0rd # Point to directory to monitor sudo ./splunk add monitor /opt/log/www1/ Reference: https://www.splunk.com/en_us/resources/videos/splunk-education-getting-data-in-with-forwarders.html

Brew Update Error: The following directories are not writable by your user:

Error: The following directories are not writable by your user:






You should change the ownership of these directories to your user.

To resolve try:

sudo chown -R $(whoami) /usr/local/include /usr/local/share/man/man3 /usr/local/share/man/man5 /usr/local/share/man/man7 /usr/local/share/man/man8

If that fails, just reinstall brew by going to https://brew.sh/

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Swagger Codegen for PHP

First install Java 7 or 8

1 - Set environment variables for java

export JAVA_HOME=$(/usr/libexec/java_home)
export JAVA_HOME=`/usr/libexec/java_home -v 1.8`

export PATH=${JAVA_HOME}/bin:$PATH

2 - Clone the REPO 

$ git clone https://github.com/swagger-api/swagger-codegen.git

3 - Switch into the directory 

$ cd swagger-codegen

3 - Build the project form code using maven.  Direction for maven on other post.

$ mvn clean package

4 - Generate the client for your endpoint

Replace the below item in < > with your custom values.

java -jar modules/swagger-codegen-cli/target/swagger-codegen-cli.jar generate \
   -i ../acumatica_client/swagger/swagger_customerschema_17.200.001.json \
   -l php \
   --invoker-package "<RootNamespace>\<CustomNamespace>" \
   --git-user-id "<yourgithubuserid>" \
   --git-repo-id "<yourgithubrepo>" \
   -o ~/Source/Repos/<my_output_folder>

5.  Switch to the output folder from above <my_output_folder>

cd ~/Source/Repos/<my_output_folder>

6.  Make git_push executable so we can push to source control.

chmod +x git_push.sh

7.  Push to source control.


7a - git pull origin master --allow-unrelated-histories

8 - Open the newly generated README.md file, copy the text from the Installation & Usage, Composer.json section 


9 - Open your PHP client project that you want to use the swagger generated code in and paste the previously copied text from README.md

  "repositories": [
      "type": "git",
      "url": "https://github.com/<yourgithubuserid>/<yourgithubrepo>.git"
  "require": {
    "<yourgithubuserid>/<yourgithubrepo>": "*@dev"

11 - Run Composer Install from the PHP Client project to install references

$ composer install

Note you may need to run 

$ composer update --lock

Add a generic called runme.php file and add code from README.md

} catch (Exception $e) {
    echo 'Exception when calling CategorySchemaApi->categorySchemaDeleteById: ', $e->getMessage(), PHP_EOL;


and run it
$ php runme.php

Mac: Install Maven Command Line

Mac:  Install Maven Command Line

Download Apache Maven (MVN) from


You should download the binary (Targ.gz or zip) and not source

After you have downloaded it, unzip it by double clicking it or unzip by terminal command (example:)

$ unzip apache-maven-3.6.0-bin.zip

Open terminal if you haven't already and go to the download directory.  We'll move the expanded download file to a new location.

$ cd ~/Downloads

$ mv apache-maven-3.6.0-bin /usr/local/bin/maven

Let's add a maven/bin folder to the path

$ nano .bash_profile

Add the line and save it (control + x)

export PATH=/usr/local/bin/maven/bin:$PATH

Close terminal and reopen

Verify you can access mvn

$ mvn --version



Open Terminal

$ nano ~/.bash_profile

Add the following line:

export JAVA_HOME=$(/usr/libexec/java_home)

Close terminal and reopen

Mac - Brew Install Python - fails with Error: No such file or directory @ dir_chdir - /usr/local/Cellar

Installing python using brew install fails.

$ brew install python

==> Installing dependencies for python: gdbm, openssl, readline, sqlite and xz

==> Installing python dependency: gdbm

==> Downloading https://homebrew.bintray.com/bottles/gdbm-1.18.1.high_sierra.bottle.tar.gz

Already downloaded: /Users/ramiscaray/Library/Caches/Homebrew/downloads/74ba9ab51669f49dc4dc585e1683648d26858c444e775c8f8b819932df55cf14--gdbm-1.18.1.high_sierra.bottle.tar.gz

Error: No such file or directory @ dir_chdir - /usr/local/Cellar

Warning: Bottle installation failed: building from source.

==> Downloading https://ftp.gnu.org/gnu/gdbm/gdbm-1.18.1.tar.gz

Already downloaded: /Users/ramiscaray/Library/Caches/Homebrew/downloads/c6e5196e3cea2a139cb849d508032f117c6351da5fe84323dc13ad2a0600264a--gdbm-1.18.1.tar.gz

Error: An exception occurred within a child process:

  Errno::EPERM: Operation not permitted @ dir_s_mkdir - /usr/local/Cellar

Trying "brew update", "brew doctor" didn't resolve anything.


Reinstall homebrew 

Go to https://brew.sh/

Open terminal and rerun homebrew install

$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Retry python homebrew install

$ brew install python