Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

How to reference an existing s3 bucket & prefix #124

Closed
wliao008 opened this issue Apr 18, 2017 · 62 comments
Closed

How to reference an existing s3 bucket & prefix #124

wliao008 opened this issue Apr 18, 2017 · 62 comments

Comments

@wliao008
Copy link

From this example: https://github.com/awslabs/serverless-application-model/blob/master/examples/2016-10-31/s3_processor/template.yaml, it creates a new bucket. However I need to reference an existing bucket, for example, I want to trigger the lambda when a *.yaml file is uploaded to s3:/mybucket/folder?

@vikrambhatt
Copy link

Hi,

At this moment SAM does not support an existing bucket as an event source. It is mentioned in the documentation:
https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#s3

"NOTE: To specify an S3 bucket as an event source for a Lambda function, both resources have to be declared in the same template. AWS SAM does not support specifying an existing bucket as an event source."

@wliao008
Copy link
Author

Hmm ok, but I do need to have the lambda listen on an existing bucket/folder, what are the walkarounds if I still want to make use of SAM?

@iconara
Copy link

iconara commented May 1, 2017

I just came across this too. Will this be fixed? This makes SAM very hard to use for the S3 event use case.

@sbarski
Copy link

sbarski commented May 2, 2017

I want to up-vote this well. At the moment this is a showstopper for me too.

@vikrambhatt
Copy link

This is not supported in Cloudformation. Basically, cloudformation cannot change any aws resource outside of the stack. Unfortunately, as of now, there is no workaround for this limitation.

@sbarski
Copy link

sbarski commented May 2, 2017

@vikrambhatt do you think AWS will come out with any tooling on top of SAM/CFN to assist with cases such as this. It does make SAM hard to use unfortunately.

@mwarner1
Copy link

It is possible to have CFT send parameters to and invoke a lambda process where you can programmatically make changes to existing resources. However, note that your lambda has to also be able to delete any changes it makes when the stack is deleted (CF will not know about these changes and cannot auto-delete them).

@sanathkr
Copy link
Contributor

Yeah, CloudFormation folks are aware of this limitation and working to solve it. We don't have an ETA yet, but I want to let you guys know that this is in the works.

I am going to close this Issue because SAM is helpless without the CFN feature.

@helenoalves
Copy link

I know this issue is closed, but, when will we have some news about it ?

@sanyer
Copy link

sanyer commented Nov 12, 2017

Faced this limitation recently and workaround it with combination of S3->SNS and SAM<-SNS. Works pretty good and completely automated.

@helenoalves
Copy link

Thanks @sanyer for your feedback !
I never used SNS before, amazon has a lot of amazing tools and I dont know all.
Me and my friend @alexiscviurb , an amazing infrastructure engineer, created a script to automate the task in a Jenkins Pipeline.
This shell script is doing this steps:

  1. Create With Cloud Formation The Functions

  2. List stack resources:
    aws cloudformation list-stack-resources --stack-name analytics-functions --query 'StackResourceSummaries[?LogicalResourceId=='$1'].[PhysicalResourceId]' --output text

  3. Get Lambda Functions:
    aws lambda list-functions --query 'Functions[?FunctionName=='$FunctionName'].[FunctionArn]' --output text

  4. Replace in SAM JSON FunctionName
    sed -i "s/FunctionName::ARN/$FunctionName/" sam-configuration.json

  5. Remove old Functions of Bucket
    aws s3api put-bucket-notification-configuration --bucket=bucket-name --notification-configuration="{}"

  6. Bind the new Functions with Bucket
    aws s3api put-bucket-notification-configuration --bucket=bucket-name --notification configuration file://sam-configuration.json

It's a workauround too, but I hope it helps somebody.
Regards,
Heleno

@rzijp
Copy link

rzijp commented Jun 25, 2018

