{"id":35455,"date":"2023-05-17T12:27:52","date_gmt":"2023-05-17T12:27:52","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=35455"},"modified":"2023-05-17T12:34:10","modified_gmt":"2023-05-17T12:34:10","slug":"user-data-commands-run-in-each-ec2-instance-in-sequential-not-parallel","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/user-data-commands-run-in-each-ec2-instance-in-sequential-not-parallel\/","title":{"rendered":"Aws: user data commands run in each ec2 instance in sequential not parallel"},"content":{"rendered":"\n<p>AWS Approach: aws ec2 instance user data to make sure commands run in each ec2 instance in sequential not parallel<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Approach # 1<\/strong><\/h2>\n\n\n\n<p>To ensure that commands specified in the EC2 instance user data are executed sequentially rather than in parallel on multiple instances, you can use a synchronization mechanism such as a lock file or a distributed coordination service. Here&#8217;s an approach using a lock file:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Create a lock file in a shared location that is accessible by all EC2 instances. For example, you can use Amazon S3 or a shared network file system (NFS) mounted on each instance.<\/li>\n\n\n\n<li>Modify the EC2 instance user data script to check for the existence of the lock file before executing any commands. If the lock file exists, the script waits until the lock file is released; otherwise, it creates the lock file and continues with the execution.<\/li>\n<\/ol>\n\n\n\n<p>Here&#8217;s an example of how you can modify the user data script:<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">#!\/bin\/bash<\/span>\r\nlockfile=<span class=\"hljs-string\">\"\/path\/to\/lockfile\"<\/span>\r\n\r\n<span class=\"hljs-comment\"># Check if the lock file exists<\/span>\r\n<span class=\"hljs-keyword\">while<\/span> &#91; -f <span class=\"hljs-string\">\"$lockfile\"<\/span> ]; <span class=\"hljs-keyword\">do<\/span>\r\n    <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Lock file exists. Waiting for lock release...\"<\/span>\r\n    sleep <span class=\"hljs-number\">10<\/span>\r\ndone\r\n\r\n<span class=\"hljs-comment\"># Create the lock file<\/span>\r\ntouch <span class=\"hljs-string\">\"$lockfile\"<\/span>\r\n\r\n<span class=\"hljs-comment\"># Execute your sequential commands here<\/span>\r\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Executing command 1...\"<\/span>\r\n&lt;command <span class=\"hljs-number\">1<\/span>&gt;\r\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Executing command 2...\"<\/span>\r\n&lt;command <span class=\"hljs-number\">2<\/span>&gt;\r\n\r\n<span class=\"hljs-comment\"># Release the lock file<\/span>\r\nrm <span class=\"hljs-string\">\"$lockfile\"<\/span>\r\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">#!\/bin\/bash<\/span>\r\nbucket_name=<span class=\"hljs-string\">\"your-s3-bucket-name\"<\/span>\r\nlockfile_key=<span class=\"hljs-string\">\"lockfile\"<\/span>\r\n\r\n<span class=\"hljs-comment\"># Check if the lock file exists in S3 bucket<\/span>\r\n<span class=\"hljs-keyword\">while<\/span> aws s3 ls <span class=\"hljs-string\">\"s3:\/\/$bucket_name\/$lockfile_key\"<\/span> &gt;\/dev\/<span class=\"hljs-keyword\">null<\/span> <span class=\"hljs-number\">2<\/span>&gt;&amp;<span class=\"hljs-number\">1<\/span>; <span class=\"hljs-keyword\">do<\/span>\r\n    <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Lock file exists. Waiting for lock release...\"<\/span>\r\n    sleep <span class=\"hljs-number\">10<\/span>\r\ndone\r\n\r\n<span class=\"hljs-comment\"># Create the lock file<\/span>\r\naws s3 cp \/dev\/<span class=\"hljs-keyword\">null<\/span> <span class=\"hljs-string\">\"s3:\/\/$bucket_name\/$lockfile_key\"<\/span>\r\n\r\n<span class=\"hljs-comment\"># Execute your sequential commands here<\/span>\r\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Executing command 1...\"<\/span>\r\n&lt;command <span class=\"hljs-number\">1<\/span>&gt;\r\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Executing command 2...\"<\/span>\r\n&lt;command <span class=\"hljs-number\">2<\/span>&gt;\r\n\r\n<span class=\"hljs-comment\"># Release the lock file<\/span>\r\naws s3 rm <span class=\"hljs-string\">\"s3:\/\/$bucket_name\/$lockfile_key\"<\/span>\r\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">#!\/bin\/bash<\/span>\r\nbucket_name=<span class=\"hljs-string\">\"your-s3-bucket-name\"<\/span>\r\nlockfile_key=<span class=\"hljs-string\">\"lockfile\"<\/span>\r\n\r\n<span class=\"hljs-comment\"># Check if the lock file exists in S3 bucket<\/span>\r\n<span class=\"hljs-keyword\">while<\/span> aws s3api head-object --bucket <span class=\"hljs-string\">\"$bucket_name\"<\/span> --key <span class=\"hljs-string\">\"$lockfile_key\"<\/span> &gt;\/dev\/<span class=\"hljs-keyword\">null<\/span> <span class=\"hljs-number\">2<\/span>&gt;&amp;<span class=\"hljs-number\">1<\/span>; <span class=\"hljs-keyword\">do<\/span>\r\n    <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Lock file exists. Waiting for lock release...\"<\/span>\r\n    sleep <span class=\"hljs-number\">10<\/span>\r\ndone\r\n\r\n<span class=\"hljs-comment\"># Create the lock file<\/span>\r\naws s3api put-object --bucket <span class=\"hljs-string\">\"$bucket_name\"<\/span> --key <span class=\"hljs-string\">\"$lockfile_key\"<\/span> --body \/dev\/<span class=\"hljs-keyword\">null<\/span>\r\n\r\n<span class=\"hljs-comment\"># Execute your sequential commands here<\/span>\r\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Executing command 1...\"<\/span>\r\n&lt;command <span class=\"hljs-number\">1<\/span>&gt;\r\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Executing command 2...\"<\/span>\r\n&lt;command <span class=\"hljs-number\">2<\/span>&gt;\r\n\r\n<span class=\"hljs-comment\"># Release the lock file<\/span>\r\naws s3api delete-object --bucket <span class=\"hljs-string\">\"$bucket_name\"<\/span> --key <span class=\"hljs-string\">\"$lockfile_key\"<\/span>\r\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Approach # <\/strong>2<\/h2>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"961\" height=\"745\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/05\/image-488.png\" alt=\"\" class=\"wp-image-35462\" srcset=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/05\/image-488.png 961w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/05\/image-488-300x233.png 300w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/05\/image-488-768x595.png 768w\" sizes=\"auto, (max-width: 961px) 100vw, 961px\" \/><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>AWS Approach: aws ec2 instance user data to make sure commands run in each ec2 instance in sequential not parallel Approach # 1 To ensure that commands specified in the EC2 instance user data are executed sequentially rather than in parallel on multiple instances, you can use a synchronization mechanism such as a lock file&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","_joinchat":[],"footnotes":""},"categories":[2],"tags":[],"class_list":["post-35455","post","type-post","status-publish","format-standard","hentry","category-uncategorised"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/35455","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=35455"}],"version-history":[{"count":4,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/35455\/revisions"}],"predecessor-version":[{"id":35471,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/35455\/revisions\/35471"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=35455"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=35455"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=35455"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}