What is the difference between npm package cdk and aws-cdk? - amazon-web-services

In shell scripts interacting with the AWS CDK Toolkit, I often see both npx -- cdk and npx -- aws-cdk. Apparently, there are two npm packages cdk and aws-cdk. What is the difference between these two?
Moreover, I make confusing observations when interacting with these two packages.
npx -- cdk --version # output: Need to install the following packages: cdk#2.32.1
npx -- aws-cdk --version # output: Need to install the following packages: aws-cdk#2.32.1
Since neither package is installed locally, both commands want to install the corresponding package, fine.
npm install -g cdk#2.32.0
npx -- cdk --version # output: 2.32.0 (build 00e0c2d)
npx -- aws-cdk --version # output: Need to install the following packages: aws-cdk#2.32.1
After installing cdk locally, npx -- cdk executes the local package and npx -- aws-cdk still wants to install aws-cdk, also fine.
npm install -g aws-cdk#2.32.0
npx -- cdk --version # output: 2.32.0 (build 00e0c2d)
npx -- aws-cdk --version # output: Need to install the following packages: aws-cdk#2.32.1
Now it gets confusing. Although we locally installed aws-cdk rather than cdk, npx -- cdk still executes some local package and npx -- aws-cdk still wants to install aws-cdk. Why?

The aws-cdk package provides a cdk command, the entry point to the AWS Cloud Development Kit.
When you install aws-cdk package in node_modules/.bin there is a cdk command installed.
This allows one to use cdk command inside package.json scripts.
The cdk command is also the only command added to .bin by aws-cdk.
As per all of the documentation, in order to interact with AWS CDK from CLI, one should use cdk command. That is even though the package name is aws-cdk.
Now, the npx provides a convenient way to run a command from a package regardless if it is already installed.
This works in the most straightforward way when the package name matches the command name it provides. This is not the case for aws-cdk.
In order to fix that, and allow anyone to run npx cdk ... the AWS CDK decided to publish a package named cdk. This is a small wrapper around cdk command provided by aws-cdk package.

Related

'cdk' is not recognized as an internal or external command