@sanyer, any chance that you could share more details about your automation? Did you use SAM (not sure if this is limited by #249 as well), or other means?

@sanyer
Copy link

sanyer commented Jun 26, 2018

@rzijp I'll try to remember and find where and how it was done.

@landorid
Copy link

For existing s3 bucket, you can use this serverless plugin.

@golharam
Copy link

Well this just sucks. We should be able to specify arn references to existing buckets. You allow it for ManagedPolicyArns for IAM ROLE, referencing a bucket shouldn't be an issue...unless a change is being made on the bucket itself?

@sworisbreathing
Copy link

If that's the case then the documentation is incorrect, since it gives an example of referencing a bucket that is not managed by SAM.

@didopop3
Copy link

If that's the case then the documentation is incorrect, since it gives an example of referencing a bucket that is not managed by SAM.

it has clearly said "to specify an S3 bucket as an event source for a Lambda function, both resources have to be declared in the same template. AWS SAM does not support specifying an existing bucket as an event source."
https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#example-awsserverlessfunction

We need the feature to reference an existing s3 bucket

@metaskills
Copy link

The limitation of CloudFormation makes complete sense to me. I was initially upset to hit this limitation myself and put my head down on what I think is a good workaround that fits both CloudFormation and SAM best practices. Of course, using Bash as a little bit of IaC glue as needed. The solution, first use no event in your template.yaml file and also add permission for the S3 bucket to invoke the function. To also make this work, output the functions arn. Pretty much what @helenoalves shared.

Resources:
  MyFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: .
      Handler: app.handler
      Runtime: ruby2.5
  ImageBucketPermission:
    Type: AWS::Lambda::Permission
    Properties:
      Action: 'lambda:InvokeFunction'
      FunctionName: !Ref MyFunction
      Principal: s3.amazonaws.com
      SourceAccount: !Ref 'AWS::AccountId'
      SourceArn: !Sub arn:aws:s3:::my-bucket-name

Outputs:
  MyFunctionArn:
    Description: My Function Arn
    Value: !GetAtt MyFunction.Arn

In order to connect the S3 events a little one time Bash script, I usually put these in the projects ops directory, is used.

FUNCARN=$(aws cloudformation describe-stacks \
  --stack-name "my-stack-name" \
  --query 'Stacks[0].Outputs[0].OutputValue'
)

JSON=$(cat <<-EOF
  {
    "LambdaFunctionConfigurations": [
      {
        "Id": "MyEventsName",
        "LambdaFunctionArn": ${FUNCARN},
        "Events": [
          "s3:ObjectCreated:*"
        ]
      }
    ]
  }
EOF
)

aws s3api \
  put-bucket-notification-configuration \
  --bucket="my-bucket-name" \
  --notification-configuration "$JSON"

@dragonfax
Copy link

Just another "me too". I hit this today.

@tomcant
Copy link

tomcant commented Aug 16, 2019

I hit this issue recently and used the solution proposed above by @metaskills as a workaround. I've written a Bash script to make the whole thing a bit simpler. Hopefully someone else that lands on this thread will find it useful, and if anyone wants to suggest an improvement then please do: https://gist.github.com/tomcant/c31a08123673e91d9560737f4380cff0.

Here's the script usage information:

Configure an S3 bucket ObjectCreated notification for the given Lambda function.

Usage: ./configure-s3-lambda-notification.sh BUCKET FUNCTION

Arguments:
  BUCKET     name of the S3 bucket that should trigger the notification
  FUNCTION   name of the Lambda function that should receive the notification

The script uses the AWS CLI (tested with version 1.16.276) so you'll need to supply valid AWS credentials for the account containing the resources. How you invoke the script depends on how you supply your credentials. I usually set the AWS_PROFILE environment variable or AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY / AWS_DEFAULT_REGION, like this:

AWS_PROFILE=profile ./configure-s3-lambda-notification.sh BUCKET FUNCTION

or...

AWS_DEFAULT_REGION=region AWS_ACCESS_KEY_ID=key AWS_SECRET_ACCESS_KEY=secret ./configure-s3-lambda-notification.sh BUCKET FUNCTION

If you provide your credentials in some other way (e.g. EC2 instance metadata) then running the script without the extra environment variables should work just fine.

The script also takes care of adding permissions for S3 to invoke the function, if necessary. The biggest limitation right now is that the script doesn't support setting filters on the notification (e.g. path prefix/suffix), but that can easily be updated on the bucket UI afterwards.

Note that the jq JSON processor is also required.

@OscarVanL
Copy link

Ran into this today too, kinda disappointed this isn't supported.

@sbilello
Copy link

+1

@NiminU
Copy link

NiminU commented Oct 16, 2019

Need this functionality for one of our use cases, hope this will be considered soon.

@gilshelef
Copy link

+1

1 similar comment
@subzero112233
Copy link

+1

@IanLeeClaxton
Copy link

IanLeeClaxton commented Jan 24, 2020 via email

@keetonian
Copy link
Contributor

@djm I looked into that for this particular problem. It works if you only have one stack that needs to reference the bucket; if you want to reference it from multiple stacks, however, it doesn't work and another solution is needed.

@CJohnsonLehi
Copy link

CJohnsonLehi commented Feb 26, 2020

Can't believe this is still an issue. It could have simply been solved by adding an extra property to each resource called: Existing: <true|false>

@nicofuccella
Copy link

+1

@Kinnary-Raichura
Copy link

+1

@CJohnsonLehi : Existing: <true|false> works for serverless framework, and not for SAM model

@maxalbrecht
Copy link

+1. Just to note that this functionality/issue was requested 2 and a half years ago.

@austingriff
Copy link

+1

@austingriff
Copy link

honestly i'm about to abandon SAM and just go straight cloud formation. without this feature SAM is useless

@maxalbrecht
Copy link

For anyone looking for a workaround:

I ran my CloudFormation template without the event, and added the event afterward manually on the aws console. It's not ideal, but I only had to do it once, and I have been able to update the code in the lambda function without issues.

@robin-zhao
Copy link

+1

Still an issue.

@sahil-gt
Copy link

sahil-gt commented Apr 9, 2020

+1
No updates as to what the situation is regarding this issue?

@miekassu
Copy link

+1
We need this.

@martimfj
Copy link

martimfj commented May 8, 2020

+1

Still an issue.

@adamclark64
Copy link

...Still an issue.

@keetonian
Copy link
Contributor

@thenninger
Copy link

+1

3 similar comments
@victor-samson-mo
Copy link

+1

@cellistigs
Copy link

+1

@mischka
Copy link

mischka commented Jul 6, 2020

+1

@ranajoyviraj
Copy link

going for a new bucket rather than waiting

@adfer
Copy link

adfer commented Jul 14, 2020

@joshi95
Copy link

joshi95 commented Oct 10, 2020

Much needed feature !!

@Go-Pomegranate
Copy link

What a disappointment... switching to serverless now, sry guys.

@FilipBartos
Copy link

+1

1 similar comment
@mherma1979
Copy link

+1

@RajivSah
Copy link

+1 :(

@m17kea
Copy link

m17kea commented Dec 17, 2020

+1

1 similar comment
@yang-xiaodong
Copy link

+1

@jfuss
Copy link
Contributor

jfuss commented Dec 30, 2020

Since there is still activity here: Please leave a +1 (not leave a comment but the reaction on the top comment in the issue) on this issue: aws-cloudformation/cloudformation-coverage-roadmap#79, as SAM cannot do anything due to the lack of support in CloudFormation.

@aws aws locked as resolved and limited conversation to collaborators Dec 30, 2020
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests