Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use a private npm registry on Elastic Beanstalk?

We have a nodejs project running on Amazon Elastic Beanstalk that uses private modules that we host using nodejitsu's private npm registry.

However getting access to the private npm registry from the elastic instances hasn't been straightforward and is not documented well.

What is the best way to get this access set up?

like image 541
Vignir Hafsteinsson Avatar asked Jul 28 '14 10:07

Vignir Hafsteinsson


2 Answers

None of the other answers were working for me. After hours of hair pulling, we finally figured it out. The solution that worked is almost the same as the other answers but with a very minor tweak.

  1. Set an NPM_TOKEN environment variable on Elastic Beanstalk under Configuration > Software Configuration > Environment Properties.
  2. Create a .ebextensions/npm.config file. (The name does not have to be 'npm'.)
  3. Put this content into the file:

    files:
      "/tmp/.npmrc":
        content: |
          //registry.npmjs.org/:_authToken=${NPM_TOKEN}
    

Note that it uses ${NPM_TOKEN} and not $NPM_TOKEN. This is vital. Using $NPM_TOKEN will not work; it must have the curly braces: ${NPM_TOKEN}.

Why are the curly braces needed? No idea. In shell/POSIX languages, ${VAR} and $VAR are synonymous. However, in .npmrc files (at the time of this writing), variables without the curly brackets are not recognized as variables, so npm must be using a slightly different syntax standard.

UPDATE

Also, this has worked for us only on new or cloned environments. For whatever reason, environments which were not initialized with a /tmp/.npmrc will not read it in any future deployments before running npm install --production. We've tried countless methods on 4 different apps, but cloning and replacing an environment has been the only method which has worked.

like image 107
GreenRaccoon23 Avatar answered Oct 10 '22 15:10

GreenRaccoon23


So, we managed to get this working by using the npm userconfig file. See the doc page for npmrc for more info.

When a nodejs application is being deployed to Elastic Beanstalk, the root user runs npm install. So you will need to write the root's npm userconfig file, which is at /tmp/.npmrc.

So if you add a file called private_npm.config (or whatever name you choose) to your .ebextensions folder with all the information needed, you will be good to go. See Customizing and Configuring AWS Elastic Beanstalk Environments for more info.

So here is what my file looks like to use nodejitsu private registry.

.ebextensions/private_npm.config:

files:
  #this is the npm user config file path
  "/tmp/.npmrc":
    mode: "000777"
    owner: root
    group: root
    content: |
      _auth = <MY_AUTH_KEY>
      always-auth = true
      registry = <PATH_TO_MY_REGISTRY>
      strict-ssl = true
      email = <NPM_USER_EMAIL>
like image 10
Vignir Hafsteinsson Avatar answered Oct 10 '22 16:10

Vignir Hafsteinsson