examples icon indicating copy to clipboard operation
examples copied to clipboard

Error during serverless syncToS3

Open ghdna opened this issue 7 years ago • 8 comments

I got the cloud formation template & s3 bucket deployed using serverless deploy. but when I invoke serverless syncToS3, I'm getting Serverless: fatal error: Unable to locate credentials.

The credentials within the serverless.yaml file worked when creating the stack. But somehow they are not letting me upload s3 artifacts.

ghdna avatar Jun 22 '17 04:06 ghdna

@ghdna Thank you for opening up!

Which example are using?

The credentials within the serverless.yaml file

Could you show us your all of serverless.yml? How does you define credentials? You might be wrong how to define.

horike37 avatar Jul 06 '17 12:07 horike37

My AWS credentials are defined as a profile in ~/.aws/credentials file. And I'm referencing these credentials under provider.

provider:
  name: aws
  runtime: nodejs6.10
  profile: myAwsCreds

This works when creating S3 bucket and CloudFront nodes. But when I execute serverless syncToS3, it behaves as if there are no credentials provided. It's ignoring the profile under provider.

ghdna avatar Jul 06 '17 15:07 ghdna

@ghdna

Seems that credentials setting is no problem. Are you using the following sample? if so, I'll try to reproduce your facing problem on my local. https://github.com/serverless/examples/tree/master/aws-node-single-page-app-via-cloudfront

horike37 avatar Jul 07 '17 03:07 horike37

Yes, I'm using that sample. Try to reproduce it. Make sure you don't have any default credentials defined in your ~/.aws/credentials file and are instead using [profiles].

~/.aws/credentials

[myawscreds]
aws_access_key_id = XXXXXXXXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

ghdna avatar Jul 07 '17 05:07 ghdna

@ghdna I have tried the same sample. However, worked fine on my local. I guess that you didn't apply IAM action to your credential correctly. I reccomend you will try to use AdministratorAccess role once. If work fine, it specify there is the ploblem in IAM setting.

horike37 avatar Jul 12 '17 11:07 horike37

I believe the problem is that syncToS3 is documented as follows:

Hint: The plugin is simply running the AWS CLI command: aws S3 sync app/ s3://yourBucketName123/

When in fact it should be:

Hint: The plugin is simply running the AWS CLI command: aws s3 sync app/ s3://yourBucketName123/

Notice the difference is S3 to s3.

When I ran the command as

aws s3 sync app/ s3://yourBucketName123/

The problem was resolved.

timothyjeffcoat avatar Aug 10 '17 19:08 timothyjeffcoat

This was driving me crazy so posting my solution here. If you are using profiles you may notice that even after running

serverless config credentials --provider aws --key key --secret secret --profile myProfile

serverless deploy works fine but serverless syncToS3 will throw unable to locate credentials error.

Basically syncToS3 is running the AWS command which is looking for your default profile and because the syncDirectory() function in the plugin index.js does not pass the profile through to the command, so to fix it you can just modify this function with the following:

const profile = this.serverless.variables.service.provider.profile;
const args = [
      's3',
      'sync',
      'dist',
      `s3://${s3Bucket}/`,
      '--delete',
      `--profile=${profile}` //Added this line here
    ];

You'll need to do the same in the invalidateCache() function. Also obviously make sure you provider.profile set in your serverless.yml

williamsandonz avatar Mar 28 '20 12:03 williamsandonz

This serverless plugin also solved my issue; was less implementation effort. https://www.npmjs.com/package/serverless-s3-sync

m-torin avatar May 26 '20 17:05 m-torin