I am trying my hands with AWS CDK & as the first step, I need to install cdk & as per below link
https://docs.aws.amazon.com/cdk/latest/guide/getting_started.html
I tried installing the same
Steps.
node --version => v15.14.0
npm --version => 7.11.2
aws -version => aws-cli/2.2.1 Python/3.8.8 Windows/10 exe/AMD64 prompt/off`
npm -g install typescript
aws configure (AWS AccessKey, Secret,Region)
npm -g install aws-cdk
Now closed all the cmd instances & ran
cdk --version
this throws the below error
'cdk' is not recognized as an internal or external command
Then I added the below path of cdk to environment variable
C:\Users\kgn-dev\AppData\Roaming\npm\node_modules\aws-cdk\bin\cdk
still the same issue.
How do I get cdk command running?
I am using Windows 10
try to add the following path to the environment variable
C:\Users\kgn-dev\AppData\Roaming\npm\node_modules\aws-cdk\bin

Command error "amplify configure" : installation error aws amplify

I tried to install aws amplify. But when I typed those commands in cmd window
then an error message came out.
>amplify configure
"amplify" is not an internal or external command .....
In this case, what should I do?
--I'm using Windows10
You need to install the amplify-cli first.
npm install -g #aws-amplify/cli
If you have already done so, opening a new commandline and typing
amplify configure
Should begin the configuration process.
You need to install Amplify CLI and configure it first.
Install Node.js in your system
Install amplify cli using the command
npm install -g #aws-amplify/cli

Is it possible/recommended to use `sam build` in AWS CodeBuild?

This question spun out of this one. Now that I have a better understanding of what was going wrong there, and a workable, if imperfect, solution, I'm submitting a more focused follow-up (I'm still something of a novice at StackOverflow - please let me know if this contravenes etiquette, and I should follow-up on the original).
This page suggests that "You use AWS CodeBuild to build, locally test, and package your serverless application". However, when I include a sam build command in my buildspec.yml, I get the following log output, suggesting that sam is not installed on CodeBuild images:
[Container] 2018/12/31 11:41:49 Running command sam build --use-container
sh: 1: sam: not found
[Container] 2018/12/31 11:41:49 Command did not exit successfully sam build --use-container exit status 127
[Container] 2018/12/31 11:41:49 Phase complete: BUILD Success: false
[Container] 2018/12/31 11:41:49 Phase context status code: COMMAND_EXECUTION_ERROR Message: Error while executing command: sam build --use-container. Reason: exit status 127
Furthermore, if I install SAM with pip install aws-sam-cli, running sam build --use-container in CodeBuild gives an error. sam build itself succeeds, but since it doesn't install test dependencies, I'd still need to use pip install -r tests/requirements-test.txt -t . to be able to run tests in CodeBuild. Moreover, this suggests that --use-container is required for "packages that have natively compiled programs").
This makes me wonder whether I'm trying to do something wrong. What's the recommended way of building SAM services in a CI/CD workflow on AWS?
2019_10_18 - Update (confirming #Spiff answer above):
Apparently Codebuild now work seamlessly with SAM, that's all I needed in buildspec.yml for a lambda using pandas and psycopg2-binary:
version: 0.2
phases:
install:
runtime-versions:
python: 3.7
pre_build:
commands:
- python -m unittest discover tests
build:
commands:
- sam build
post_build:
commands:
- sam package --output-template-file packaged.yaml --s3-bucket my-code-pipeline-bucketz
artifacts:
type: zip
files:
- packaged.yaml
Cheers
Please see below for buildspec.yaml that works for me when using AWS SAM with AWS CodeBuild, with cloudformation.yml
phases:
build:
commands:
- pip install --user aws-sam-cli
- USER_BASE_PATH=$(python -m site --user-base)
- export PATH=$PATH:$USER_BASE_PATH/bin
- sam build -t cloudformation.yml
- aws cloudformation package --template-file .aws-sam/build/template.yaml --s3-bucket <TARGET_S3_BUCKET> --output-template-file cloudformation-packaged.yaml
- aws s3 cp ./cloudformation-packaged.yaml <TARGET_S3_BUCKET>/cloudformation-packaged.yaml
In the result I get a deployment package and packaged cloudformation template in the TARGET_S3_BUCKET.
For each function in the ./src folder, I have a requirements.txt file that includes all the dependencies, but I dont run pip install -r requirements.txt manually.
If you want to run sam build command in CodeBuild, you must install aws-sam-cli first (probably in the install phase of buildspec.yml file) i.e. by running pip install aws-sam-cli command or alike.
--use-container option in the sam build command will cause the command to pull in the Docker image resembling the AWS Lambda execution environment, then run the container from this Docker image to pip install (if your lambda is written in Python) your function dependencies for creating your lambda deployment package. This will ensure that the lambda function will use native compiled libraries that are compatible with the actual runtime environment of AWS Lambda.
Therefore, if you specify --use-container option for sam build command running in CodeBuild, you also need to make sure that a Docker image used by your CodeBuild build project must support Docker runtime.
The most easiest way is to use CodeBuild build environment named aws/codebuild/standard:2.0 Docker image. Enabling Docker runtime in runtime-versions property in the install phases of your buildspec.yml. Also you might need to enable PrevilegedMode of your CodeBuild project in order to connect with Docker daemon from your build environment.
As of October 2019 I had no issues whatsoever deploying a serverless application with codebuild using sam build,
First of all --user is not needed for pip install aws-sam-cli. In fact including --user appears to be the only reason that sam is not in the path.
In addition the --use-container is not needed either as long as no native libraries are built, like psycopg

Unable to install AWS SAM Cli on Mac

I am trying to install AWS SAM Cli on my Mac because I am trying to learn the AWS services. But I have installed the AWS cli successful using bundle. But when I tried to install the AWS SAM Cli as well. But it is not working. This is what I have done so far.
Run this command
pip install --user aws-sam-cli
Everything went fine.
Then I opened and edited the ~/.bash_profile. This is the content of the .bash_profile
export PATH=/Applications/MAMP/bin/php/php7.2.7/bin:$PATH
# Find your Python User Base path (where Python --user will install packages/scripts)
$ USER_BASE_PATH=$(python -m site --user-base)
# Update your preferred shell configuration
-- Standard bash --> ~/.bash_profile
-- ZSH --> ~/.zshrc
export PATH=$PATH:$USER_BASE_PATH/bin
Then I closed the terminal and run sam --version.
It is saying command not found. What is wrong with my installation?
The now recommended way to install SAM CLI is to use brew and honestly it's way better, saves you a lot of headaches, like the one you're facing now. See these instructions for details.

AWS CLI tools on Circle CI: configure: unknown command

I'm trying to deploy a docker application onto Elastic Beanstalk from Circle CI.
The deployment section of my circle.yml is
deployment:
hub:
branch: [internal, production]
commands:
- pip install awscli
- docker push company/web:$CIRCLE_SHA1
- sudo bash deploy.sh $CIRCLE_SHA1 $CIRCLE_BRANCH $CIRCLE_BUILD_NUM
and my deploy.sh calls aws cli as follows
aws --version
aws configure set aws_access_key_id $AWSKEY
aws configure set aws_secret_access_key $AWSSECRETKEY
aws configure set default.region us-west-2
aws configure set default.output json
echo "SAVING NEW DOCKERRUNFILE: $DOCKERRUN_FILE"
aws s3 cp $DOCKERRUN_FILE s3://$EB_BUCKET/$DOCKERRUN_FILE
But I get the error
--version: mispelled meta parameter?
sanity-check: "/root/.awssecret": file is missing. (Format: AccessKeyID\nSecretAccessKey\n)
configure: unknown command Usage: aws ACTION [--help]
The script works completely fine locally on mac os using the exact same key and secret.
Both versions (on circle and my mac) of awscli are 1.7.14
I'm Kevin from CircleCI. It looks like the issue here is related to the fact that when you install Python dependencies CircleCI installs them into a virtualenv. This is usually a great thing, as it isolates your python environment from the default system Python and supports our dependency cacheing. The problem here is that you're running your deploy.sh script with sudo, which clobbers the virtualenv environment and runs the default system version (which in this case is actually an older alternative AWS CLI). Dropping the sudo should fix things for you. (You would also be better off running pip install awscli==x.x.x in the "dependencies" phase, as it would be cached then.)
PS: Please contact sayhi#circleci.com for a timely response to questions in general.