{"id":12388,"date":"2022-12-13T12:38:03","date_gmt":"2022-12-13T07:08:03","guid":{"rendered":"https:\/\/opstree.com\/blog\/\/?p=12388"},"modified":"2025-11-20T21:07:45","modified_gmt":"2025-11-20T15:37:45","slug":"trigger-jenkins-job-using-aws-lambda-triggered-by-s3-event","status":"publish","type":"post","link":"https:\/\/opstree.com\/blog\/2022\/12\/13\/trigger-jenkins-job-using-aws-lambda-triggered-by-s3-event\/","title":{"rendered":"Trigger Jenkins Job using AWS Lambda triggered by S3 Event"},"content":{"rendered":"\r\n<h3 class=\"wp-block-heading\">The problem that we faced:<\/h3>\r\n\r\n\r\n\r\n<p class=\"has-text-align-justify\">There was a cron scheduled in our environment at a particular time which used to run at 8AM. This cron read data from the <a href=\"https:\/\/opstree.com\/blog\/2022\/03\/15\/know-how-to-access-s3-bucket-without-iam-roles-and-use-cases\/\">s3 bucket<\/a> and used to succeed but failed when there were no objects present.<\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">Problem this Integration solves:<\/h3>\r\n\r\n\r\n\r\n<ul>\r\n<li>Eliminates the need of keeping a scheduler in the system. Lambda will work as a Scheduler.<\/li>\r\n\r\n\r\n\r\n<li>No manual intervention will be required in case the file from one service is delayed by a minute or an hour due to any reason.\u00a0<\/li>\r\n\r\n\r\n\r\n<li>Data exchange and processing between teams become more efficient and less error-prone.<\/li>\r\n\r\n\r\n\r\n<li>Eliminates the need of checking the presence of files on S3. It all gets automated.<\/li>\r\n<\/ul>\r\n<p><!--more--><\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">Workflow<strong>:<\/strong><\/h3>\r\n\r\n\r\n\r\n<ol>\r\n<li>The object is uploaded to S3<\/li>\r\n\r\n\r\n\r\n<li>S3 event triggers a Lambda function<\/li>\r\n\r\n\r\n\r\n<li>Lambda starts Jenkins job using Jenkins API<\/li>\r\n<\/ol>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"599\" height=\"202\" class=\"wp-image-12614\" src=\"https:\/\/opstree.com\/blog\/\/wp-content\/uploads\/2022\/12\/image-1.png?w=599\" alt=\"\" \/><\/figure>\r\n\r\n\r\n\r\n<p><!--more--><\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Steps:<\/h2>\r\n\r\n\r\n\r\n<h4 class=\"wp-block-heading\">1. Generate API Token Token:<\/h4>\r\n\r\n\r\n\r\n<p>We need to generate an API token for the user which we will use to authenticate the API call to trigger the job<\/p>\r\n\r\n\r\n\r\n<p><strong>a).<\/strong> Go to <strong>People &gt;&gt; User-Name &gt;&gt; Configure &gt;&gt; Add New Token under API Token &gt;&gt; Generate &gt;&gt; Save<\/strong><\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image is-resized\"><img decoding=\"async\" src=\"https:\/\/lh6.googleusercontent.com\/16cVyszvkUo3kd-FHbnBijm8LZl3T1v40yd11SHP7sXqH1etcGuR_rbgo71arfj_LWBYWPxHKPvi3UUf6gpx-8IABpQI_6ULe7JcTM1apK7DKt6jJVib8ESgfwBfC_7RILo3slMwDL67wD1TnnLmn55ply3LQvIx9bYKMN87_0s_V266A_kSUbgmCzrZhQ\" alt=\"\" width=\"800\" \/><\/figure>\r\n\r\n\r\n\r\n<p>Now we need to add the authentication token to the job we want to trigger remotely.<\/p>\r\n\r\n\r\n\r\n<p><strong>Note<\/strong>: API token is equal to the Authentication token<\/p>\r\n\r\n\r\n\r\n<p><strong>b). <\/strong>Go to <strong>job &gt;&gt; Configure &gt;&gt; Trigger builds remotely under Build Triggers &gt;&gt; add API Token to Authentication Token Field &gt;&gt; Save<\/strong><\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image is-resized\"><img decoding=\"async\" src=\"https:\/\/lh3.googleusercontent.com\/8zvHJ7WU1L-Prg1-PoSgLRUxnikHWwPffEOwLxhBnML93CBVnyZ5tn3ljlGE8DKGMYilQ2VzlLXoR0BjBXhZEh288Zg68Lo3VLw2Ujzhp-oSrb1oETEpfsjg9_0_98BiqwnwRI7bdAoeXI4-glxhyhyLrH1_H1NS2euHAoZIWowtraCllXq1i2ZXmpNF4w\" alt=\"\" width=\"800\" \/><\/figure>\r\n\r\n\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n\r\n\r\n<p>With this information, you can now create a URL that looks like this:<\/p>\r\n\r\n\r\n\r\n<p><strong>http:\/\/user-name<\/strong><strong>:&lt;api_token&gt;@jenkins-web-url.com\/job\/&lt;JobName&gt;\/build?token=&lt;authentication_token&gt;<\/strong><\/p>\r\n\r\n\r\n\r\n<ul>\r\n<li><strong>&lt;JobName&gt;<\/strong> should be replaced with the <strong>Jenkins project name<\/strong>.<\/li>\r\n\r\n\r\n\r\n<li><strong>&lt;api_token&gt;<\/strong> should be replaced with <strong>API Token<\/strong> we created for the user.<\/li>\r\n\r\n\r\n\r\n<li><strong>&lt;authentication_token&gt;<\/strong> should be replaced with the <strong>API Token<\/strong>. If we want to trigger a parameterized job, replace the build with Buildwithparameters in the URL.<\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<h4 class=\"wp-block-heading\">2. Create S3 Bucket:<\/h4>\r\n\r\n\r\n\r\n<p>I have created an empty bucket named <strong>s3-test-Jenkins<\/strong>. This bucket will trigger the Lambda script if any file or folder is uploaded in this bucket.<\/p>\r\n\r\n\r\n\r\n<h4 class=\"wp-block-heading\">3. Create Lambda Function:<\/h4>\r\n\r\n\r\n\r\n<p>I have created a <a href=\"https:\/\/opstree.com\/blog\/2024\/07\/16\/lambda-function-setup-guide-for-security-group-event-notifications-in-slack\/\">lambda function<\/a> using the below steps:<\/p>\r\n\r\n\r\n\r\n<p><strong>a).<\/strong> Go to <strong>Lambda &gt;&gt; create Function &gt;&gt; select Author From Scratch &gt;&gt;give function name &gt;&gt; select Python3.7 Runtime &gt;&gt; Create Function<\/strong><\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image is-resized\"><img decoding=\"async\" src=\"https:\/\/lh4.googleusercontent.com\/ihKwFmiMwCqeNkHyaCt5fVU-dOsqxRnU0R8VmzTUv8U1E5mzjBvUaa0HMf5NbszV1FGGBXdosZDnQKpi6LWXFiLWcUHvbKXfdS1RU_Ns-bT_-pR1LUwQlqD7haKfAFbNV5kb_m6f6ahLK2USwsjDHhgtgnK_KqjQhrKFvNt_fXs6PLvBj062YLhe09bvAQ\" alt=\"\" width=\"800\" \/><\/figure>\r\n\r\n\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n\r\n\r\n<p>Add the below code to the lambda function that was created in the above steps:<\/p>\r\n\r\n\r\n\r\n\r\n\r\n<pre class=\"wp-block-code has-dark-gray-color has-white-background-color has-text-color has-background\"><code>import requests\r\nimport os\r\n \r\nUSERNAME = os.environ['USERNAME']\r\nJENKINS_URL = os.environ['JENKINS_URL']\r\nAPI_TOKEN = os.environ['API_TOKEN']\r\nAUTH_TOKEN = os.environ['AUTH_TOKEN']\r\n \r\n \r\ndef lambda_handler(event, context):\r\n   try:\r\n       url = \"http:\/\/{}:{}@{}\/build?token={}\".format(USERNAME, API_TOKEN, JENKINS_URL, AUTH_TOKEN)\r\n       print(url)\r\n       response = requests.post(url)\r\n       if response.status_code != 201:\r\n          print(response.status_code)\r\n   except Exception as err:\r\n      print(err.args[0])\r\n<\/code><\/pre>\r\n\r\n\r\n\r\n\r\n\r\n<p>These are the environment variables that you need to add the lambda function:<\/p>\r\n\r\n\r\n\r\n<p><strong>b).<\/strong> Go to <strong>configuration<\/strong> &gt;&gt; <strong>Environment variables<\/strong> &gt;&gt; <strong>Add Environment Variable &gt;&gt;\u00a0Save<\/strong><\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image is-resized\"><img decoding=\"async\" src=\"https:\/\/lh3.googleusercontent.com\/hSHZpicSUgMHi44MXQPvLyKwKWzIasvtllM5SSYXrwHCykml0KEuRqf1f79jxmBpJ3tICNCh4xvVAiJnJJSFEFo3zrlBOqfs1lNQvQUcC-AMJbTcJ8atsCwYJYpR3VE2kyPaWnc-qDCrSzGE5Sulpk3tQ3eV1Ygsm1xvfMFi8ocJ4O1Zbc8B6_qNNzojoQ\" alt=\"\" width=\"800\" \/><\/figure>\r\n\r\n\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n\r\n\r\n<p>Add trigger into lambda function:<\/p>\r\n\r\n\r\n\r\n<p><strong>c). Function &gt;&gt; select Add trigger &gt;&gt;Trigger configuration &gt;&gt; select s3 &gt;&gt; Bucket Name &gt;&gt; Event type &gt;&gt;Add<\/strong><\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image is-resized\"><img decoding=\"async\" src=\"https:\/\/lh3.googleusercontent.com\/0DsVNh8VYopqatLC1BfvKx0FS767MMS9wlMTW9r_zGN01W5wkvVNzspPddHDqZsatuEDpKsnWsCJXVGUFksjGTvHw6vzgvDrupDCRxnOqqqFL8QDb6BSuV-ZD63xwmhUckospcIQvujcibGY6HataH9V0cONtiOPHtkc0l_nx8ta326VL7ccVM_B0b4nnw\" alt=\"\" width=\"800\" \/><\/figure>\r\n\r\n\r\n\r\n\r\n\r\n<p>&nbsp;<\/p>\r\n<p class=\"wp-block-heading\">In this blog, we have seen how in a few easy steps we can trigger AWS Lambda through an S3 event and trigger Jenkins through AWS Lambda. I hope this blog will help you if any such scenario comes up. Happy learning!<\/p>\r\n\r\n\r\n\r\n\r\n\r\n<p><strong>Blog Pundits: <a href=\"https:\/\/opstree.com\/blog\/\/author\/deepakgupta97\/\" target=\"_blank\" rel=\"noreferrer noopener\">Deepak Gupta<\/a><\/strong> and <strong><a href=\"https:\/\/opstree.com\/blog\/\/author\/sandeep7c51ad81ba\/\" target=\"_blank\" rel=\"noreferrer noopener\">Sandeep Rawat<\/a><\/strong><\/p>\r\n\r\n\r\n\r\n<p class=\"has-text-align-center\"><strong>Related Searches &#8211; <a href=\"https:\/\/opstree.com\/application-modernization-with-aws\/\" target=\"_blank\" rel=\"noopener\">AWS Consulting Partner<\/a> | <a href=\"https:\/\/opstree.com\/services\/cloud-engineering-services\/\">Cloud Engineering Services<\/a><\/strong><\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-social-links aligncenter is-content-justification-center is-layout-flex wp-container-core-social-links-is-layout-1 wp-block-social-links-is-layout-flex\"><li class=\"wp-social-link wp-social-link-linkedin  wp-block-social-link\"><a href=\"https:\/\/www.linkedin.com\/company\/opstree-solutions\" class=\"wp-block-social-link-anchor\" target=\"_blank\" rel=\"noopener\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">LinkedIn<\/span><\/a><\/li>\r\n\r\n<li class=\"wp-social-link wp-social-link-youtube  wp-block-social-link\"><a href=\"https:\/\/www.youtube.com\/channel\/UCeLma6SpNYH7jjYKSBNSexw\" class=\"wp-block-social-link-anchor\" target=\"_blank\" rel=\"noopener\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">YouTube<\/span><\/a><\/li>\r\n\r\n<li class=\"wp-social-link wp-social-link-github  wp-block-social-link\"><a href=\"https:\/\/github.com\/OpsTree\" class=\"wp-block-social-link-anchor\" target=\"_blank\" rel=\"noopener\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">GitHub<\/span><\/a><\/li>\r\n\r\n<li class=\"wp-social-link wp-social-link-facebook  wp-block-social-link\"><a href=\"https:\/\/www.facebook.com\/opstree\" class=\"wp-block-social-link-anchor\" target=\"_blank\" rel=\"noopener\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">Facebook<\/span><\/a><\/li>\r\n\r\n<li class=\"wp-social-link wp-social-link-medium  wp-block-social-link\"><a href=\"https:\/\/medium.com\/buildpiper\" class=\"wp-block-social-link-anchor\" target=\"_blank\" rel=\"noopener\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M20.962,7.257l-5.457,8.867l-3.923-6.375l3.126-5.08c0.112-0.182,0.319-0.286,0.527-0.286c0.05,0,0.1,0.008,0.149,0.02 c0.039,0.01,0.078,0.023,0.114,0.041l5.43,2.715l0.006,0.003c0.004,0.002,0.007,0.006,0.011,0.008 C20.971,7.191,20.98,7.227,20.962,7.257z M9.86,8.592v5.783l5.14,2.57L9.86,8.592z M15.772,17.331l4.231,2.115 C20.554,19.721,21,19.529,21,19.016V8.835L15.772,17.331z M8.968,7.178L3.665,4.527C3.569,4.479,3.478,4.456,3.395,4.456 C3.163,4.456,3,4.636,3,4.938v11.45c0,0.306,0.224,0.669,0.498,0.806l4.671,2.335c0.12,0.06,0.234,0.088,0.337,0.088 c0.29,0,0.494-0.225,0.494-0.602V7.231C9,7.208,8.988,7.188,8.968,7.178z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">Medium<\/span><\/a><\/li><\/ul>\r\n","protected":false},"excerpt":{"rendered":"<p>The problem that we faced: There was a cron scheduled in our environment at a particular time which used to run at 8AM. This cron read data from the s3 bucket and used to succeed but failed when there were no objects present. Problem this Integration solves:<\/p>\n","protected":false},"author":207494263,"featured_media":29900,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false},"version":2}},"categories":[28070474],"tags":[44070,768739294,303515361,768739308,676319247,768739299,4996032],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/opstree.com\/blog\/wp-content\/uploads\/2025\/11\/DevSecOps-1.jpg","jetpack_likes_enabled":true,"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/pfDBOm-3dO","jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts\/12388"}],"collection":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/users\/207494263"}],"replies":[{"embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/comments?post=12388"}],"version-history":[{"count":26,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts\/12388\/revisions"}],"predecessor-version":[{"id":29968,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts\/12388\/revisions\/29968"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/media\/29900"}],"wp:attachment":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/media?parent=12388"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/categories?post=12388"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/tags?post=12388"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}