{"id":95110,"date":"2025-01-29T14:28:52","date_gmt":"2025-01-29T10:58:52","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/%d9%86%d8%ad%d9%88%d9%87-%d8%b3%d8%a7%d8%ae%d8%aa-%d9%88-%d8%aa%d8%b3%d8%aa-%db%8c%da%a9-%da%98%d9%86%d8%b1%d8%a7%d8%aa%d9%88%d8%b1-pdf-lambda-%d8%a8%d8%a7-%d8%a7%d8%b3%d8%aa%d9%81%d8%a7%d8%af%d9%87\/"},"modified":"2025-01-29T14:28:52","modified_gmt":"2025-01-29T10:58:52","slug":"%d9%86%d8%ad%d9%88%d9%87-%d8%b3%d8%a7%d8%ae%d8%aa-%d9%88-%d8%aa%d8%b3%d8%aa-%db%8c%da%a9-%da%98%d9%86%d8%b1%d8%a7%d8%aa%d9%88%d8%b1-pdf-lambda-%d8%a8%d8%a7-%d8%a7%d8%b3%d8%aa%d9%81%d8%a7%d8%af%d9%87","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/%d9%86%d8%ad%d9%88%d9%87-%d8%b3%d8%a7%d8%ae%d8%aa-%d9%88-%d8%aa%d8%b3%d8%aa-%db%8c%da%a9-%da%98%d9%86%d8%b1%d8%a7%d8%aa%d9%88%d8%b1-pdf-lambda-%d8%a8%d8%a7-%d8%a7%d8%b3%d8%aa%d9%81%d8%a7%d8%af%d9%87\/","title":{"rendered":"\u0646\u062d\u0648\u0647 \u0633\u0627\u062e\u062a \u0648 \u062a\u0633\u062a \u06cc\u06a9 \u0698\u0646\u0631\u0627\u062a\u0648\u0631 PDF Lambda \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 LocalStack \u062f\u0631 \u062f\u0633\u062a\u06af\u0627\u0647 \u0645\u062d\u0644\u06cc \u062e\u0648\u062f (\u0642\u0633\u0645\u062a 2: \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Terraform)"},"content":{"rendered":"<div data-article-id=\"2247382\" id=\"article-body\">\n<p>\u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0647 \u067e\u06cc\u06af\u06cc\u0631\u06cc \u067e\u0633\u062a \u0642\u0628\u0644\u06cc \u0645\u0646 \u060c \u0645\u0642\u0627\u0644\u0647 \u0627\u0633\u062a <strong>\u0646\u062d\u0648\u0647 \u0633\u0627\u062e\u062a \u0648 \u062a\u0633\u062a \u06cc\u06a9 \u0698\u0646\u0631\u0627\u062a\u0648\u0631 PDF Lambda \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 LocalStack \u062f\u0631 \u062f\u0633\u062a\u06af\u0627\u0647 \u0645\u062d\u0644\u06cc \u062e\u0648\u062f<\/strong> <\/p>\n<p>\u062f\u0631 \u0622\u0646 \u0645\u0642\u0627\u0644\u0647 \u060c \u0645\u0646 \u0634\u0645\u0627 \u0631\u0627 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u0646\u062d\u0648\u0647 \u0633\u0627\u062e\u062a \u0648 \u062a\u0633\u062a \u06cc\u06a9 \u0639\u0645\u0644\u06a9\u0631\u062f Lambda \u0698\u0646\u0631\u0627\u062a\u0648\u0631 PDF \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u062e\u062f\u0645\u0627\u062a Mock AWS \u067e\u06cc\u0627\u062f\u0647 \u0631\u0648\u06cc \u06a9\u0631\u062f\u0645.<strong>AWS Lambda \u060c \u0631\u062c\u06cc\u0633\u062a\u0631\u06cc \u06a9\u0627\u0646\u062a\u06cc\u0646\u0631 \u0627\u0644\u0627\u0633\u062a\u06cc\u06a9 (ECR) \u0648 \u0633\u0637\u0644 S3<\/strong>\u2014via <strong>\u0645\u062d\u0644 \u06a9\u0627\u0631<\/strong>\u0628\u0634\u0631 \u0645\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0631\u062f\u06cc\u0645 <code>awslocal<\/code> CLI \u0628\u0631\u0627\u06cc \u062a\u0647\u06cc\u0647 \u0632\u06cc\u0631\u0633\u0627\u062e\u062a \u0647\u0627\u06cc \u0645\u0648\u0631\u062f \u0646\u06cc\u0627\u0632.<\/p>\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u067e\u06cc\u06af\u06cc\u0631\u06cc \u060c \u0645\u0627 \u0631\u0648\u06cc\u06a9\u0631\u062f \u0645\u062a\u0641\u0627\u0648\u062a\u06cc \u062e\u0648\u0627\u0647\u06cc\u0645 \u062f\u0627\u0634\u062a. \u0628\u0647 \u062c\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 CLI \u060c \u0645\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f <strong>\u0634\u06a9\u0644<\/strong>\u060c \u06cc\u06a9 \u0632\u06cc\u0631\u0633\u0627\u062e\u062a \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0627\u0628\u0632\u0627\u0631 \u06a9\u062f (IAC) \u060c \u0628\u0631\u0627\u06cc \u062a\u0623\u0645\u06cc\u0646 \u0645\u0646\u0627\u0628\u0639 \u0645\u0627. \u0627\u06cc\u0646 \u0631\u0627\u0647\u0646\u0645\u0627 \u0633\u0627\u062f\u0647 \u0648 \u0633\u0627\u062f\u0647 \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f \u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 <strong>\u062a\u062c\u0631\u0628\u0647 \u0627\u0633\u0627\u0633\u06cc Terraform \u062a\u0645\u0627\u0645 \u0622\u0646\u0686\u0647 \u0634\u0645\u0627 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u06cc\u062f<\/strong> \u062f\u0646\u0628\u0627\u0644 \u06a9\u0631\u062f\u0646<\/p>\n<p>\u0627\u06af\u0631 \u0647\u0646\u0648\u0632 \u0645\u0642\u0627\u0644\u0647 \u0642\u0628\u0644\u06cc \u0631\u0627 \u0646\u062e\u0648\u0627\u0646\u062f\u0647 \u0627\u06cc\u062f \u060c \u062a\u0648\u0635\u06cc\u0647 \u0645\u06cc \u06a9\u0646\u0645 \u0627\u0628\u062a\u062f\u0627 \u0622\u0646 \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u062f \u0632\u06cc\u0631\u0627 \u0627\u06cc\u0646 \u067e\u0648\u0634\u0634 \u0631\u0627 \u067e\u0648\u0634\u0634 \u0645\u06cc \u062f\u0647\u062f <strong>\u0645\u0646\u0637\u0642 \u0646\u0633\u0644 PDF \u062e\u0648\u062f<\/strong>\u060c \u06a9\u0647 \u0645\u0627 \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u062a\u06a9\u0631\u0627\u0631 \u0646\u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f.<\/p>\n<p>\u0628\u06cc\u0627\u06cc\u06cc\u062f \u0634\u0631\u0648\u0639 \u06a9\u0646\u06cc\u0645<\/p>\n<h2>\n<p>  \u067e\u06cc\u0634 \u0646\u06cc\u0627\u0632\u0647\u0627\u06cc<br \/>\n<\/h2>\n<p>\u0642\u0628\u0644 \u0627\u0632 \u0627\u0646\u062c\u0627\u0645 \u060c \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u062d\u0627\u0635\u0644 \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u0645\u0648\u0627\u0631\u062f \u0632\u06cc\u0631 \u0631\u0627 \u0646\u0635\u0628 \u06a9\u0631\u062f\u0647 \u0627\u06cc\u062f:<\/p>\n<ol>\n<li>\u0627\u0633\u06a9\u0644\u0647<\/li>\n<li>\u067e\u0627\u06cc\u062a\u0648\u0646 3.9+<\/li>\n<li>\u062d\u0633\u0627\u0628 \u0645\u062d\u0644\u06cc<\/li>\n<li>CLI LocalStack<\/li>\n<li>\u062f\u0633\u06a9 \u062a\u0627\u067e \u0645\u062d\u0644\u06cc<\/li>\n<li>\u0634\u06a9\u0644<\/li>\n<\/ol>\n<p><strong>1: \u0638\u0631\u0641 \u0645\u062d\u0644\u06cc \u0631\u0627 \u0645\u062c\u062f\u062f\u0627\u064b \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f<\/strong><\/p>\n<p>\u0628\u0631\u0627\u06cc \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u0627\u0632 \u06cc\u06a9 \u0645\u062d\u06cc\u0637 \u062a\u0645\u06cc\u0632 \u0648 \u062c\u0644\u0648\u06af\u06cc\u0631\u06cc \u0627\u0632 \u0647\u0631\u06af\u0648\u0646\u0647 \u062f\u0631\u06af\u06cc\u0631\u06cc \u0628\u0627 \u062e\u062f\u0645\u0627\u062a \u0642\u0628\u0644\u0627\u064b \u0627\u0631\u0627\u0626\u0647 \u0634\u062f\u0647 \u060c \u0628\u0627\u06cc\u062f \u0638\u0631\u0641 \u0645\u062d\u0644\u06cc \u062e\u0648\u062f \u0631\u0627 \u0645\u062c\u062f\u062f\u0627\u064b \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f. \u0627\u06cc\u0646 \u0645\u0631\u062d\u0644\u0647 \u0645\u0647\u0645 \u0627\u0633\u062a \u0632\u06cc\u0631\u0627 \u0628\u0647 \u0645\u0627 \u0627\u0645\u06a9\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u0627\u0632 \u0646\u0627\u0645 \u0645\u0646\u0627\u0628\u0639 \u0645\u0648\u0631\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062f\u0631 \u0645\u0642\u0627\u0644\u0647 \u0622\u062e\u0631 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u062c\u062f\u062f \u06a9\u0646\u06cc\u0645.<\/p>\n<p>\u0628\u0627 \u0641\u0634\u0627\u0631 \u062f\u0627\u062f\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0638\u0631\u0641 \u062f\u0631 \u062d\u0627\u0644 \u0627\u062c\u0631\u0627 \u0631\u0627 \u062e\u0627\u062a\u0645\u0647 \u062f\u0647\u06cc\u062f <code>CTRL + C<\/code> \u0641\u0631\u0645\u0627\u0646 \u060c \u06cc\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0638\u0631\u0641 \u0631\u0627 \u0645\u0633\u062a\u0642\u06cc\u0645\u0627\u064b \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0622\u0646 \u0645\u062a\u0648\u0642\u0641 \u06a9\u0646\u06cc\u062f <strong>\u062f\u0633\u06a9 \u062a\u0627\u067e \u0645\u062d\u0644\u06cc<\/strong> \u0628\u0631\u0646\u0627\u0645\u0647 \u0633\u067e\u0633 \u0628\u0627 \u0627\u062c\u0631\u0627\u06cc \u0627\u06cc\u0646 \u062f\u0633\u062a\u0648\u0631 \u060c \u0638\u0631\u0641 \u0631\u0627 \u0645\u062c\u062f\u062f\u0627\u064b \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f <code>DEBUG=1 localstack start<\/code>\u0628\u0634\u0631<\/p>\n<p><strong>2. \u0628\u0633\u062a\u0647 \u0628\u0646\u062f\u06cc Terraform-local \u0631\u0627 \u0646\u0635\u0628 \u06a9\u0646\u06cc\u062f<\/strong><br \/>\u062f\u0631 \u0641\u0647\u0631\u0633\u062a \u0631\u06cc\u0634\u0647 \u0646\u0627\u0645\u06af\u0630\u0627\u0631\u06cc \u0634\u062f\u0647 \u0627\u0633\u062a <code>localstack<\/code>\u060c \u0627\u06af\u0631 \u0642\u0628\u0644\u0627\u064b \u0641\u0639\u0627\u0644 \u0646\u06cc\u0633\u062a \u060c \u0644\u0637\u0641\u0627\u064b \u0645\u062d\u06cc\u0637 \u0645\u062c\u0627\u0632\u06cc \u062e\u0648\u062f \u0631\u0627 \u0641\u0639\u0627\u0644 \u06a9\u0646\u06cc\u062f. <\/p>\n<p>\u0633\u067e\u0633 \u060c \u0646\u0635\u0628 \u06a9\u0646\u06cc\u062f <code>terraform-local<\/code> \u0628\u0633\u062a\u0647 \u060c \u06a9\u0647 \u06cc\u06a9 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0628\u0633\u062a\u0647 \u0628\u0646\u062f\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0628\u0647 \u0634\u0645\u0627 \u0627\u0645\u06a9\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u0627\u0632 Terraform \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0645\u0646\u0627\u0628\u0639 \u0628\u0647 \u0645\u062d\u06cc\u0637 \u0645\u062d\u0644\u06cc \u062e\u0648\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f. \u0627\u06cc\u0646 \u0627\u0628\u0632\u0627\u0631 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Terraform \u0628\u0647 \u0635\u0648\u0631\u062a \u0645\u062d\u0644\u06cc \u0628\u0627 LocalStack \u0633\u0627\u062f\u0647 \u0645\u06cc \u0634\u0648\u062f \u0648 \u06cc\u06a9 \u0627\u062f\u063a\u0627\u0645 \u0635\u0627\u0641 \u0628\u06cc\u0646 \u0627\u06cc\u0646 \u062f\u0648 \u0631\u0627 \u0641\u0631\u0627\u0647\u0645 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>pip <span class=\"nb\">install <\/span>terraform-local\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><strong>3. \u0627\u06cc\u062c\u0627\u062f \u0632\u06cc\u0631\u0633\u0627\u062e\u062a<\/strong><\/p>\n<p>\u0628\u0639\u062f \u060c \u06cc\u06a9 \u067e\u0648\u0634\u0647 \u062c\u062f\u06cc\u062f \u0628\u0647 \u0646\u0627\u0645 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f <code>infrastructure<\/code>\u0628\u0634\u0631 \u0627\u06cc\u0646 \u067e\u0648\u0634\u0647 \u067e\u0631\u0648\u0646\u062f\u0647 \u0647\u0627\u06cc \u0632\u06cc\u0631 \u0631\u0627 \u062f\u0631 \u062e\u0648\u062f \u062c\u0627\u06cc \u0645\u06cc \u062f\u0647\u062f:<\/p>\n<ol>\n<li><code>locals.tf<\/code><\/li>\n<li><code>versions.tf<\/code><\/li>\n<li><code>main.tf<\/code><\/li>\n<li><code>scripts\/build_and_push_lambda_image.sh<\/code><\/li>\n<\/ol>\n<p>\u0628\u06cc\u0627\u06cc\u06cc\u062f \u0646\u06af\u0627\u0647\u06cc \u062f\u0642\u06cc\u0642 \u062a\u0631 \u0628\u0647 \u0647\u0631 \u06cc\u06a9 \u0627\u0632 \u0627\u06cc\u0646 \u067e\u0631\u0648\u0646\u062f\u0647 \u0647\u0627 \u0648 \u0646\u0642\u0634 \u0647\u0627\u06cc \u0622\u0646\u0647\u0627 \u062f\u0631 \u062a\u0646\u0638\u06cc\u0645 \u0632\u06cc\u0631\u0633\u0627\u062e\u062a \u0647\u0627 \u0628\u06cc\u0646\u062f\u0627\u0632\u06cc\u0645.<\/p>\n<p><strong>1. \u0627\u0641\u0631\u0627\u062f \u0645\u062d\u0644\u06cc. tf<\/strong><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>locals <span class=\"o\">{<\/span>\n  aws_region      <span class=\"o\">=<\/span> <span class=\"s2\">\"eu-west-1\"<\/span>\n  pdf_bucket_name <span class=\"o\">=<\/span> <span class=\"s2\">\"my-pdf-bucket\"<\/span>\n  pdf_ecr_name    <span class=\"o\">=<\/span> <span class=\"s2\">\"pdf-generator-image\"<\/span>\n  pdf_generator_lambda <span class=\"o\">=<\/span> <span class=\"o\">{<\/span>\n    function_name <span class=\"o\">=<\/span> <span class=\"s2\">\"pdf-generator-lambda\"<\/span>\n  <span class=\"o\">}<\/span>\n<span class=\"o\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062f\u0631 \u067e\u0631\u0648\u0646\u062f\u0647 \u0645\u062d\u0644\u06cc. tf \u060c \u0645\u0627 \u0628\u0631\u062e\u06cc \u0627\u0632 \u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u0627\u0633\u0627\u0633\u06cc \u0631\u0627 \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc \u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u062f\u0631 \u06a9\u0644 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc Terraform \u0645\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u0634\u0648\u062f. \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u060c \u0645\u0627 \u0645\u0646\u0637\u0642\u0647 AWS \u060c \u0646\u0627\u0645 \u0633\u0637\u0644 S3 \u060c \u0646\u0627\u0645 \u0645\u062e\u0632\u0646 ECR \u0648 \u0646\u0627\u0645 \u0639\u0645\u0644\u06a9\u0631\u062f Lambda \u0631\u0627 \u0645\u0634\u062e\u0635 \u0645\u06cc \u06a9\u0646\u06cc\u0645.<\/p>\n<p><strong>2. \u0646\u0633\u062e\u0647 \u0647\u0627. tf<\/strong><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>terraform <span class=\"o\">{<\/span>\n  required_providers <span class=\"o\">{<\/span>\n    aws <span class=\"o\">=<\/span> <span class=\"o\">{<\/span>\n      <span class=\"nb\">source<\/span>  <span class=\"o\">=<\/span> <span class=\"s2\">\"hashicorp\/aws\"<\/span>\n      version <span class=\"o\">=<\/span> <span class=\"s2\">\"~&gt; 5.59.0\"<\/span>\n    <span class=\"o\">}<\/span>\n\n    random <span class=\"o\">=<\/span> <span class=\"o\">{<\/span>\n      <span class=\"nb\">source<\/span>  <span class=\"o\">=<\/span> <span class=\"s2\">\"hashicorp\/random\"<\/span>\n      version <span class=\"o\">=<\/span> <span class=\"s2\">\"~&gt; 3.6.2\"<\/span>\n    <span class=\"o\">}<\/span>\n  <span class=\"o\">}<\/span>\n<span class=\"o\">}<\/span>\n\nprovider <span class=\"s2\">\"aws\"<\/span> <span class=\"o\">{<\/span>\n  region <span class=\"o\">=<\/span> local.aws_region\n\n<span class=\"o\">}<\/span>\n\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062f\u0631 <code>versions.tf<\/code> \u067e\u0631\u0648\u0646\u062f\u0647 \u060c \u0645\u0627 \u0627\u0631\u0627\u0626\u0647 \u062f\u0647\u0646\u062f\u06af\u0627\u0646 \u0645\u0648\u0631\u062f \u0646\u06cc\u0627\u0632 \u0631\u0627 \u0628\u0631\u0627\u06cc \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc Terraform \u062e\u0648\u062f \u0645\u0634\u062e\u0635 \u0645\u06cc \u06a9\u0646\u06cc\u0645. \u0645\u0627 \u0627\u0631\u0627\u0626\u0647 \u062f\u0647\u0646\u062f\u0647 AWS (HashicorP\/AWS) \u0631\u0627 \u0628\u0631\u0627\u06cc \u062a\u0639\u0627\u0645\u0644 \u0628\u0627 \u062e\u062f\u0645\u0627\u062a AWS \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc \u06a9\u0646\u06cc\u0645 \u0648 \u0627\u0631\u0627\u0626\u0647 \u062f\u0647\u0646\u062f\u0647 \u062a\u0635\u0627\u062f\u0641\u06cc (Hashicorp\/Random) \u0628\u0631\u0627\u06cc \u062a\u0648\u0644\u06cc\u062f \u0645\u0642\u0627\u062f\u06cc\u0631 \u062a\u0635\u0627\u062f\u0641\u06cc \u0645\u0627\u0646\u0646\u062f \u0634\u0646\u0627\u0633\u0647 \u0647\u0627\u06cc \u0645\u0646\u062d\u0635\u0631 \u0628\u0647 \u0641\u0631\u062f. \u0645\u0627 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0627\u0631\u0627\u0626\u0647 \u062f\u0647\u0646\u062f\u0647 AWS \u0631\u0627 \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0645\u0646\u0637\u0642\u0647 \u062a\u0639\u0631\u06cc\u0641 \u0634\u062f\u0647 \u062f\u0631 <code>locals.tf<\/code> \u067e\u0631\u0648\u0646\u062f\u0647 (<code>local.aws_region<\/code>). \u0627\u06cc\u0646 \u067e\u0631\u0648\u0646\u062f\u0647 \u062a\u0636\u0645\u06cc\u0646 \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 Terraform \u0647\u0646\u06af\u0627\u0645 \u062a\u0647\u06cc\u0647 \u0632\u06cc\u0631\u0633\u0627\u062e\u062a \u0627\u0632 \u0627\u0631\u0627\u0626\u0647 \u062f\u0647\u0646\u062f\u06af\u0627\u0646 \u0648 \u0646\u0633\u062e\u0647 \u0647\u0627\u06cc \u0635\u062d\u06cc\u062d \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p><strong>3. main.tf<\/strong><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code><span class=\"c\"># Generate random string for the bucket name<\/span>\nresource <span class=\"s2\">\"random_id\"<\/span> <span class=\"s2\">\"pdf_bucket_suffix\"<\/span> <span class=\"o\">{<\/span>\n  byte_length <span class=\"o\">=<\/span> 6\n<span class=\"o\">}<\/span>\n\n<span class=\"c\"># S3 bucket for storing the generated PDF files<\/span>\nresource <span class=\"s2\">\"aws_s3_bucket\"<\/span> <span class=\"s2\">\"pdf_bucket\"<\/span> <span class=\"o\">{<\/span>\n  bucket        <span class=\"o\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nv\">local<\/span><span class=\"p\">.pdf_bucket_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">-<\/span><span class=\"k\">${<\/span><span class=\"nv\">random_id<\/span><span class=\"p\">.pdf_bucket_suffix.hex<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\n  force_destroy <span class=\"o\">=<\/span> <span class=\"nb\">true\n\n  <\/span>lifecycle <span class=\"o\">{<\/span>\n    prevent_destroy <span class=\"o\">=<\/span> <span class=\"nb\">false<\/span>\n  <span class=\"o\">}<\/span>\n\n  tags <span class=\"o\">=<\/span> <span class=\"o\">{<\/span>\n    Name <span class=\"o\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nv\">local<\/span><span class=\"p\">.pdf_bucket_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\n  <span class=\"o\">}<\/span>\n<span class=\"o\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0645\u0627 \u0627\u0628\u062a\u062f\u0627 \u06cc\u06a9 \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u06cc\u0645 <code>random_id<\/code> \u0645\u0646\u0628\u0639 \u0628\u0631\u0627\u06cc \u062a\u0648\u0644\u06cc\u062f \u06cc\u06a9 \u0631\u0634\u062a\u0647 \u062a\u0635\u0627\u062f\u0641\u06cc \u060c \u06a9\u0647 \u0628\u0647 \u0646\u0627\u0645 \u0633\u0637\u0644 S3 \u0636\u0645\u06cc\u0645\u0647 \u0645\u06cc \u0634\u0648\u062f \u0648 \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u062d\u0627\u0635\u0644 \u0645\u06cc \u0634\u0648\u062f \u06a9\u0647 \u0628\u06cc \u0646\u0638\u06cc\u0631 \u0627\u0633\u062a. \u062f\u0631 <code>byte_length = 6<\/code> \u0637\u0648\u0644 \u0631\u0634\u062a\u0647 \u062a\u0635\u0627\u062f\u0641\u06cc \u0631\u0627 \u0645\u0634\u062e\u0635 \u0645\u06cc \u06a9\u0646\u062f. \u0633\u067e\u0633 <code>aws_s3_bucket<\/code> \u0645\u0646\u0628\u0639 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0646\u0627\u0645 \u0633\u0637\u0644 \u062a\u0639\u0631\u06cc\u0641 \u0634\u062f\u0647 \u062a\u0648\u0633\u0637 \u0645\u062a\u063a\u06cc\u0631 \u0645\u062d\u0644\u06cc \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u0634\u0648\u062f (<code>local.pdf_bucket_name<\/code>) \u0647\u0645\u0631\u0627\u0647 \u0628\u0627 \u067e\u0633\u0648\u0646\u062f \u062a\u0635\u0627\u062f\u0641\u06cc. \u0645\u0627 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0633\u0637\u0644 \u0631\u0627 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0645\u06cc \u06a9\u0646\u06cc\u0645 \u062a\u0627 \u0627\u062c\u0627\u0632\u0647 \u062a\u062e\u0631\u06cc\u0628 \u0627\u062c\u0628\u0627\u0631\u06cc (<code>force_destroy = true<\/code>) \u0627\u06cc\u0646 \u0628\u062f\u0627\u0646 \u0645\u0639\u0646\u06cc \u0627\u0633\u062a \u06a9\u0647 \u062d\u062a\u06cc \u0627\u06af\u0631 \u062d\u0627\u0648\u06cc \u0627\u0634\u06cc\u0627\u0621 \u0628\u0627\u0634\u062f \u0645\u06cc \u062a\u0648\u0627\u0646 \u0622\u0646 \u0631\u0627 \u062d\u0630\u0641 \u06a9\u0631\u062f. \u0633\u0631\u0627\u0646\u062c\u0627\u0645 \u060c \u0628\u0644\u0648\u06a9 \u0686\u0631\u062e\u0647 \u0639\u0645\u0631 \u0634\u0627\u0645\u0644 \u0645\u06cc \u0634\u0648\u062f <code>prevent_destroy = false<\/code> \u062a\u0646\u0638\u06cc\u0645 \u060c \u06a9\u0647 \u062a\u0636\u0645\u06cc\u0646 \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 Terraform \u062f\u0631 \u0635\u0648\u0631\u062a \u0644\u0632\u0648\u0645 \u062a\u062e\u0631\u06cc\u0628 \u0633\u0637\u0644 \u0631\u0627 \u0645\u0633\u062f\u0648\u062f \u0646\u062e\u0648\u0627\u0647\u062f \u06a9\u0631\u062f.<\/p>\n<ul>\n<li>\n<code>Elastic Container Registry<\/code>\n<\/li>\n<\/ul>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code><span class=\"c\"># ECR repository for storing the Docker images<\/span>\nresource <span class=\"s2\">\"aws_ecr_repository\"<\/span> <span class=\"s2\">\"pdf_generator_ecr\"<\/span> <span class=\"o\">{<\/span>\n  name <span class=\"o\">=<\/span> local.pdf_ecr_name\n<span class=\"o\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062f\u0631 <code>aws_ecr_repository<\/code> \u0627\u0632 \u0645\u0646\u0628\u0639 \u0628\u0631\u0627\u06cc \u0627\u06cc\u062c\u0627\u062f \u0645\u062e\u0632\u0646 ECR \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u0634\u0648\u062f \u06a9\u0647 \u062f\u0631 \u0622\u0646 \u062a\u0635\u0648\u06cc\u0631 Docker \u0628\u0631\u0627\u06cc \u0639\u0645\u0644\u06a9\u0631\u062f Lambda \u0630\u062e\u06cc\u0631\u0647 \u0645\u06cc \u0634\u0648\u062f. \u0646\u0627\u0645 \u0645\u062e\u0632\u0646 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0645\u062a\u063a\u06cc\u0631 \u0645\u062d\u0644\u06cc \u062a\u0639\u0631\u06cc\u0641 \u0634\u062f\u0647 \u0627\u0633\u062a <code>local.pdf_ecr_name<\/code>\u0628\u0634\u0631<\/p>\n<ul>\n<li>\n<code>Build and Push Image to ECR<\/code>\n<\/li>\n<\/ul>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code><span class=\"c\"># Run your existing image push script using null_resource<\/span>\nresource <span class=\"s2\">\"null_resource\"<\/span> <span class=\"s2\">\"run_build_and_push_image_script\"<\/span> <span class=\"o\">{<\/span>\n  provisioner <span class=\"s2\">\"local-exec\"<\/span> <span class=\"o\">{<\/span>\n    <span class=\"nb\">command<\/span> <span class=\"o\">=<\/span> <span class=\"s2\">\"bash <\/span><span class=\"k\">${<\/span><span class=\"nv\">path<\/span><span class=\"p\">.module<\/span><span class=\"k\">}<\/span><span class=\"s2\">\/scripts\/build_and_push_lambda_image.sh\"<\/span>\n    environment <span class=\"o\">=<\/span> <span class=\"o\">{<\/span>\n      ECR_REPO_URI <span class=\"o\">=<\/span> aws_ecr_repository.pdf_generator_ecr.repository_url\n    <span class=\"o\">}<\/span>\n  <span class=\"o\">}<\/span>\n\n  depends_on <span class=\"o\">=<\/span> <span class=\"o\">[<\/span>\n    aws_ecr_repository.pdf_generator_ecr <span class=\"c\"># Ensure the repository exists before running the script<\/span>\n  <span class=\"o\">]<\/span>\n<span class=\"o\">}<\/span>\n\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u0632 \u0622\u0646\u062c\u0627 \u06a9\u0647 \u0645\u0627 \u0646\u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u06cc\u06a9 \u0639\u0645\u0644\u06a9\u0631\u062f \u0644\u0627\u0645\u0628\u062f\u0627 \u062e\u0627\u0644\u06cc \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u0645 \u060c \u0628\u0627\u06cc\u062f \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u062d\u0627\u0635\u0644 \u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u0642\u0628\u0644 \u0627\u0632 \u0627\u06cc\u062c\u0627\u062f \u0639\u0645\u0644\u06a9\u0631\u062f \u0644\u0627\u0645\u0628\u062f\u0627 \u060c \u06cc\u06a9 \u062a\u0635\u0648\u06cc\u0631 \u0645\u0648\u062c\u0648\u062f \u062f\u0627\u0631\u06cc\u0645. \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 <code>null_resource<\/code> \u0628\u0644\u0648\u06a9 \u0628\u0631\u0627\u06cc \u062a\u0645\u0627\u0633 \u0628\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0645\u0627 <code>scripts\/build_and_push_lambda_image.sh<\/code> \u0627\u06cc\u0646 \u062a\u0635\u0648\u06cc\u0631 Docker \u0631\u0627 \u0628\u0631\u0627\u06cc \u0639\u0645\u0644\u06a9\u0631\u062f \u0698\u0646\u0631\u0627\u062a\u0648\u0631 PDF \u0645\u0627 \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u062f \u0648 \u0622\u0646 \u0631\u0627 \u0628\u0647 \u0645\u062e\u0632\u0646 ECR \u06a9\u0647 \u062f\u0631 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u062a\u0639\u0631\u06cc\u0641 \u0634\u062f\u0647 \u0627\u0633\u062a \u060c \u0645\u0633\u062a\u0642\u0631 \u0645\u06cc \u06a9\u0646\u062f. \u0645\u0627 \u0628\u0639\u062f \u0627\u0632 \u062a\u06a9\u0645\u06cc\u0644 \u067e\u0631\u0648\u0646\u062f\u0647 \u0627\u0635\u0644\u06cc. tf \u060c \u0645\u062d\u062a\u0648\u0627 \u0631\u0627 \u0628\u0647 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0627\u0636\u0627\u0641\u0647 \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f.<\/p>\n<p>\u062f\u0631 \u0627\u06cc\u0646 <code>null_resource<\/code> \u0628\u0644\u0648\u06a9 \u060c \u0645\u0627 \u0639\u0628\u0648\u0631 \u0645\u06cc \u06a9\u0646\u06cc\u0645 <code>ECR_REPO_URI<\/code> \u0645\u062a\u063a\u06cc\u0631 \u0645\u062d\u06cc\u0637 \u0628\u0647 <code>build_and_push_lambda_image.sh<\/code> \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u060c \u06a9\u0647 \u0628\u0647 \u0622\u0646 \u0627\u062c\u0627\u0632\u0647 \u0645\u06cc \u062f\u0647\u062f \u062a\u0627 \u0628\u0647 \u0635\u0648\u0631\u062a \u067e\u0648\u06cc\u0627 \u0627\u0632 URL \u0635\u062d\u06cc\u062d \u0645\u062e\u0632\u0646 ECR \u0622\u0645\u0627\u0632\u0648\u0646 \u0628\u0631\u0627\u06cc \u0641\u0634\u0627\u0631 \u062f\u0627\u062f\u0646 \u062a\u0635\u0648\u06cc\u0631 Docker \u0633\u0627\u062e\u062a\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u062f. \u062f\u0631 <code>depends_on<\/code> \u0622\u0631\u0627\u06cc\u0647 \u062a\u0636\u0645\u06cc\u0646 \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0641\u0642\u0637 \u067e\u0633 \u0627\u0632 \u0645\u062e\u0632\u0646 ECR \u0627\u062c\u0631\u0627 \u0645\u06cc \u0634\u0648\u062f (<code>aws_ecr_repository.pdf_generator_ecr<\/code>) \u0627\u06cc\u062c\u0627\u062f \u0634\u062f\u0647 \u0627\u0633\u062a \u060c \u0648 \u062c\u0644\u0648\u06af\u06cc\u0631\u06cc \u0627\u0632 \u0647\u0631\u06af\u0648\u0646\u0647 \u0645\u0634\u06a9\u0644 \u0628\u0631\u0627\u06cc \u0641\u0634\u0627\u0631 \u0622\u0648\u0631\u062f\u0646 \u062a\u0635\u0648\u06cc\u0631 \u0628\u0647 \u06cc\u06a9 \u0645\u062e\u0632\u0646 \u063a\u06cc\u0631 \u0645\u0648\u062c\u0648\u062f \u0627\u0633\u062a. <\/p>\n<p><strong>\u0633\u0644\u0628 \u0645\u0633\u0626\u0648\u0644\u06cc\u062a:<\/strong> \u0631\u0648\u06cc\u06a9\u0631\u062f \u0645\u0648\u0631\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062f\u0631 \u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634 \u0641\u0642\u0637 \u0628\u0631\u0627\u06cc \u0627\u0647\u062f\u0627\u0641 \u0622\u0645\u0648\u0632\u0634\u06cc \u0627\u0633\u062a. \u062f\u0631 \u062d\u0627\u0644\u06cc \u06a9\u0647 Terraform \u0627\u0628\u0632\u0627\u0631\u06cc \u0642\u062f\u0631\u062a\u0645\u0646\u062f \u0628\u0631\u0627\u06cc \u062a\u0647\u06cc\u0647 \u0632\u06cc\u0631\u0633\u0627\u062e\u062a \u0647\u0627 \u0627\u0633\u062a \u060c \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0622\u0646 \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a \u0648 \u0641\u0634\u0627\u0631 \u062a\u0635\u0627\u0648\u06cc\u0631 Docker \u0628\u0631\u0627\u06cc \u0645\u062d\u06cc\u0637 \u0647\u0627\u06cc \u062a\u0648\u0644\u06cc\u062f \u062a\u0648\u0635\u06cc\u0647 \u0646\u0645\u06cc \u0634\u0648\u062f. \u062f\u0631 \u062a\u0648\u0644\u06cc\u062f \u060c \u0628\u0647\u062a\u0631 \u0627\u0633\u062a \u0627\u0632 \u06cc\u06a9 \u062e\u0637 \u0644\u0648\u0644\u0647 CI\/CD \u0627\u062e\u062a\u0635\u0627\u0635\u06cc \u0628\u0631\u0627\u06cc \u0645\u062f\u06cc\u0631\u06cc\u062a \u0645\u0635\u0646\u0648\u0639\u0627\u062a \u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code><span class=\"c\"># IAM Role for Lambda Execution<\/span>\nresource <span class=\"s2\">\"aws_iam_role\"<\/span> <span class=\"s2\">\"pdf_generator_lambda_role\"<\/span> <span class=\"o\">{<\/span>\n  name <span class=\"o\">=<\/span> <span class=\"s2\">\"ExecRole-<\/span><span class=\"k\">${<\/span><span class=\"nv\">local<\/span><span class=\"p\">.pdf_generator_lambda.function_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\n  assume_role_policy <span class=\"o\">=<\/span> jsonencode<span class=\"o\">({<\/span>\n    Version <span class=\"o\">=<\/span> <span class=\"s2\">\"2012-10-17\"<\/span>\n    Statement <span class=\"o\">=<\/span> <span class=\"o\">[<\/span>\n      <span class=\"o\">{<\/span>\n        Action <span class=\"o\">=<\/span> <span class=\"s2\">\"sts:AssumeRole\"<\/span>\n        Effect <span class=\"o\">=<\/span> <span class=\"s2\">\"Allow\"<\/span>\n        Sid    <span class=\"o\">=<\/span> <span class=\"s2\">\"\"<\/span>\n        Principal <span class=\"o\">=<\/span> <span class=\"o\">{<\/span>\n          Service <span class=\"o\">=<\/span> <span class=\"s2\">\"lambda.amazonaws.com\"<\/span>\n        <span class=\"o\">}<\/span>\n      <span class=\"o\">}<\/span>,\n    <span class=\"o\">]<\/span>\n  <span class=\"o\">})<\/span>\n<span class=\"o\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062f\u0631 <code>aws_iam_role.pdf_generator_lambda_role<\/code> \u0646\u0642\u0634 IAM \u0628\u0647 \u0639\u0645\u0644\u06a9\u0631\u062f \u0644\u0627\u0645\u0628\u062f\u0627 \u0627\u062c\u0627\u0632\u0647 \u0645\u06cc \u062f\u0647\u062f \u0645\u062c\u0648\u0632\u0647\u0627\u06cc \u0644\u0627\u0632\u0645 \u0628\u0631\u0627\u06cc \u0627\u062c\u0631\u0627\u06cc \u0631\u0627 \u0641\u0631\u0636 \u06a9\u0646\u062f. \u0627\u06cc\u0646 \u0645\u062c\u0648\u0632 \u062e\u062f\u0645\u0627\u062a \u0644\u0627\u0645\u0628\u062f\u0627 \u0631\u0627 \u0628\u0631\u0627\u06cc \u062a\u0639\u0627\u0645\u0644 \u0628\u0627 \u0645\u0646\u0627\u0628\u0639 AWS \u0628\u0647 \u0637\u0648\u0631 \u0627\u06cc\u0645\u0646 \u0628\u0627 \u062a\u0639\u0631\u06cc\u0641 <code>assume_role_policy<\/code> \u0628\u0627 \u0645\u062c\u0648\u0632\u0647\u0627\u06cc \u0645\u0646\u0627\u0633\u0628<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code><span class=\"c\"># Lambda Function for PDF Generation<\/span>\nresource <span class=\"s2\">\"aws_lambda_function\"<\/span> <span class=\"s2\">\"pdf_generator\"<\/span> <span class=\"o\">{<\/span>\n  function_name <span class=\"o\">=<\/span> local.pdf_generator_lambda.function_name\n  role          <span class=\"o\">=<\/span> aws_iam_role.pdf_generator_lambda_role.arn\n  package_type  <span class=\"o\">=<\/span> <span class=\"s2\">\"Image\"<\/span>\n  image_uri     <span class=\"o\">=<\/span> aws_ecr_repository.pdf_generator_ecr.repository_url\n  <span class=\"nb\">timeout<\/span>       <span class=\"o\">=<\/span> 60\n  memory_size   <span class=\"o\">=<\/span> 128\n  architectures <span class=\"o\">=<\/span> <span class=\"o\">[<\/span><span class=\"s2\">\"arm64\"<\/span><span class=\"o\">]<\/span>\n\n  environment <span class=\"o\">{<\/span>\n    variables <span class=\"o\">=<\/span> <span class=\"o\">{<\/span>\n      S3_BUCKET_NAME <span class=\"o\">=<\/span> aws_s3_bucket.pdf_bucket.bucket\n    <span class=\"o\">}<\/span>\n  <span class=\"o\">}<\/span>\n\n  depends_on <span class=\"o\">=<\/span> <span class=\"o\">[<\/span>\n    aws_ecr_repository.pdf_generator_ecr,         <span class=\"c\"># Ensure the ECR repo exists before pushing the image<\/span>\n    null_resource.run_build_and_push_image_script <span class=\"c\"># Ensure the script runs before Lambda is created<\/span>\n  <span class=\"o\">]<\/span>\n<span class=\"o\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0645\u0627 \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc \u06a9\u0646\u06cc\u0645 <code>pdf_generator<\/code> \u062a\u0627\u0628\u0639 Lambda \u060c \u0645\u0634\u062e\u0635 \u06a9\u0631\u062f\u0646 \u0646\u0627\u0645 \u0639\u0645\u0644\u06a9\u0631\u062f \u060c \u0646\u0642\u0634 IAM \u0648 \u062a\u0635\u0648\u06cc\u0631 \u06a9\u0627\u0646\u062a\u06cc\u0646\u0631 \u0627\u0632 \u0645\u062e\u0632\u0646 ECR. Lambda \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 128 \u0645\u06af\u0627\u0628\u0627\u06cc\u062a \u062d\u0627\u0641\u0638\u0647 \u0648 \u06cc\u06a9 \u0632\u0645\u0627\u0646 60 \u062b\u0627\u0646\u06cc\u0647 \u0627\u06cc \u0627\u062e\u062a\u0635\u0627\u0635 \u062f\u0627\u062f\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a. <code>arm64<\/code> \u0645\u0639\u0645\u0627\u0631\u06cc \u0645\u0627 \u06cc\u06a9 \u0645\u062a\u063a\u06cc\u0631 \u0645\u062d\u06cc\u0637 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0646\u0627\u0645 \u0633\u0637\u0644 S3 \u062a\u0646\u0638\u06cc\u0645 \u0645\u06cc \u06a9\u0646\u06cc\u0645. \u062f\u0631 <code>depends_on<\/code> \u0628\u0644\u0648\u06a9 \u062a\u0636\u0645\u06cc\u0646 \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 \u0644\u0627\u0645\u0628\u062f\u0627 \u062a\u0646\u0647\u0627 \u067e\u0633 \u0627\u0632 \u0648\u062c\u0648\u062f \u0645\u062e\u0632\u0646 ECR \u0627\u06cc\u062c\u0627\u062f \u0634\u062f\u0647 \u0648 \u062a\u0635\u0648\u06cc\u0631 Docker \u0633\u0627\u062e\u062a\u0647 \u0648 \u062a\u062d\u062a \u0641\u0634\u0627\u0631 \u0642\u0631\u0627\u0631 \u0645\u06cc \u06af\u06cc\u0631\u062f. <\/p>\n<p><strong>\u062a\u0648\u062c\u0647:<\/strong> \u0627\u06af\u0631 \u062f\u0633\u062a\u06af\u0627\u0647 \u062a\u0648\u0633\u0639\u0647 \u0645\u062d\u0644\u06cc \u0634\u0645\u0627 \u06cc\u0627 \u0645\u062d\u06cc\u0637\u06cc \u06a9\u0647 \u062f\u0631 \u0622\u0646 \u062f\u0631 \u062d\u0627\u0644 \u0633\u0627\u062e\u062a \u0639\u0645\u0644\u06a9\u0631\u062f \u0644\u0627\u0645\u0628\u062f\u0627 \u0647\u0633\u062a\u06cc\u062f \u0627\u0632 \u0645\u0639\u0645\u0627\u0631\u06cc \u0645\u062a\u0641\u0627\u0648\u062a\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f \u060c \u0645\u0627\u0646\u0646\u062f <code>x86_64<\/code> (\u0645\u0634\u062a\u0631\u06a9 \u0628\u0631\u0627\u06cc \u0628\u0633\u06cc\u0627\u0631\u06cc \u0627\u0632 \u0645\u0627\u0634\u06cc\u0646 \u0647\u0627\u06cc \u0644\u06cc\u0646\u0648\u06a9\u0633 \u06cc\u0627 \u0648\u06cc\u0646\u062f\u0648\u0632) \u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646\u06cc\u062f <code>architectures<\/code> \u0645\u0642\u062f\u0627\u0631 \u0622\u0631\u0627\u06cc\u0647 \u0627\u0632 <code>arm64<\/code> \u0628\u0647 <code>x86_64<\/code>\u0628\u0634\u0631<\/p>\n<p><strong>4. \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0647\u0627\/build_and_push_lambda_image.sh<\/strong><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code><span class=\"c\">#!\/bin\/bash<\/span>\n\n<span class=\"c\"># Get the ECR URI from the environment variable<\/span>\n<span class=\"nv\">ECR_REPO_URI<\/span><span class=\"o\">=<\/span><span class=\"nv\">$ECR_REPO_URI<\/span>\n\n<span class=\"c\"># Now you can use the $ECR_REPO_URI in the script<\/span>\n<span class=\"nb\">echo<\/span> <span class=\"s2\">\"ECR URI: <\/span><span class=\"nv\">$ECR_REPO_URI<\/span><span class=\"s2\">\"<\/span>\n\n<span class=\"c\"># get the current directory<\/span>\n<span class=\"nv\">SCRIPT_DIR<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"<\/span><span class=\"si\">$(<\/span> <span class=\"nb\">cd<\/span> <span class=\"s2\">\"<\/span><span class=\"si\">$(<\/span> <span class=\"nb\">dirname<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nv\">BASH_SOURCE<\/span><span class=\"p\">[0]<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span> <span class=\"si\">)<\/span><span class=\"s2\">\"<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"nb\">pwd<\/span> <span class=\"si\">)<\/span><span class=\"s2\">\"<\/span>\n\n<span class=\"c\"># Navigate to the lambda function directory<\/span>\n<span class=\"nb\">echo<\/span> <span class=\"s2\">\"Navigating to lambda function directory...\"<\/span>\n<span class=\"nb\">cd<\/span> <span class=\"nv\">$SCRIPT_DIR<\/span>\/..\/..\/pdf-generator-lambda <span class=\"o\">||<\/span> <span class=\"nb\">exit <\/span>1\n\n<span class=\"nb\">echo<\/span> <span class=\"s2\">\"Current directory: <\/span><span class=\"si\">$(<\/span><span class=\"nb\">pwd<\/span><span class=\"si\">)<\/span><span class=\"s2\">\"<\/span>\n\n<span class=\"c\"># Build the docker image<\/span>\n<span class=\"nb\">echo<\/span> <span class=\"s2\">\"Building the docker image...\"<\/span>\ndocker build <span class=\"nt\">--no-cache<\/span> <span class=\"nt\">-t<\/span> lambda-container-image <span class=\"nb\">.<\/span>\n\n<span class=\"c\"># Tag the image with the ECR repository URI<\/span>\n<span class=\"nb\">echo<\/span> <span class=\"s2\">\"Tagging the docker image with the ECR repository URI...\"<\/span>\ndocker tag lambda-container-image <span class=\"nv\">$ECR_REPO_URI<\/span>\n\n<span class=\"c\"># Push the image to the ECR repository<\/span>\n<span class=\"nb\">echo<\/span> <span class=\"s2\">\"Pushing the docker image to the ECR repository...\"<\/span>\ndocker push <span class=\"nv\">$ECR_REPO_URI<\/span>\n\n<span class=\"nb\">echo<\/span> <span class=\"s2\">\"Script execution completed.\"<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u06cc\u0646 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0639\u0645\u0644\u06a9\u0631\u062f PDF Generator Lambda \u0631\u0627 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u06cc\u06a9 \u062a\u0635\u0648\u06cc\u0631 Docker \u0645\u06cc \u0633\u0627\u0632\u062f \u060c \u0622\u0646 \u0631\u0627 \u0628\u0631\u0686\u0633\u0628 \u0645\u06cc \u0632\u0646\u062f \u0648 \u0622\u0646 \u0631\u0627 \u0628\u0647 \u0645\u062e\u0632\u0646 ECR \u0645\u0634\u062e\u0635 \u0645\u06cc \u06a9\u0646\u062f. \u062f\u0631 <code>ECR_REPO_URI<\/code> \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u06cc\u06a9 \u0645\u062a\u063a\u06cc\u0631 \u0645\u062d\u06cc\u0637 \u0627\u0632 <code>null_resource<\/code> \u0645\u0633\u062f\u0648\u062f \u06a9\u0631\u062f\u0646 \u062f\u0631 <code>main.tf<\/code> \u067e\u0631\u0648\u0646\u062f\u0647<\/p>\n<p>\u0627\u06cc\u0646 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0644\u0627\u0632\u0645 \u0631\u0627 \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc \u062f\u0647\u062f. \u0642\u0628\u0644 \u0627\u0632 \u0627\u06cc\u0646\u06a9\u0647 \u0645\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0646\u0635\u0628 \u0634\u062f\u0647 \u060c \u0632\u06cc\u0631\u0633\u0627\u062e\u062a \u0647\u0627 \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u0645 <code>tflocal<\/code> \u0628\u0633\u062a\u0647 \u060c \u0628\u06cc\u0627\u06cc\u06cc\u062f \u06cc\u06a9 \u062a\u063a\u06cc\u06cc\u0631 \u06a9\u0648\u0686\u06a9 \u062f\u0631 <code>upload_file.py<\/code> \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u06a9\u0647 \u0628\u0627\u0631\u06af\u0630\u0627\u0631\u06cc \u0641\u0627\u06cc\u0644 PDF \u062a\u0648\u0644\u06cc\u062f \u0634\u062f\u0647 \u0631\u0627 \u0628\u0647 \u0633\u0637\u0644 S3 \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc \u062f\u0647\u062f. \u067e\u06cc\u0634 \u0627\u0632 \u0627\u06cc\u0646 \u060c \u0645\u0627 \u0631\u0627 \u0633\u062e\u062a \u06af\u0631\u0641\u062a\u06cc\u0645 <code>bucket-name<\/code>\u061b \u0627\u06a9\u0646\u0648\u0646 \u060c \u0628\u0647 \u062c\u0627\u06cc \u0622\u0646 \u060c \u0622\u0646 \u0631\u0627 \u0627\u0632 \u0645\u062d\u06cc\u0637 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u06cc\u06a9 \u0645\u062a\u063a\u06cc\u0631 \u0645\u062d\u06cc\u0637 \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f.<\/p>\n<p><strong>upload_file.py<\/strong><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>import os\n\n.....\nS3_BUCKET_NAME <span class=\"o\">=<\/span> os.environ.get<span class=\"o\">(<\/span><span class=\"s2\">\"S3_BUCKET_NAME\"<\/span><span class=\"o\">)<\/span>\n\n.....\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0648\u0627\u0631\u062f \u06a9\u0631\u062f\u0646 <code>os<\/code> \u0645\u0627\u0698\u0648\u0644 \u0648 \u062e\u0637 \u0628\u0627\u0644\u0627 \u0631\u0627 \u0627\u0635\u0644\u0627\u062d \u06a9\u0646\u06cc\u062f \u062a\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0627\u0632 \u0622\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u062f <code>S3_BUCKET_NAME<\/code> \u0645\u062a\u063a\u06cc\u0631 \u0645\u062d\u06cc\u0637 \u0628\u0647 \u062c\u0627\u06cc \u062a\u06a9\u06cc\u0647 \u0628\u0631 \u06cc\u06a9 \u0645\u0642\u062f\u0627\u0631 \u06a9\u062f\u06af\u0630\u0627\u0631\u06cc \u0634\u062f\u0647.<\/p>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u0645\u0627 \u0622\u0645\u0627\u062f\u0647 \u0627\u06cc\u062c\u0627\u062f \u0632\u06cc\u0631\u0633\u0627\u062e\u062a \u0647\u0627\u06cc \u062e\u0648\u062f \u0647\u0633\u062a\u06cc\u0645. \u0627\u0632 \u062f\u0627\u062e\u0644 <code>infrastructure<\/code> \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u060c \u0627\u062c\u0631\u0627<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>tflocal init\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u06cc\u0646 \u06a9\u0627\u0631 Terraform \u0631\u0627 \u0622\u063a\u0627\u0632 \u0645\u06cc \u06a9\u0646\u062f \u0648 \u067e\u0633 \u0627\u0632 \u0627\u062c\u0631\u0627\u06cc \u0645\u0648\u0641\u0642\u06cc\u062a \u0622\u0645\u06cc\u0632 \u060c \u0628\u0631\u062e\u06cc \u0627\u0632 \u067e\u0631\u0648\u0646\u062f\u0647 \u0647\u0627 \u0631\u0627 \u062a\u0648\u0644\u06cc\u062f \u0645\u06cc \u06a9\u0646\u062f. \u0628\u0639\u062f \u060c \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>tflocal plan\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u06cc\u0646 \u06cc\u06a9 \u0646\u0645\u0627\u06cc \u06a9\u0644\u06cc \u0627\u0632 \u062a\u0645\u0627\u0645 \u0645\u0646\u0627\u0628\u0639 AWS \u06a9\u0647 \u062f\u0631 \u0638\u0631\u0641 \u0641\u0639\u0627\u0644 \u0645\u062d\u0644\u06cc \u0641\u0639\u0627\u0644 \u062a\u0647\u06cc\u0647 \u0648 \u062a\u0646\u0638\u06cc\u0645 \u0645\u06cc \u0634\u0648\u0646\u062f \u060c \u0628\u0627\u0632 \u0645\u06cc \u06af\u0631\u062f\u062f. \u0634\u0645\u0627 \u0628\u0627\u06cc\u062f \u06cc\u06a9 \u062e\u0637 \u0645\u0634\u0627\u0628\u0647 \u0628\u0627: <em>\u0628\u0631\u0646\u0627\u0645\u0647: 6 \u0628\u0631\u0627\u06cc \u0627\u0641\u0632\u0648\u062f\u0646 \u060c 0 \u0628\u0631\u0627\u06cc \u062a\u063a\u06cc\u06cc\u0631 \u060c 0 \u0628\u0631\u0627\u06cc \u0627\u0632 \u0628\u06cc\u0646 \u0628\u0631\u062f\u0646<\/em>\u0628\u0634\u0631<\/p>\n<p>\u0633\u0631\u0627\u0646\u062c\u0627\u0645 \u060c \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>tflocal apply\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0628\u0631\u0627\u06cc \u0627\u06cc\u062c\u0627\u062f \u0645\u0646\u0627\u0628\u0639 \u0627\u06cc\u0646 \u06cc\u06a9 \u0645\u0631\u0648\u0631 \u06a9\u0644\u06cc \u0634\u0628\u06cc\u0647 \u0628\u0647 \u0622\u0646\u0686\u0647 \u0642\u0628\u0644\u0627\u064b \u0647\u0646\u06af\u0627\u0645 \u0627\u062c\u0631\u0627 \u062f\u06cc\u062f\u06cc\u062f \u0646\u0634\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f <code>tflocal plan<\/code>\u060c \u0648 \u0627\u0632 \u0634\u0645\u0627 \u0645\u06cc \u062e\u0648\u0627\u0647\u062f \u062a\u0627 \u062a\u0623\u06cc\u06cc\u062f \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u0622\u06cc\u0627 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u062f \u0627\u062f\u0627\u0645\u0647 \u062f\u0647\u06cc\u062f \u06cc\u0627 \u062e\u06cc\u0631. \u0628\u0647 \u0633\u0627\u062f\u06af\u06cc \u062a\u0627\u06cc\u067e \u06a9\u0646\u06cc\u062f <code>yes<\/code>\u060c \u0648 \u062a\u0645\u0627\u0645 \u0645\u0646\u0627\u0628\u0639 \u0634\u0645\u0627 \u062f\u0631 LocalStack \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u0634\u0648\u062f. \u0628\u0631\u0627\u06cc \u0628\u0631\u0631\u0633\u06cc \u0639\u0642\u0644 \u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 AWS CLI \u06cc\u0627 \u062f\u0633\u06a9 \u062a\u0627\u067e LocalStack \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f \u062a\u0627 \u062a\u0623\u06cc\u06cc\u062f \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u0645\u0646\u0627\u0628\u0639 \u0632\u06cc\u0631 \u0627\u06cc\u062c\u0627\u062f \u0634\u062f\u0647 \u0627\u0633\u062a: <code>S3 bucket<\/code>\u0628\u0627 <code>ECR repo<\/code>\u0648\u062a <code>Lambda function<\/code>\u0628\u0634\u0631<\/p>\n<p>\u062d\u0627\u0644 \u060c \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0639\u0645\u0644\u06a9\u0631\u062f \u0644\u0627\u0645\u0628\u062f\u0627 \u062e\u0648\u062f \u0631\u0627 \u0641\u0631\u0627\u062e\u0648\u0627\u0646\u06cc \u06a9\u0646\u06cc\u0645. \u062f\u0648\u0628\u0627\u0631\u0647 \u0628\u0647 <code>pdf-generator-lambda<\/code> \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u0648 \u062f\u0633\u062a\u0648\u0631 \u0632\u06cc\u0631 \u0631\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>awslocal lambda invoke <span class=\"nt\">--function-name<\/span> pdf-generator-lambda <span class=\"nt\">--payload<\/span> file:\/\/event.json \/tmp\/lambda.out\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0634\u0645\u0627 \u0628\u0627\u06cc\u062f \u06cc\u06a9 \u067e\u06cc\u0627\u0645 \u0645\u0648\u0641\u0642\u06cc\u062a \u0622\u0645\u06cc\u0632 \u0645\u0627\u0646\u0646\u062f \u0627\u06cc\u0646 \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code><span class=\"o\">{<\/span>\n    <span class=\"s2\">\"StatusCode\"<\/span>: 200,\n    <span class=\"s2\">\"ExecutedVersion\"<\/span>: <span class=\"s2\">\"<\/span><span class=\"nv\">$LATEST<\/span><span class=\"s2\">\"<\/span>\n<span class=\"o\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u062a\u0623\u06cc\u06cc\u062f \u06a9\u0646\u06cc\u062f \u06a9\u0647 PDF \u0628\u0627 \u062d\u0631\u06a9\u062a \u062f\u0631 \u0633\u0637\u0644 S3 \u0628\u0627 \u062d\u0631\u06a9\u062a \u0628\u0647 \u0633\u0637\u0644 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u062f\u0633\u06a9 \u062a\u0627\u067e LocalStack \u0648 \u0628\u0627\u0631\u06af\u06cc\u0631\u06cc PDF \u062f\u0631 \u0633\u0637\u0644 S3 \u062a\u0648\u0644\u06cc\u062f \u0648 \u0630\u062e\u06cc\u0631\u0647 \u0634\u062f.<\/p>\n<p><strong>\u062a\u0628\u0631\u06cc\u06a9 \u0645\u06cc \u06af\u0648\u06cc\u0645! \ud83c\udf89<\/strong><br \/>\u0634\u0645\u0627 \u0628\u0627 \u0645\u0648\u0641\u0642\u06cc\u062a \u0632\u06cc\u0631\u0633\u0627\u062e\u062a \u0647\u0627\u06cc \u062e\u0648\u062f \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Terraform \u0648 LocalStack \u062a\u0646\u0638\u06cc\u0645 \u0648 \u0622\u0632\u0645\u0627\u06cc\u0634 \u06a9\u0631\u062f\u0647 \u0627\u06cc\u062f. \u0627\u0632 \u062e\u0648\u0627\u0646\u062f\u0646 \u0634\u0645\u0627 \u0645\u062a\u0634\u06a9\u0631\u0645!<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0647 \u067e\u06cc\u06af\u06cc\u0631\u06cc \u067e\u0633\u062a \u0642\u0628\u0644\u06cc \u0645\u0646 \u060c \u0645\u0642\u0627\u0644\u0647 \u0627\u0633\u062a \u0646\u062d\u0648\u0647 \u0633\u0627\u062e\u062a \u0648 \u062a\u0633\u062a \u06cc\u06a9 \u0698\u0646\u0631\u0627\u062a\u0648\u0631 PDF Lambda \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 LocalStack \u062f\u0631 \u062f\u0633\u062a\u06af\u0627\u0647 \u0645\u062d\u0644\u06cc \u062e\u0648\u062f \u062f\u0631 \u0622\u0646 \u0645\u0642\u0627\u0644\u0647 \u060c \u0645\u0646 \u0634\u0645\u0627 \u0631\u0627 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u0646\u062d\u0648\u0647 \u0633\u0627\u062e\u062a \u0648 \u062a\u0633\u062a \u06cc\u06a9 \u0639\u0645\u0644\u06a9\u0631\u062f Lambda \u0698\u0646\u0631\u0627\u062a\u0648\u0631 PDF \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u062e\u062f\u0645\u0627\u062a Mock AWS \u067e\u06cc\u0627\u062f\u0647 \u0631\u0648\u06cc \u06a9\u0631\u062f\u0645.AWS Lambda \u060c \u0631\u062c\u06cc\u0633\u062a\u0631\u06cc &hellip;<\/p>\n","protected":false},"author":2,"featured_media":95111,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"https:\/\/media2.dev.to\/dynamic\/image\/width=1000,height=500,fit=cover,gravity=auto,format=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp4bwmgvtwz8qttt15eza.png","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-95110","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/95110","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=95110"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/95110\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/95111"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=95110"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=95110"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=95110"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}