<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Debug School: Suyash Sambhare</title>
    <description>The latest articles on Debug School by Suyash Sambhare (@suyash).</description>
    <link>https://www.debug.school/suyash</link>
    <image>
      <url>https://www.debug.school/images/_oBG0EVLTPOYAnX0OCd-EzwpedSOpoZEU6sEV-leEps/rs:fill:90:90/g:sm/mb:500000/ar:1/aHR0cHM6Ly93d3cu/ZGVidWcuc2Nob29s/L3VwbG9hZHMvdXNl/ci9wcm9maWxlX2lt/YWdlLzQyNC9kNGFl/Yzk0Ny1hMjQ2LTRj/MDQtOGEyOC0xMjg3/NzM2MGMzYzkucG5n</url>
      <title>Debug School: Suyash Sambhare</title>
      <link>https://www.debug.school/suyash</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://www.debug.school/feed/suyash"/>
    <language>en</language>
    <item>
      <title>Spark on EKS</title>
      <dc:creator>Suyash Sambhare</dc:creator>
      <pubDate>Wed, 08 Jul 2026 02:31:15 +0000</pubDate>
      <link>https://www.debug.school/suyash/spark-on-eks-4m88</link>
      <guid>https://www.debug.school/suyash/spark-on-eks-4m88</guid>
      <description>&lt;h2&gt;
  
  
  Running and Optimizing Analytics Workloads on Amazon EKS
&lt;/h2&gt;

&lt;p&gt;This advanced 400-level workshop demonstrates how to optimize Apache Spark  workloads on Amazon EKS Auto Mode  through hands-on exercises focusing on performance, and cost optimization using various pricing options (EC2 Spot ), processor architecture (AWS Graviton processor  based instances), Amazon EC2 instance types  (Memory Optimized and Compute Optimized families), and Amazon EC2 storage configurations (NVMe storage based instances). This workshop, designed to be completed in under two hours, provides you with practical experience in setting up observability tools, leveraging various processor choices, computes families, and storage options to achieve optimal performance and cost-effectiveness for your Spark jobs on Amazon EKS.&lt;/p&gt;

&lt;h2&gt;
  
  
  Provision the Stack
&lt;/h2&gt;

&lt;p&gt;First, clone the spark-workshop branch from the data-on-eks repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;terraform
git clone &lt;span class="nt"&gt;-b&lt;/span&gt; spark-workshop https://github.com/awslabs/data-on-eks.git
&lt;span class="nb"&gt;cd &lt;/span&gt;data-on-eks/analytics/terraform/spark-k8s-operator
./install.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The script will sequentially provision:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;VPC and networking components&lt;/li&gt;
&lt;li&gt;EKS cluster with AutoMode&lt;/li&gt;
&lt;li&gt;Karpenter node classes and pools&lt;/li&gt;
&lt;li&gt;EBS CSI driver and storage classes&lt;/li&gt;
&lt;li&gt;EKS Blueprints addons&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Update Kubeconfig
&lt;/h2&gt;

&lt;p&gt;Once the deployment is complete, update your local kubeconfig to access the Kubernetes cluster:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws eks update-kubeconfig &lt;span class="nt"&gt;--name&lt;/span&gt; spark-on-eks &lt;span class="nt"&gt;--region&lt;/span&gt; us-west-2
kubectl get nodes
NAME                  STATUS   ROLES    AGE     VERSION
i-02ffb325c17f97793   Ready    &amp;lt;none&amp;gt;   15m     v1.33.7-eks-3c60543
i-054759a89b32ca877   Ready    &amp;lt;none&amp;gt;   15m     v1.33.7-eks-3c60543
i-0cad804d029dcd457   Ready    &amp;lt;none&amp;gt;   6m44s   v1.33.7-eks-3c60543

kubectl get pods &lt;span class="nt"&gt;-A&lt;/span&gt;
NAMESPACE               NAME                                                              READY   STATUS    RESTARTS        AGE
amazon-cloudwatch       amazon-cloudwatch-observability-controller-manager-bbffd6cdtkbh   1/1     Running   0               16m
amazon-cloudwatch       cloudwatch-agent-fvnxt                                            1/1     Running   0               16m
amazon-cloudwatch       cloudwatch-agent-h97jm                                            1/1     Running   1 &lt;span class="o"&gt;(&lt;/span&gt;7m36s ago&lt;span class="o"&gt;)&lt;/span&gt;   7m49s
amazon-cloudwatch       cloudwatch-agent-ltrdn                                            1/1     Running   0               16m
amazon-cloudwatch       fluent-bit-5fj54                                                  1/1     Running   0               16m
amazon-cloudwatch       fluent-bit-f6jf9                                                  1/1     Running   0               7m49s
amazon-cloudwatch       fluent-bit-nd9jv                                                  1/1     Running   0               16m
ingress-nginx           ingress-nginx-controller-6f449f6b9d-52mfg                         1/1     Running   0               8m54s
kube-prometheus-stack   kube-prometheus-stack-grafana-b8644d6bb-9hr49                     3/3     Running   0               8m48s
kube-prometheus-stack   kube-prometheus-stack-kube-state-metrics-787d55fc86-zcx2g         1/1     Running   0               8m48s
kube-prometheus-stack   kube-prometheus-stack-operator-79df675c88-hzgmk                   1/1     Running   0               8m48s
kube-prometheus-stack   kube-prometheus-stack-prometheus-node-exporter-bqdkw              1/1     Running   0               8m48s
kube-prometheus-stack   kube-prometheus-stack-prometheus-node-exporter-lmwj5              1/1     Running   0               7m49s
kube-prometheus-stack   kube-prometheus-stack-prometheus-node-exporter-rdrbm              1/1     Running   0               8m48s
kube-prometheus-stack   prometheus-kube-prometheus-stack-prometheus-0                     2/2     Running   0               8m41s
kube-system             aws-for-fluent-bit-2qzqf                                          1/1     Running   0               8m40s
kube-system             aws-for-fluent-bit-tkwlt                                          1/1     Running   0               8m40s
kube-system             aws-for-fluent-bit-zsvb5                                          1/1     Running   0               7m47s
kube-system             coredns-7bf648ff5d-kszkh                                          1/1     Running   0               16m
kube-system             coredns-7bf648ff5d-vw5b8                                          1/1     Running   0               16m
kube-system             ebs-csi-controller-6554fb87b4-2cj2k                               6/6     Running   0               16m
kube-system             ebs-csi-controller-6554fb87b4-9kjbk                               6/6     Running   0               16m
kube-system             metrics-server-5b9d857696-2mthf                                   1/1     Running   0               16m
kube-system             metrics-server-5b9d857696-d9tvl                                   1/1     Running   0               16m
kube-system             s3-csi-controller-5c9697d6fd-hlkpd                                1/1     Running   0               16m
kube-system             s3-csi-node-5k56b                                                 3/3     Running   0               16m
kube-system             s3-csi-node-jtb2p                                                 3/3     Running   0               16m
kube-system             s3-csi-node-k2drl                                                 3/3     Running   0               7m49s
kubecost                kubecost-cost-analyzer-7b5cd5cdc6-rblrm                           4/4     Running   0               8m6s
kubecost                kubecost-forecasting-7b75bc5bbb-8nhfr                             1/1     Running   0               8m6s
kubecost                kubecost-network-costs-b2cmq                                      1/1     Running   0               8m6s
kubecost                kubecost-network-costs-hjsv2                                      1/1     Running   0               8m6s
kubecost                kubecost-network-costs-rz25g                                      1/1     Running   0               7m48s
spark-history-server    spark-history-server-0                                            1/1     Running   0               8m8s
spark-operator          spark-operator-controller-85d96b88fc-mr4qd                        1/1     Running   0               8m7s
spark-operator          spark-operator-webhook-66c6b99949-pdh6z                           1/1     Running   0               8m7s

&lt;span class="nb"&gt;cd &lt;/span&gt;data-on-eks/analytics/scripts
python3 data-gen.py

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Gather Key Terraform Output Values
&lt;/h2&gt;

&lt;p&gt;Set the repository's local home path as an environment variable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;REPO_HOME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;/data-on-eks
&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="nv"&gt;$REPO_HOME&lt;/span&gt;/analytics/terraform/spark-k8s-operator  

&lt;span class="c"&gt;#Value for S3 Logs Bucket name&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;s3_logs_bucket_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;terraform output &lt;span class="nt"&gt;-raw&lt;/span&gt; s3_bucket_id_spark_history_server&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;#Value for S3 Logs Bucket region&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;s3_logs_bucket_region&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;terraform output &lt;span class="nt"&gt;-raw&lt;/span&gt; s3_bucket_region_spark_history_server&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="nv"&gt;$REPO_HOME&lt;/span&gt;/analytics/scripts
bash order-execute.sh &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;s3_logs_bucket_name&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;s3_logs_bucket_region&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://www.debug.school/uploads/articles/bfpwnoqkurw0coclw7zu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://www.debug.school/uploads/articles/bfpwnoqkurw0coclw7zu.png" alt="EKS" width="120" height="226"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Deploy and Monitor Spark Job
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Configure the Spark job
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="nv"&gt;$REPO_HOME&lt;/span&gt;/analytics/terraform/spark-k8s-operator/examples/karpenter
&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"s|&amp;lt;S3_BUCKET&amp;gt;|&lt;/span&gt;&lt;span class="nv"&gt;$s3_logs_bucket_name&lt;/span&gt;&lt;span class="s2"&gt;|g"&lt;/span&gt; spark-app-ondemand.yaml
kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; spark-app-ondemand.yaml

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once you apply the Spark Job configuration the following happens:&lt;/p&gt;

&lt;p&gt;Spark Driver Provisioning:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Spark Driver pod requests: 2 CPU cores, 6GB memory (4GB + 2GB overhead)&lt;/li&gt;
&lt;li&gt;Auto Mode identifies no matching nodes with &lt;code&gt;NodeGroupType=SparkComputeGeneral&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Auto Mode provisions a new node matching requirements and AZ constraints&lt;/li&gt;
&lt;li&gt;Spark Driver pod schedules and initializes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Spark Executor Setup:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Spark Driver requests 4 Spark Executor pods&lt;/li&gt;
&lt;li&gt;Each Spark Executor needs: 2 CPU cores, 6GB memory&lt;/li&gt;
&lt;li&gt;Total Spark Executor requirements: 8 cores, 24GB memory&lt;/li&gt;
&lt;li&gt;Auto Mode provisions 1-2 nodes based on bin-packing efficiency&lt;/li&gt;
&lt;li&gt;All nodes must support the requirements, capacity requirements, and be in correct AZ&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Spark Job Execution:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Processes data from &lt;code&gt;s3a://spark-on-eks/order/input/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Writes to &lt;code&gt;s3a://spark-on-eks/order/output/ondemand/&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;AWS_REGION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$AWS_REGION&lt;/span&gt; eks-node-viewer &lt;span class="nt"&gt;-resources&lt;/span&gt; cpu,memory &lt;span class="nt"&gt;-extra-labels&lt;/span&gt; &lt;span class="s2"&gt;"karpenter.sh/nodepool,topology.kubernetes.io/zone"&lt;/span&gt;
kubectl get sparkapplication &lt;span class="nt"&gt;-n&lt;/span&gt; spark-team-a
NAME             STATUS      ATTEMPTS   START                  FINISH       AGE
order-ondemand   SUBMITTED   1          2025-11-21T00:42:07Z   &amp;lt;no value&amp;gt;   47s

kubectl get pod &lt;span class="nt"&gt;-n&lt;/span&gt; spark-team-a &lt;span class="nt"&gt;-l&lt;/span&gt; spark-role&lt;span class="o"&gt;=&lt;/span&gt;driver
NAME                    READY   STATUS    RESTARTS   AGE
order-ondemand-driver   1/1     Running   0          84s

kubectl get pod &lt;span class="nt"&gt;-n&lt;/span&gt; spark-team-a &lt;span class="nt"&gt;-l&lt;/span&gt; spark-role&lt;span class="o"&gt;=&lt;/span&gt;executor
NAME                    READY   STATUS    RESTARTS   AGE
order-ondemand-exec-1   1/1     Running   0          57s
order-ondemand-exec-2   1/1     Running   0          57s
order-ondemand-exec-3   1/1     Running   0          56s
order-ondemand-exec-4   1/1     Running   0          56s

kubectl describe sparkapplication order-ondemand &lt;span class="nt"&gt;-n&lt;/span&gt; spark-team-a
Name:         order-ondemand
Namespace:    spark-team-a
Labels:       &lt;span class="nv"&gt;app&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;order-ondemand
              &lt;span class="nv"&gt;queue&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;root.test
Annotations:  &amp;lt;none&amp;gt;
API Version:  sparkoperator.k8s.io/v1beta2
Kind:         SparkApplication
Metadata:
  Creation Timestamp:  2025-11-21T00:42:07Z
  Generation:          1
  Resource Version:    440830
  UID:                 660e1012-30a6-479c-92eb-6fa46b768029
Spec:
  Arguments:
    s3a://spark-on-eks-spark-logs-20251120082140604400000004/order/input/
    s3a://spark-on-eks-spark-logs-20251120082140604400000004/order/output/ondemand/
  Deps:
  Driver:
    Annotations:
      karpenter.sh/do-not-disrupt:  &lt;span class="nb"&gt;true
    &lt;/span&gt;Cores:                          2
    Memory:                         4g
    Memory Overhead:                2g
    Node Selector:
      Node Group Type:             SparkComputeGeneral
      karpenter.sh/capacity-type:  on-demand
    Service Account:               spark-team-a
  Executor:
    Affinity:
      Pod Affinity:
        Required During Scheduling Ignored During Execution:
          Label Selector:
            Match Expressions:
              Key:       app
              Operator:  In
              Values:
                order-ondemand
          Topology Key:  topology.kubernetes.io/zone
    Annotations:
      karpenter.sh/do-not-disrupt:  &lt;span class="nb"&gt;true
    &lt;/span&gt;Cores:                          2
    Instances:                      4
    Memory:                         4g
    Memory Overhead:                2g
    Node Selector:
      Node Group Type:             SparkComputeGeneral
      karpenter.sh/capacity-type:  on-demand
    Service Account:               spark-team-a
  Image:                           public.ecr.aws/data-on-eks/spark:4.0.1-scala2.13-java21-python3-r-ubuntu
  Image Pull Policy:               IfNotPresent
  Main Application File:           s3a://spark-on-eks-spark-logs-20251120082140604400000004/scripts/pyspark-order.py
  Mode:                            cluster
  Python Version:                  3
  Restart Policy:
    On Failure Retries:                    3
    On Failure Retry Interval:             10
    On Submission Failure Retries:         3
    On Submission Failure Retry Interval:  20
    Type:                                  OnFailure
  Spark Conf:
    spark.app.name:                                           order-ondemand
    spark.eventLog.dir:                                       s3a://spark-on-eks-spark-logs-20251120082140604400000004/spark-event-logs
    spark.eventLog.enabled:                                   &lt;span class="nb"&gt;true
    &lt;/span&gt;spark.eventLog.rolling.enabled:                           &lt;span class="nb"&gt;true
    &lt;/span&gt;spark.eventLog.rolling.maxFileSize:                       64m
    spark.executor.processTreeMetrics.enabled:                &lt;span class="nb"&gt;true
    &lt;/span&gt;spark.hadoop.fs.s3.impl:                                  org.apache.hadoop.fs.s3a.S3AFileSystem
    spark.hadoop.fs.s3a.aws.credentials.provider:             software.amazon.awssdk.auth.credentials.ContainerCredentialsProvider,software.amazon.awssdk.auth.credentials.WebIdentityTokenFileCredentialsProvider
    spark.hadoop.fs.s3a.connection.maximum:                   200
    spark.hadoop.fs.s3a.connection.timeout:                   1200000
    spark.hadoop.fs.s3a.fast.upload:                          &lt;span class="nb"&gt;true
    &lt;/span&gt;spark.hadoop.fs.s3a.input.fadvise:                        random
    spark.hadoop.fs.s3a.path.style.access:                    &lt;span class="nb"&gt;true
    &lt;/span&gt;spark.hadoop.fs.s3a.readahead.range:                      256K
    spark.kubernetes.driver.pod.name:                         order-ondemand-driver
    spark.kubernetes.executor.podNamePrefix:                  order-ondemand
    spark.metrics.conf.&lt;span class="k"&gt;*&lt;/span&gt;.sink.prometheusServlet.class:        org.apache.spark.metrics.sink.PrometheusServlet
    spark.metrics.conf.driver.sink.prometheusServlet.path:    /metrics/driver/prometheus/
    spark.metrics.conf.executor.sink.prometheusServlet.path:  /metrics/executors/prometheus/
    spark.ui.prometheus.enabled:                              &lt;span class="nb"&gt;true
  &lt;/span&gt;Spark Version:                                              4.0.1
  Type:                                                       Python
Status:
  Application State:
    State:  COMPLETED
  Driver Info:
    Pod Name:             order-ondemand-driver
    Web UI Address:       172.20.177.132:4040
    Web UI Port:          4040
    Web UI Service Name:  order-ondemand-ui-svc
  Execution Attempts:     1
  Executor State:
    order-ondemand-exec-1:       COMPLETED
    order-ondemand-exec-2:       COMPLETED
    order-ondemand-exec-3:       COMPLETED
    order-ondemand-exec-4:       COMPLETED
  Last Submission Attempt Time:  2025-11-21T00:42:07Z
  Spark Application Id:          spark-279d190d2f8744d293baa49a9d8e2f82
  Submission Attempts:           1
  Submission ID:                 de37b837-657b-4795-a7f7-ddc2d65972e7
  Termination Time:              2025-11-21T00:45:01Z
Events:
  Type    Reason                     Age                From                          Message
  &lt;span class="nt"&gt;----&lt;/span&gt;    &lt;span class="nt"&gt;------&lt;/span&gt;                     &lt;span class="nt"&gt;----&lt;/span&gt;               &lt;span class="nt"&gt;----&lt;/span&gt;                          &lt;span class="nt"&gt;-------&lt;/span&gt;
  Normal  SparkApplicationSubmitted  2m57s              spark-application-controller  SparkApplication order-ondemand was submitted successfully
  Normal  SparkDriverRunning         115s               spark-application-controller  Driver order-ondemand-driver is running
  Normal  SparkExecutorPending       105s               spark-application-controller  Executor order-ondemand-exec-1 is pending
  Normal  SparkExecutorPending       105s               spark-application-controller  Executor order-ondemand-exec-2 is pending
  Normal  SparkExecutorPending       104s               spark-application-controller  Executor order-ondemand-exec-3 is pending
  Normal  SparkExecutorPending       104s               spark-application-controller  Executor order-ondemand-exec-4 is pending
  Normal  SparkExecutorRunning       68s                spark-application-controller  Executor order-ondemand-exec-3 is running
  Normal  SparkExecutorRunning       68s                spark-application-controller  Executor order-ondemand-exec-2 is running
  Normal  SparkExecutorRunning       68s &lt;span class="o"&gt;(&lt;/span&gt;x2 over 68s&lt;span class="o"&gt;)&lt;/span&gt;  spark-application-controller  Executor order-ondemand-exec-1 is running
  Normal  SparkExecutorRunning       68s &lt;span class="o"&gt;(&lt;/span&gt;x3 over 68s&lt;span class="o"&gt;)&lt;/span&gt;  spark-application-controller  Executor order-ondemand-exec-4 is running
  Normal  SparkExecutorCompleted     11s                spark-application-controller  Executor order-ondemand-exec-2 completed
  Normal  SparkExecutorCompleted     11s                spark-application-controller  Executor order-ondemand-exec-1 completed
  Normal  SparkExecutorCompleted     9s                 spark-application-controller  Executor order-ondemand-exec-4 completed
  Normal  SparkExecutorCompleted     9s                 spark-application-controller  Executor order-ondemand-exec-3 completed
  Normal  SparkDriverCompleted       6s                 spark-application-controller  Driver order-ondemand-driver completed


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ref: &lt;a href="http://join.workshops.aws/8b34-065ee4-a5" rel="noopener noreferrer"&gt;http://join.workshops.aws/8b34-065ee4-a5&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>aws</category>
      <category>eks</category>
      <category>spark</category>
    </item>
    <item>
      <title>ECDSA vs RSA</title>
      <dc:creator>Suyash Sambhare</dc:creator>
      <pubDate>Wed, 08 Jul 2026 02:11:45 +0000</pubDate>
      <link>https://www.debug.school/suyash/ecdsa-vs-rsa-1cbi</link>
      <guid>https://www.debug.school/suyash/ecdsa-vs-rsa-1cbi</guid>
      <description>&lt;p&gt;Elliptic Curve Digital Signature Algorithm vs Rivest, Shamir, and Adleman&lt;/p&gt;

&lt;p&gt;ECDSA, or Elliptic Curve Digital Signature Algorithm, is a cryptographic method that uses the mathematics of elliptic curves to create digital signatures. It is known for its efficiency and strong security with smaller key sizes. This makes it particularly suitable for environments where computational power and storage are limited, such as mobile devices and Internet of Things (IoT) gadgets.&lt;/p&gt;

&lt;p&gt;RSA is named after its inventors: Rivest, Shamir, and Adleman. It is one of the oldest and most widely adopted cryptographic algorithms. RSA uses the mathematical properties of large prime numbers to encrypt data and create digital signatures. While highly secure when using large key sizes, RSA requires more computational resources compared to ECDSA.&lt;/p&gt;

&lt;h2&gt;
  
  
  Asymmetric Encryption Algorithms
&lt;/h2&gt;

&lt;p&gt;Asymmetric encryption algorithms are cryptographic methods that use a pair of keys—a public key and a private key—to secure data. The public key is used to encrypt information, and the private key is used to decrypt it&lt;/p&gt;

&lt;p&gt;Anyone can use the public key to encrypt a message intended for a specific recipient since the public key is openly shared. However, only the person who holds the corresponding private key can decrypt the message and access its original content. This structure keeps the private key secret while receiving secure, encrypted messages.&lt;/p&gt;

&lt;p&gt;ECDSA (elliptic curve digital signature algorithm), or ECC (elliptic curve cryptography) as it’s sometimes known, is the successor of the digital signature algorithm (DSA). ECDSA was born when two mathematicians named Neal Koblitz and Victor S. Miller proposed the use of elliptical curves in cryptography. However, it took almost two decades for the ECDSA algorithm to become standardized.&lt;/p&gt;

&lt;p&gt;ECDSA is an asymmetric cryptography algorithm that’s constructed around elliptical curves and an underlying function that’s known as a “trapdoor function.” An elliptic curve represents the set of points that satisfy a mathematical equation 

&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;y&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;a&lt;/span&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;b&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.debug.school/uploads/articles/26chc5by9i0b40voz1kn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://www.debug.school/uploads/articles/26chc5by9i0b40voz1kn.png" alt="Art9" width="92" height="460"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If compatibility is your top concern, go with RSA. It’s supported everywhere and doesn’t require changes to your infrastructure. It’s perfect for websites, email servers, and internal tools that rely on well-established cryptographic libraries.&lt;/p&gt;

&lt;p&gt;If you care more about performance and efficiency, ECDSA is the clear winner. It’s faster, requires less memory, and is easier on power usage, ideal for mobile apps, connected devices, or blockchain platforms.&lt;/p&gt;

&lt;p&gt;Some setups use both. For example, a site might use RSA for TLS while using ECDSA for internal API authentication. The two aren’t mutually exclusive.&lt;/p&gt;

&lt;h2&gt;
  
  
  Future Proofing against Quantum Computing
&lt;/h2&gt;

&lt;p&gt;As encryption standards evolve, it’s not just about what works now, but also about what survives the next wave of change. That brings us to the threat both RSA and ECDSA can’t ignore.&lt;/p&gt;

&lt;p&gt;Quantum computing is a real danger to current encryption systems. Algorithms like RSA and ECDSA rely on problems that a quantum computer running Shor’s algorithm could eventually solve. That would break both prime factorization and discrete logarithm-based systems.&lt;/p&gt;

&lt;p&gt;Neither RSA nor ECDSA is safe in a fully quantum future. That’s why researchers are working on post-quantum security tools designed to resist quantum attacks. The shift is already in motion.&lt;/p&gt;

&lt;p&gt;Ref: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.ssl.com/article/comparing-ecdsa-vs-rsa-a-simple-guide/" rel="noopener noreferrer"&gt;https://www.ssl.com/article/comparing-ecdsa-vs-rsa-a-simple-guide/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.ssldragon.com/blog/ecdsa-vs-rsa/" rel="noopener noreferrer"&gt;https://www.ssldragon.com/blog/ecdsa-vs-rsa/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sectigostore.com/blog/ecdsa-vs-rsa-everything-you-need-to-know/" rel="noopener noreferrer"&gt;https://sectigostore.com/blog/ecdsa-vs-rsa-everything-you-need-to-know/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devops</category>
      <category>security</category>
      <category>certificate</category>
      <category>ssl</category>
    </item>
    <item>
      <title>Native messaging</title>
      <dc:creator>Suyash Sambhare</dc:creator>
      <pubDate>Sun, 28 Jun 2026 23:50:35 +0000</pubDate>
      <link>https://www.debug.school/suyash/native-messaging-5hif</link>
      <guid>https://www.debug.school/suyash/native-messaging-5hif</guid>
      <description>&lt;p&gt;To communicate with a native Win32 app that's installed on a user's device, an extension uses an API that's similar to the other message passing APIs. The native app host sends and receives messages with extensions using standard input and standard output.&lt;/p&gt;

&lt;p&gt;Extensions that use native messaging are installed in Microsoft Edge similar to any other extension. However, native apps aren't installed or managed by Microsoft Edge.&lt;/p&gt;

&lt;p&gt;To acquire the extension and native app host, there are two different distribution models:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Package your extension and the host together. When a user installs the package, both the extension and the host are installed.&lt;/li&gt;
&lt;li&gt;Install your extension from Microsoft Edge Add-ons, and your extension prompts users to install the host.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To create your extension to send and receive messages with native app hosts, do the following steps.&lt;/p&gt;

&lt;h3&gt;
  
  
  Add permissions to the extension manifest
&lt;/h3&gt;

&lt;p&gt;Add the nativeMessaging permission to the manifest.json file of the extension.&lt;/p&gt;

&lt;p&gt;This is the extension manifest file, not the native messaging host manifest file, which is covered in later sections.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Native Messaging Example"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"manifest_version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Send a message to a native app."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"app"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"launch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"local_path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"main.html"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"icons"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"128"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"icon-128.png"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"permissions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"nativeMessaging"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Create your native messaging host manifest file
&lt;/h3&gt;

&lt;p&gt;Native apps must provide a native messaging host manifest file. A native messaging host manifest file contains the following information:&lt;/p&gt;

&lt;p&gt;The path to the native messaging host runtime.&lt;/p&gt;

&lt;p&gt;The method of communication with the extension.&lt;/p&gt;

&lt;p&gt;A list of allowed extensions to which it communicates.&lt;/p&gt;

&lt;p&gt;The browser reads and validates the native messaging host manifest. The browser doesn't install or manage the native messaging host manifest file.&lt;/p&gt;

&lt;p&gt;The native messaging host manifest file is distinct from the Manifest V3 or V2 file that is part of the Microsoft Edge extension.&lt;/p&gt;

&lt;p&gt;Example of a native messaging host manifest file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"com.my_company.my_app"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"My App"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"C:&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;Program Files&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;My App&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;chrome_native_messaging_host.exe"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"stdio"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"allowed_origins"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"chrome-extension://knldjmfmopnpolahpmmgbagdohdnhkik/"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The native messaging host manifest file must be a valid JSON file that contains the following keys:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;name&lt;/code&gt;: Specifies the name of the native messaging host. Clients pass the string to runtime.connectNative or runtime.sendNativeMessage. The value must only contain lowercase alphanumeric characters, underscores, and dots. The value must not start or end with a dot (a period), and a dot must not be followed by another dot.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;description&lt;/code&gt;: Describes the app.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;path&lt;/code&gt;: Specifies the path to the native messaging host binary. On Windows devices, you can use relative paths to the directory that contains the native messaging host manifest file. On macOS and Linux, the path must be absolute. The host process starts with the current directory set to the directory that contains the host binary. For example (Windows), if the parameter is set to &lt;code&gt;C:\App\nm_host.exe&lt;/code&gt;, the binary is started using the current directory (&lt;code&gt;C:\App\&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;type&lt;/code&gt;: Specifies the type of the interface used to communicate with the native messaging host. The value instructs Microsoft Edge to use stdin and stdout to communicate with the host. The only acceptable value is stdio.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;allowed_origins&lt;/code&gt;: Specifies the list of extensions that have access to the native messaging host. To turn on your app to identify and communicate with an extension, in your native messaging host manifest file, set the following value: &lt;code&gt;"allowed_origins": ["chrome-extension://{microsoft_catalog_extension_id}"]&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.debug.school/uploads/articles/as9v7orz3ntywtykk9fm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://www.debug.school/uploads/articles/as9v7orz3ntywtykk9fm.png" alt="Native Messaging" width="160" height="120"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Sideload
&lt;/h2&gt;

&lt;p&gt;Sideload your extension to test native messaging with the host. To sideload your extension during development and retrieve &lt;code&gt;microsoft_catalog_extension_id&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to &lt;code&gt;edge://extensions&lt;/code&gt;, and then turn on the Developer mode toggle button.&lt;/li&gt;
&lt;li&gt;Select Load unpacked, and then select your extension package to sideload.&lt;/li&gt;
&lt;li&gt;Click OK.&lt;/li&gt;
&lt;li&gt;Go to the &lt;code&gt;edge://extensions&lt;/code&gt; page and verify that your extension is listed.&lt;/li&gt;
&lt;li&gt;Copy the key from &lt;code&gt;microsoft_catalog_extension_id&lt;/code&gt; (ID) from the extension listing on the page.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you're ready to distribute your extension to users, publish your extension at Microsoft Edge Add-ons. The extension ID of the published extension might differ from the ID that's used while sideloading your extension. If the ID changed, update allowed_origins in the native messaging host manifest file with the ID of your published extension.&lt;/p&gt;

&lt;h3&gt;
  
  
  Copy the native messaging host manifest file to your system
&lt;/h3&gt;

&lt;p&gt;The final step involves copying the native messaging host manifest file to your computer, and making sure that this manifest file is correctly configured. To ensure your native messaging host manifest file is placed in the expected location, do the following steps. The location varies by platform.&lt;br&gt;
The native messaging host manifest file may be located anywhere in the file system. The app installer must create a registry key and set the default value of the key to the full path of the native messaging host manifest file.&lt;/p&gt;

&lt;p&gt;The following locations are examples of registry keys:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;HKEY_CURRENT_USER\SOFTWARE\Microsoft\Edge\NativeMessagingHosts\com.my_company.my_app&lt;/code&gt;&lt;br&gt;
&lt;code&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Edge\NativeMessagingHosts\com.my_company.my_app&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;To add a registry key to the directory with the manifest key run a command in the command prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;REG&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ADD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"HKCU\Software\Microsoft\Edge\NativeMessagingHosts\com.my_company.my_app"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/ve&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;REG_SZ&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/d&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"C:\path\to\nmh-manifest.json"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/f&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft Edge queries the &lt;code&gt;HKEY_CURRENT_USER&lt;/code&gt; root key, followed by &lt;code&gt;HKEY_LOCAL_MACHINE&lt;/code&gt;. In both of the keys, the 32-bit registry is searched first, and then the 64-bit registry is searched to identify native messaging hosts. The registry key specifies the location of the native messaging host manifest file.&lt;/p&gt;

&lt;p&gt;If the registry entries for Microsoft Edge don't have the location of the native messaging host manifest file, the Chromium and Chrome registry locations are used as fallback options.&lt;/p&gt;

&lt;p&gt;If Microsoft Edge finds the registry key at any of the previously listed locations, it doesn't query the locations that are listed in the following code snippet.&lt;/p&gt;

&lt;p&gt;The search order for the registry locations is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HKEY_CURRENT_USER\SOFTWARE\Microsoft\Edge\NativeMessagingHosts\
HKEY_CURRENT_USER\SOFTWARE\Chromium\NativeMessagingHosts\
HKEY_CURRENT_USER\SOFTWARE\Google\Chrome\NativeMessagingHosts\

HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Edge\NativeMessagingHosts\
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Chromium\NativeMessagingHosts\
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Google\Chrome\NativeMessagingHosts\

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Edge\NativeMessagingHosts\
HKEY_LOCAL_MACHINE\SOFTWARE\Chromium\NativeMessagingHosts\
HKEY_LOCAL_MACHINE\SOFTWARE\Google\Chrome\NativeMessagingHosts\
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Native messaging protocol
&lt;/h2&gt;

&lt;p&gt;Microsoft Edge starts each native messaging host in a separate process and communicates with it using standard input (stdin) and standard output (stdout). The same format is used to send messages in both directions; each message is serialized using JSON, UTF-8 encoded and is preceded with 32-bit message length in native byte order. The maximum size of a single message from the native messaging host is 1 MB, mainly to protect Microsoft Edge from misbehaving native applications. The maximum size of the message sent to the native messaging host is 4 GB.&lt;/p&gt;

&lt;p&gt;The first argument to the native messaging host is the origin of the caller, usually chrome-extension://[ID of allowed extension]. This allows native messaging hosts to identify the source of the message when multiple extensions are specified in the allowed_origins key in the native messaging host manifest; see Step 2: Create your native messaging host manifest file, above.&lt;/p&gt;

&lt;p&gt;On Windows, the native messaging host is also passed a command line argument with a handle to the calling Microsoft Edge native window: --parent-window=. This lets the native messaging host create native UI windows that are correctly parented. This value will be 0 if the calling context is a service worker.&lt;/p&gt;

&lt;p&gt;When a messaging port is created by using runtime.connectNative, Microsoft Edge starts a native messaging host process and keeps it running until the port is destroyed. On the other hand, when a message is sent by using runtime.sendNativeMessage, without creating a messaging port, Microsoft Edge starts a new native messaging host process for each message. In that case, the first message that's generated by the host process is handled as a response to the original request, and Microsoft Edge will pass it to the response callback specified when runtime.sendNativeMessage is called. All other messages generated by the native messaging host in that case are ignored.&lt;/p&gt;

&lt;h3&gt;
  
  
  Connecting to a native application
&lt;/h3&gt;

&lt;p&gt;Sending and receiving messages to and from a native application is very similar to cross-extension messaging. The main difference is that runtime.connectNative is used instead of runtime.connect, and runtime.sendNativeMessage is used instead of runtime.sendMessage.&lt;/p&gt;

&lt;p&gt;To use these methods, the nativeMessaging permission must be declared in your extensions's manifest file; see Step 1: Add permissions to the extension manifest, above.&lt;/p&gt;

&lt;p&gt;These methods are not available inside content scripts, only inside your extension's pages and service worker. If you want to communicate from a content script to the native application, send the message to your service worker to pass it along to the native application.&lt;/p&gt;

&lt;p&gt;The following example creates a runtime.Port object that's connected to native messaging host com.my_company.my_application, starts listening for messages from that port and sends one outgoing message:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;chrome&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;runtime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connectNative&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;com.my_company.my_application&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onMessage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Received&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onDisconnect&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Disconnected&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;postMessage&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello, my_application&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;Use&lt;/span&gt; &lt;span class="nx"&gt;runtime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sendNativeMessage&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;send&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;native&lt;/span&gt; &lt;span class="nx"&gt;application&lt;/span&gt; &lt;span class="nx"&gt;without&lt;/span&gt; &lt;span class="nx"&gt;creating&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nx"&gt;example&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;chrome&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;runtime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendNativeMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;com.my_company.my_application&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Received &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ref: &lt;a href="https://learn.microsoft.com/en-us/microsoft-edge/extensions/developer-guide/native-messaging" rel="noopener noreferrer"&gt;https://learn.microsoft.com/en-us/microsoft-edge/extensions/developer-guide/native-messaging&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>edge</category>
      <category>extension</category>
      <category>chrome</category>
    </item>
    <item>
      <title>Windows 11 context menu</title>
      <dc:creator>Suyash Sambhare</dc:creator>
      <pubDate>Fri, 08 May 2026 05:15:07 +0000</pubDate>
      <link>https://www.debug.school/suyash/windows-11-context-menu-5ap</link>
      <guid>https://www.debug.school/suyash/windows-11-context-menu-5ap</guid>
      <description>&lt;h2&gt;
  
  
  Ye Olde Right Click menu
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.debug.school/images/HcbRRdNTbAN1GZSadlJtbkbkcwY3a_-yaBDnb84WC4o/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly93d3cu/ZGVidWcuc2Nob29s/L3VwbG9hZHMvYXJ0/aWNsZXMvZmMyOTN4/eHVvY3IyODljamRi/a2gucG5n" class="article-body-image-wrapper"&gt;&lt;img src="https://www.debug.school/images/HcbRRdNTbAN1GZSadlJtbkbkcwY3a_-yaBDnb84WC4o/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly93d3cu/ZGVidWcuc2Nob29s/L3VwbG9hZHMvYXJ0/aWNsZXMvZmMyOTN4/eHVvY3IyODljamRi/a2gucG5n" alt="Old Right Click" width="255" height="784"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Design engineer in Microsoft probably thinking, "&lt;em&gt;Hmm, the context menu when you right-click on a file is quite cluttered, lets fix that by moving everything to an overflow option called &lt;strong&gt;Show more options&lt;/strong&gt;&lt;/em&gt;"&lt;/p&gt;

&lt;h2&gt;
  
  
  Le New Right Click Menu
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.debug.school/images/lGgKUrLM6yB2AyV6DFn_qVir5Q851RFtfF12pDUj3XU/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly93d3cu/ZGVidWcuc2Nob29s/L3VwbG9hZHMvYXJ0/aWNsZXMvbXNna3Ny/OXFlbzJyeGthY3Yy/Y3EucG5n" class="article-body-image-wrapper"&gt;&lt;img src="https://www.debug.school/images/lGgKUrLM6yB2AyV6DFn_qVir5Q851RFtfF12pDUj3XU/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly93d3cu/ZGVidWcuc2Nob29s/L3VwbG9hZHMvYXJ0/aWNsZXMvbXNna3Ny/OXFlbzJyeGthY3Yy/Y3EucG5n" alt="New Right Click" width="340" height="787"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Much better!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.debug.school/images/N2vp10-FiR8AxJIwwQrnKAIL7RbhziPNLqsWfacZdwM/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly93d3cu/ZGVidWcuc2Nob29s/L3VwbG9hZHMvYXJ0/aWNsZXMvbmxsaWY1/a2k4YmtjM3oxMWFh/b3UucG5n" class="article-body-image-wrapper"&gt;&lt;img src="https://www.debug.school/images/N2vp10-FiR8AxJIwwQrnKAIL7RbhziPNLqsWfacZdwM/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly93d3cu/ZGVidWcuc2Nob29s/L3VwbG9hZHMvYXJ0/aWNsZXMvbmxsaWY1/a2k4YmtjM3oxMWFh/b3UucG5n" alt="Windows 11" width="164" height="314"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>windows</category>
      <category>microsoft</category>
      <category>design</category>
    </item>
    <item>
      <title>Win Updates via PS1</title>
      <dc:creator>Suyash Sambhare</dc:creator>
      <pubDate>Wed, 22 Apr 2026 03:07:02 +0000</pubDate>
      <link>https://www.debug.school/suyash/win-updates-via-ps1-51gb</link>
      <guid>https://www.debug.school/suyash/win-updates-via-ps1-51gb</guid>
      <description>&lt;p&gt;PowerShell file&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;C:\&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;sfc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/scannow&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;chkdsk&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;C:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/scan&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/perf&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;winget&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;upgrade&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--all&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;install-Module&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;PSWindowsUpdate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;import-Module&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;PSWindowsUpdate&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;get-WindowsUpdate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AcceptAll&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nx"&gt;shutdown&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/r&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="kr"&gt;exit&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://www.debug.school/images/Uv2LWqoLI0EG9Jse57Fcj_eO9CpKxUE4kwC7Z0hqUyE/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly93d3cu/ZGVidWcuc2Nob29s/L3VwbG9hZHMvYXJ0/aWNsZXMvMjdpZXRz/cWZjZ3VsbG80bmV1/bGcucG5n" class="article-body-image-wrapper"&gt;&lt;img src="https://www.debug.school/images/Uv2LWqoLI0EG9Jse57Fcj_eO9CpKxUE4kwC7Z0hqUyE/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly93d3cu/ZGVidWcuc2Nob29s/L3VwbG9hZHMvYXJ0/aWNsZXMvMjdpZXRz/cWZjZ3VsbG80bmV1/bGcucG5n" alt="Art6" width="798" height="585"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Requires reboot&lt;/p&gt;

</description>
      <category>devops</category>
      <category>updates</category>
      <category>powershell</category>
      <category>windows</category>
    </item>
    <item>
      <title>AWS Secrets Manager in GitLab CI/CD</title>
      <dc:creator>Suyash Sambhare</dc:creator>
      <pubDate>Wed, 15 Apr 2026 05:45:02 +0000</pubDate>
      <link>https://www.debug.school/suyash/aws-secrets-manager-in-gitlab-cicd-35cc</link>
      <guid>https://www.debug.school/suyash/aws-secrets-manager-in-gitlab-cicd-35cc</guid>
      <description>&lt;h1&gt;
  
  
  Using AWS Secrets Manager in GitLab CI/CD
&lt;/h1&gt;

&lt;p&gt;GitLab lets you &lt;strong&gt;fetch secrets directly from AWS Secrets Manager at job runtime&lt;/strong&gt;, instead of hard‑coding or manually syncing secrets into GitLab CI variables.&lt;/p&gt;

&lt;p&gt;This gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Centralized secret management (AWS)&lt;/li&gt;
&lt;li&gt;  Short‑lived credentials (OIDC)&lt;/li&gt;
&lt;li&gt;  No secrets stored permanently in GitLab&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How the Integration Works (Architecture)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;GitLab Runner&lt;/strong&gt; authenticates to AWS

&lt;ul&gt;
&lt;li&gt;  Via &lt;strong&gt;IAM Role&lt;/strong&gt; attached to the runner host&lt;/li&gt;
&lt;li&gt;  Or via &lt;strong&gt;OpenID Connect (OIDC)&lt;/strong&gt; using GitLab ID tokens&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt; During the &lt;strong&gt;“Resolving secrets”&lt;/strong&gt; phase:

&lt;ul&gt;
&lt;li&gt;  Runner calls AWS Secrets Manager&lt;/li&gt;
&lt;li&gt;  Fetches the secret value&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt; GitLab:

&lt;ul&gt;
&lt;li&gt;  Writes the secret to a &lt;strong&gt;temporary file&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  Exposes the file path as an &lt;strong&gt;environment variable&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt; Your job uses the secret&lt;/li&gt;
&lt;li&gt; Temp files are removed when the job finishes&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Secrets never appear in the job logs unless you echo them.&lt;/p&gt;




&lt;h2&gt;
  
  
  Authentication Methods
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. IAM Role
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;variables&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;AWS_REGION&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;us-east-1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No tokens or role assumptions needed.&lt;/p&gt;

&lt;p&gt;With Kubernetes runners, the IAM role must be on the &lt;strong&gt;runner manager&lt;/strong&gt;, not just the pod.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. OpenID Connect
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  GitLab issues a short‑lived OIDC token&lt;/li&gt;
&lt;li&gt;  AWS STS exchanges it for temporary credentials&lt;/li&gt;
&lt;li&gt;  AWS_ROLE_ARN defines what role is assumed
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;id_tokens&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;AWS_ID_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;aud&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sts.amazonaws.com&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;variables&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;AWS_ROLE_ARN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;arn:aws:iam::123456789012:role/gitlab-secrets-role&lt;/span&gt;
  &lt;span class="na"&gt;AWS_REGION&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;us-east-1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Defining Secrets in Jobs
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Standard Form
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;secrets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;DATABASE_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;aws_secrets_manager&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;secret_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app-secrets/database&lt;/span&gt;
      &lt;span class="na"&gt;field&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;password&lt;/span&gt;
    &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;password&lt;/code&gt; field is extracted from JSON&lt;/li&gt;
&lt;li&gt;  Value is exposed as &lt;code&gt;$DATABASE_PASSWORD&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;file: false&lt;/code&gt; → variable, not file path&lt;/li&gt;
&lt;/ul&gt;






&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;secrets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;API_KEY&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;aws_secrets_manager&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app-secrets/api#api_key&lt;/span&gt;
    &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Format:&lt;br&gt;
    secret-name[#json-field]&lt;/p&gt;


&lt;h2&gt;
  
  
  Working with Full JSON Secrets
&lt;/h2&gt;

&lt;p&gt;If you don’t specify &lt;code&gt;field&lt;/code&gt;, GitLab retrieves the &lt;strong&gt;entire value&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;secrets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;FULL_SECRET&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;aws_secrets_manager&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app-secrets/api&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$FULL_SECRET&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.api_key'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Secret Versioning
&lt;/h2&gt;

&lt;p&gt;You can pin secrets to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  A &lt;strong&gt;version stage&lt;/strong&gt; (recommended)&lt;/li&gt;
&lt;li&gt;  A &lt;strong&gt;specific version ID&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version_stage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;AWSCURRENT&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;01234567-89ab-cdef-0123-456789abcdef&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You cannot specify both.&lt;/p&gt;




&lt;h2&gt;
  
  
  Cross‑Account Access
&lt;/h2&gt;

&lt;p&gt;To read secrets from another AWS account:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Use &lt;strong&gt;OIDC&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  Use the &lt;strong&gt;full secret ARN&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;secret_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;arn:aws:secretsmanager:us-east-1:987654321098:secret:shared-api-keys-AbCdEf&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;IAM role must trust:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  GitLab’s OIDC provider&lt;/li&gt;
&lt;li&gt;  The specific GitLab project/group&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Per‑Secret Overrides (Advanced)
&lt;/h2&gt;

&lt;p&gt;You can override AWS settings &lt;strong&gt;per secret&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;aws_secrets_manager&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;secret_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;eu-app-secrets/database&lt;/span&gt;
  &lt;span class="na"&gt;region&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;eu-west-1&lt;/span&gt;
  &lt;span class="na"&gt;role_arn&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;arn:aws:iam::123456789012:role/eu-role&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  File vs Variable (&lt;code&gt;file: true | false&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;Default behavior:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  GitLab writes secret to a temp file&lt;/li&gt;
&lt;li&gt;  Environment variable contains &lt;strong&gt;file path&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$DATABASE_PASSWORD&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you want the raw value:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$DATABASE_PASSWORD&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;File mode is safer for binaries &amp;amp; large secrets.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://www.debug.school/images/8oeaNiIZtq8GHJssMI6HeJvbuORImPiesbZ3kKXvEG4/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly93d3cu/ZGVidWcuc2Nob29s/L3VwbG9hZHMvYXJ0/aWNsZXMvb3FqMWFp/dW5yb3A4NGh3MW5r/NTkucG5n" class="article-body-image-wrapper"&gt;&lt;img src="https://www.debug.school/images/8oeaNiIZtq8GHJssMI6HeJvbuORImPiesbZ3kKXvEG4/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly93d3cu/ZGVidWcuc2Nob29s/L3VwbG9hZHMvYXJ0/aWNsZXMvb3FqMWFp/dW5yb3A4NGh3MW5r/NTkucG5n" alt="AWS" width="450" height="466"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Use AWS Secrets Manager secrets in GitLab CI/CD
&lt;/h1&gt;

&lt;p&gt;You can use secrets stored in &lt;a href="https://aws.amazon.com/secrets-manager/" rel="noopener noreferrer"&gt;AWS Secrets Manager&lt;/a&gt;&lt;br&gt;
in your GitLab CI/CD pipelines.&lt;/p&gt;

&lt;p&gt;Prerequisites:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Have access to AWS Secrets Manager in your AWS account.&lt;/li&gt;
&lt;li&gt;Configure authentication using one of the following methods:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;IAM Role&lt;/strong&gt;: Use the IAM role assigned to your GitLab Runner instance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenID Connect&lt;/strong&gt;: &lt;a href="//../cloud_services/aws/_index.md"&gt;Configure OpenID Connect in AWS&lt;/a&gt; to retrieve temporary credentials.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Add &lt;a href="//../variables/_index.md#for-a-project"&gt;CI/CD variables to your project&lt;/a&gt; to provide details about your AWS configuration:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;AWS_REGION&lt;/code&gt;: The AWS region where your secrets are stored.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;AWS_ROLE_ARN&lt;/code&gt;: The ARN of the AWS IAM role to assume (required when using OpenID Connect).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;AWS_ROLE_SESSION_NAME&lt;/code&gt;: Optional. Custom session name for the assumed role.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Use AWS Secrets Manager secrets in a CI/CD job
&lt;/h2&gt;
&lt;h3&gt;
  
  
  With IAM Role authentication
&lt;/h3&gt;

&lt;p&gt;You can use a secret stored in AWS Secrets Manager in a job by defining it with the&lt;br&gt;
&lt;code&gt;aws_secrets_manager&lt;/code&gt; keyword.&lt;/p&gt;

&lt;p&gt;This method uses the IAM role assigned to your GitLab Runner instance. When using the&lt;br&gt;
&lt;a href="https://docs.gitlab.com/runner/executors/kubernetes/" rel="noopener noreferrer"&gt;Kubernetes executor&lt;/a&gt; or &lt;a href="https://docs.gitlab.com/runner/runner_autoscale/" rel="noopener noreferrer"&gt;autoscaling&lt;/a&gt;,&lt;br&gt;
make sure the IAM role is applied to your runner manager.&lt;/p&gt;

&lt;p&gt;Prerequisites:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitLab Runner 18.3 or later.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;variables&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;AWS_REGION&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;us-east-1&lt;/span&gt;

&lt;span class="na"&gt;database-migration&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;secrets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;DATABASE_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;aws_secrets_manager&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;secret_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app-secrets/database&lt;/span&gt;
        &lt;span class="na"&gt;field&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;password'&lt;/span&gt;
      &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
  &lt;span class="na"&gt;stage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;deploy&lt;/span&gt;
  &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;echo "Running database migration..."&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;mysql -h $DB_HOST -u $DB_USER -p$DATABASE_PASSWORD &amp;lt; migration.sql&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;echo "Migration completed successfully."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  With OpenID Connect authentication
&lt;/h3&gt;

&lt;p&gt;For enhanced security, you can use OpenID Connect to authenticate with AWS and assume a specific IAM role.&lt;br&gt;
By default, the runner looks for an ID token named &lt;code&gt;AWS_ID_TOKEN&lt;/code&gt;. For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;variables&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;AWS_REGION&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;us-east-1&lt;/span&gt;
  &lt;span class="na"&gt;AWS_ROLE_ARN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;arn:aws:iam::123456789012:role/gitlab-secrets-role'&lt;/span&gt;

&lt;span class="na"&gt;database-migration&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;id_tokens&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;AWS_ID_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;aud&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sts.amazonaws.com'&lt;/span&gt;
  &lt;span class="na"&gt;secrets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;DATABASE_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;aws_secrets_manager&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;secret_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app-secrets/database&lt;/span&gt;
        &lt;span class="na"&gt;field&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;password'&lt;/span&gt;
      &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
  &lt;span class="na"&gt;stage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;deploy&lt;/span&gt;
  &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;echo "Connecting to production database..."&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;psql postgresql://$DB_USER:$DATABASE_PASSWORD@$DB_HOST:5432/$DB_NAME -c "SELECT version();"&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;echo "Database connection successful."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also specify a custom token using the &lt;code&gt;token&lt;/code&gt; option. For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;variables&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;AWS_REGION&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;us-east-1&lt;/span&gt;
  &lt;span class="na"&gt;AWS_ROLE_ARN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;arn:aws:iam::123456789012:role/gitlab-secrets-role'&lt;/span&gt;

&lt;span class="na"&gt;database-migration&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;id_tokens&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;CUSTOM_AWS_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;aud&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sts.amazonaws.com'&lt;/span&gt;
  &lt;span class="na"&gt;secrets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;DATABASE_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;aws_secrets_manager&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;secret_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app-secrets/database&lt;/span&gt;
        &lt;span class="na"&gt;field&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;password'&lt;/span&gt;
      &lt;span class="na"&gt;token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;$CUSTOM_AWS_TOKEN&lt;/span&gt;
      &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
  &lt;span class="na"&gt;stage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;deploy&lt;/span&gt;
  &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;echo "Connecting to production database with custom token..."&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;psql postgresql://$DB_USER:$DATABASE_PASSWORD@$DB_HOST:5432/$DB_NAME -c "SELECT version();"&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;echo "Database connection successful."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Short form syntax
&lt;/h3&gt;

&lt;p&gt;You can use a simplified syntax by specifying the secret ID as a string.&lt;br&gt;
You can optionally specify a field by separating it with a &lt;code&gt;#&lt;/code&gt; character.&lt;br&gt;
For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;variables&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;AWS_REGION&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;us-east-1&lt;/span&gt;

&lt;span class="na"&gt;api-deployment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;secrets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;API_KEY&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;aws_secrets_manager&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;app-secrets/api#api_key'&lt;/span&gt;
      &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
    &lt;span class="na"&gt;FULL_SECRET&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;aws_secrets_manager&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;app-secrets/api'&lt;/span&gt;
      &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
  &lt;span class="na"&gt;stage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;deploy&lt;/span&gt;
  &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;echo "Deploying API with specific field..."&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;curl --header "Authorization&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Bearer $API_KEY" https://api.example.com/deploy&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;echo "Using full secret..."&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;curl --header "Authorization&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Bearer $(cat $FULL_SECRET | jq --raw-output '.api_key')" https://api.example.com/status&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Secret versioning
&lt;/h2&gt;

&lt;p&gt;AWS Secrets Manager supports multiple versions of secrets. You can specify a particular version&lt;br&gt;
using either &lt;code&gt;version_id&lt;/code&gt; or &lt;code&gt;version_stage&lt;/code&gt;. For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;variables&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;AWS_REGION&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;us-east-1&lt;/span&gt;

&lt;span class="na"&gt;production-deployment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;secrets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;DATABASE_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;aws_secrets_manager&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;secret_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;prod-app-secrets/database&lt;/span&gt;
        &lt;span class="na"&gt;field&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;password'&lt;/span&gt;
        &lt;span class="na"&gt;version_stage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;AWSCURRENT'&lt;/span&gt;
      &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
    &lt;span class="na"&gt;STAGING_DATABASE_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;aws_secrets_manager&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;secret_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;prod-app-secrets/database&lt;/span&gt;
        &lt;span class="na"&gt;field&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;password'&lt;/span&gt;
        &lt;span class="na"&gt;version_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;01234567-89ab-cdef-0123-456789abcdef'&lt;/span&gt;
      &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
  &lt;span class="na"&gt;stage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;deploy&lt;/span&gt;
  &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;echo "Deploying to production with current secret version..."&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;deploy-prod.sh --db-password $DATABASE_PASSWORD&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;echo "Testing with specific secret version..."&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;test-with-version.sh --db-password $STAGING_DATABASE_PASSWORD&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Cross-account secret access
&lt;/h2&gt;

&lt;p&gt;To retrieve secrets from another AWS account, you must use the full ARN.&lt;br&gt;
For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;variables&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;AWS_REGION&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;us-east-1&lt;/span&gt;
  &lt;span class="na"&gt;AWS_ROLE_ARN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;arn:aws:iam::123456789012:role/cross-account-secrets-role'&lt;/span&gt;

&lt;span class="na"&gt;cross-account-deployment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;id_tokens&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;AWS_ID_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;aud&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sts.amazonaws.com'&lt;/span&gt;
  &lt;span class="na"&gt;secrets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;SHARED_API_KEY&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;aws_secrets_manager&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;secret_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;arn:aws:secretsmanager:us-east-1:987654321098:secret:shared-api-keys-AbCdEf'&lt;/span&gt;
        &lt;span class="na"&gt;field&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;production_key'&lt;/span&gt;
      &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
  &lt;span class="na"&gt;stage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;deploy&lt;/span&gt;
  &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;echo "Accessing shared secret from another account..."&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;curl --header "Authorization&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Bearer $SHARED_API_KEY" https://shared-api.example.com/deploy&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Per-secret configuration overrides
&lt;/h2&gt;

&lt;p&gt;You can override global AWS settings on a per-secret basis. For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;variables&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;AWS_REGION&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;us-east-1&lt;/span&gt;
  &lt;span class="na"&gt;AWS_ROLE_ARN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;arn:aws:iam::123456789012:role/default-role'&lt;/span&gt;

&lt;span class="na"&gt;multi-region-deployment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;id_tokens&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;AWS_ID_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;aud&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sts.amazonaws.com'&lt;/span&gt;
    &lt;span class="na"&gt;EU_AWS_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;aud&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sts.amazonaws.com'&lt;/span&gt;
  &lt;span class="na"&gt;secrets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;EU_DATABASE_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;aws_secrets_manager&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;secret_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;eu-app-secrets/database&lt;/span&gt;
        &lt;span class="na"&gt;field&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;password'&lt;/span&gt;
        &lt;span class="na"&gt;region&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;eu-west-1'&lt;/span&gt;
        &lt;span class="na"&gt;role_arn&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;arn:aws:iam::123456789012:role/eu-deployment-role'&lt;/span&gt;
        &lt;span class="na"&gt;role_session_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;gitlab-eu-deployment'&lt;/span&gt;
      &lt;span class="na"&gt;token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;$EU_AWS_TOKEN&lt;/span&gt;
      &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
    &lt;span class="na"&gt;US_DATABASE_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;aws_secrets_manager&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;secret_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;us-app-secrets/database&lt;/span&gt;
        &lt;span class="na"&gt;field&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;password'&lt;/span&gt;
      &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
  &lt;span class="na"&gt;stage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;deploy&lt;/span&gt;
  &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;echo "Deploying to EU region..."&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;deploy-to-eu.sh --db-password $EU_DATABASE_PASSWORD&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;echo "Deploying to US region..."&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;deploy-to-us.sh --db-password $US_DATABASE_PASSWORD&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In these examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;aud&lt;/code&gt;: The audience, which must match the audience used when &lt;a href="//../cloud_services/aws/_index.md"&gt;creating the federated identity credentials&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;secret_id&lt;/code&gt;: The name or ARN of the secret in AWS Secrets Manager. To retrieve a secret from another account, you must use an ARN.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;field&lt;/code&gt;: Is the specific key in the JSON secret to retrieve. If not specified, the entire secret is retrieved.
Field access is only supported for flat JSON secrets (top-level keys only) and supports string, number, and boolean values.
For example:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;password&lt;/code&gt;: Accesses the &lt;code&gt;password&lt;/code&gt; field.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;api_key&lt;/code&gt;: Accesses the &lt;code&gt;api_key&lt;/code&gt; field.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;token&lt;/code&gt;: Specifies which ID token to use for authentication. If not specified, the runner looks for a token named &lt;code&gt;AWS_ID_TOKEN&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;version_id&lt;/code&gt;: Is the unique identifier of a specific version of the secret.
If you don't specify either &lt;code&gt;version_id&lt;/code&gt; or &lt;code&gt;version_stage&lt;/code&gt;, AWS Secrets Manager returns the &lt;code&gt;AWSCURRENT&lt;/code&gt; version.&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;version_stage&lt;/code&gt;: The staging label of the version of the secret to retrieve (such as &lt;code&gt;AWSCURRENT&lt;/code&gt; or &lt;code&gt;AWSPENDING&lt;/code&gt;).
You cannot specify both &lt;code&gt;version_id&lt;/code&gt; and &lt;code&gt;version_stage&lt;/code&gt; for the same secret.&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;region&lt;/code&gt;: Overrides the global &lt;code&gt;AWS_REGION&lt;/code&gt; for this specific secret.&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;role_arn&lt;/code&gt;: Overrides the global &lt;code&gt;AWS_ROLE_ARN&lt;/code&gt; for this specific secret.&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;role_session_name&lt;/code&gt;: Overrides the global &lt;code&gt;AWS_ROLE_SESSION_NAME&lt;/code&gt; for this specific secret.&lt;/li&gt;

&lt;li&gt;GitLab fetches the secret from AWS Secrets Manager and stores the value in a temporary file.
The path to this file is stored in a CI/CD variable, similar to
&lt;a href="//../variables/_index.md#use-file-type-cicd-variables"&gt;file type CI/CD variables&lt;/a&gt;.&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;p&gt;Refer to &lt;a href="//../cloud_services/aws/_index.md#troubleshooting"&gt;OIDC for AWS troubleshooting&lt;/a&gt; for general&lt;br&gt;
problems when setting up OIDC with AWS.&lt;/p&gt;

&lt;h3&gt;
  
  
  Error: &lt;code&gt;no EC2 IMDS role found&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;The following error might happen if both of these conditions are true:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The CI/CD job is configured to use IAM role authentication.&lt;/li&gt;
&lt;li&gt;The job is executed by a runner with the &lt;a href="https://docs.gitlab.com/runner/executors/kubernetes/" rel="noopener noreferrer"&gt;Kubernetes executor&lt;/a&gt; hosted on AWS EKS.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Resolving secrets
Resolving secret "MY_AWS_SECRET"...
Using "aws_secrets_manager" secret resolver...
ERROR: Job failed (system failure): resolving secrets: operation error Secrets Manager: GetSecretValue, get identity: get credentials: failed to refresh cached credentials, no EC2 IMDS role found, operation error ec2imds: GetMetadata, canceled, context deadline exceeded
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;Resolving secrets&lt;/code&gt; step is handled by the runner manager. This step accesses IAM credentials&lt;br&gt;
cached in &lt;a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html" rel="noopener noreferrer"&gt;EC2 IMDS&lt;/a&gt;.&lt;br&gt;
If the IAM role has not been applied to the runner manager, the &lt;code&gt;Resolving secrets&lt;/code&gt; step fails.&lt;/p&gt;

&lt;p&gt;To address this error, apply the correct IAM role to the runner manager.&lt;/p&gt;

&lt;p&gt;Applying the IAM role to the runner pods that are spawned and managed by the runner manager does not resolve this issue.&lt;/p&gt;

&lt;p&gt;Ref: &lt;a href="https://docs.gitlab.com/ci/secrets/aws_secrets_manager/" rel="noopener noreferrer"&gt;https://docs.gitlab.com/ci/secrets/aws_secrets_manager/&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Fix invalid checkpoint record in Postgres</title>
      <dc:creator>Suyash Sambhare</dc:creator>
      <pubDate>Tue, 31 Mar 2026 22:10:21 +0000</pubDate>
      <link>https://www.debug.school/suyash/fix-invalid-checkpoint-record-in-postgres-2jd0</link>
      <guid>https://www.debug.school/suyash/fix-invalid-checkpoint-record-in-postgres-2jd0</guid>
      <description>&lt;p&gt;When PostgreSQL is unable to detect a valid checkpoint from which to begin the recovery procedure, it displays the error &lt;strong&gt;"PANIC: could not locate a valid checkpoint record."&lt;/strong&gt; This may occur if the PostgreSQL container is not restarted safely.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prevent data corruption
&lt;/h2&gt;

&lt;p&gt;For stateful applications like databases, the first method is to use &lt;em&gt;Stateful Sets&lt;/em&gt; rather than &lt;em&gt;Deployments&lt;/em&gt;; this is a Kubernetes best practice. To preserve the stability and integrity of your database, Stateful Sets offer assurances regarding the ordering and uniqueness of pods. Additionally, stateful sets will manage restarts more effectively.&lt;/p&gt;

&lt;p&gt;The second method is to safely shut down your PostgreSQL instance by using a &lt;code&gt;preStop&lt;/code&gt; hook in Kubernetes.&lt;br&gt;
Before a pod is terminated in Kubernetes, the &lt;code&gt;preStop&lt;/code&gt; hook is invoked. Once the &lt;code&gt;preStop&lt;/code&gt; hook is finished, the pod's termination process starts.&lt;/p&gt;

&lt;p&gt;Apply the preStop hook in a Kubernetes configuration for PostgreSQL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apps/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;StatefulSet&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;replicas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
  &lt;span class="na"&gt;serviceName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;postgres"&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;matchLabels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres&lt;/span&gt;
  &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres&lt;/span&gt;
    &lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres&lt;/span&gt;
        &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres:latest&lt;/span&gt;
        &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;containerPort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5432&lt;/span&gt;
        &lt;span class="na"&gt;volumeMounts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres-data&lt;/span&gt;
          &lt;span class="na"&gt;mountPath&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/var/lib/postgresql/data&lt;/span&gt;
        &lt;span class="na"&gt;lifecycle&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;preStop&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;exec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/bin/sh"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-c"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pg_ctl&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-D&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;/var/lib/postgres/data&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-w&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-t&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;60&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-m&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;fast&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;stop"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;volumeClaimTemplates&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres-data&lt;/span&gt;
    &lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;accessModes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ReadWriteOnce"&lt;/span&gt; &lt;span class="pi"&gt;]&lt;/span&gt;
      &lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;requests&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;storage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1Gi&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This &lt;code&gt;preStop&lt;/code&gt; hook runs the &lt;code&gt;pg_ctl&lt;/code&gt; stop command to shut down the PostgreSQL server. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;-D /var/lib/postgres/data&lt;/code&gt; option specifies the directory where the data base files live, &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-w&lt;/code&gt; waits until the server shuts down, &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-t 60&lt;/code&gt; specifies the wait timeout in seconds, and &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-m fast&lt;/code&gt; means to do a "fast" shutdown, which rolls back all active transactions, disconnects clients immediately and shuts down.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For AWS ECS deployments you can set the &lt;strong&gt;Min and max running tasks&lt;/strong&gt; respectively: &lt;code&gt;0% min and 100% max&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.debug.school/images/3sOLGvIVNYsWsOjGFtrydWLkWXh8LGBFD1cJIiIGLew/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly93d3cu/ZGVidWcuc2Nob29s/L3VwbG9hZHMvYXJ0/aWNsZXMvZW0wOTMx/cnR3NGlrNTFocXBs/MTkucG5n" class="article-body-image-wrapper"&gt;&lt;img src="https://www.debug.school/images/3sOLGvIVNYsWsOjGFtrydWLkWXh8LGBFD1cJIiIGLew/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly93d3cu/ZGVidWcuc2Nob29s/L3VwbG9hZHMvYXJ0/aWNsZXMvZW0wOTMx/cnR3NGlrNTFocXBs/MTkucG5n" alt="Postgres" width="128" height="128"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Recover from an error state
&lt;/h2&gt;

&lt;p&gt;This can be fixed by running &lt;code&gt;pg_resetwal&lt;/code&gt; command by connecting to the container. &lt;br&gt;
However, since the pod is in &lt;code&gt;crashLoopBackOff&lt;/code&gt; state, we will not be able to connect to the container.&lt;br&gt;
We must first make the pod to be in stable state to execute the command.&lt;/p&gt;

&lt;p&gt;Please follow the steps below for manual execution of the command &lt;code&gt;pg_resetwal&lt;/code&gt; in a container. &lt;br&gt;
This process requires the pod to be in a stable state, and not in a crash loop. &lt;br&gt;
You can achieve this by introducing a delay in the &lt;code&gt;postgres-deployment.yaml&lt;/code&gt; file.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Scale down the deployment by reducing the replica count of the deployment to zero using the following command: &lt;code&gt;kubectl scale deployment postgres - replicas=0&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Introduce a delay: Modify the &lt;code&gt;postgres-deployment.yaml&lt;/code&gt; file to include a sleep command that delays the initialization process by 600 seconds, keeping the pod in the initializing state.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here is an example of how to add it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres&lt;/span&gt;
        &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres:latest&lt;/span&gt;
        &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/bin/bash"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-c"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt; &lt;span class="pi"&gt;]&lt;/span&gt; 
        &lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sleep&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;600;"&lt;/span&gt; &lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Scale up the deployment: Bring the deployment back up by increasing the replica count to one using the following command: &lt;code&gt;kubectl scale deployment postgres - replicas=1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Execute &lt;code&gt;pg_resetwal&lt;/code&gt; in the pod: Once the pod reaches the initializing state, run the &lt;code&gt;pg_resetwal&lt;/code&gt; command by executing into the pod. Here is how you can do this:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; postgres - /bin/bash
su postgres
pg_resetwal /var/lib/postgres/data
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Proceed despite the warning: If you do receive the warning, continue the process by forcing the &lt;code&gt;pg_resetwal&lt;/code&gt; command as follows: &lt;code&gt;pg_resetwal /var/lib/posgtgres/data -f&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After running this command, you should receive a confirmation message stating “Write-ahead log reset.”&lt;br&gt;
After you have successfully executed the pg_resetwal command, you should be able to restart the PostgreSQL server. &lt;br&gt;
Remember that the &lt;code&gt;pg_resetwal&lt;/code&gt; command is a measure of last resort and carries the risk of data loss or inconsistency.&lt;br&gt;
Always make sure to maintain regular backups of your PostgreSQL databases and consider setting up high availability and replication solutions for your production databases.&lt;/p&gt;

&lt;p&gt;Ref: &lt;a href="https://medium.com/@adnanitdev/fix-for-error-panic-could-not-locate-a-valid-checkpoint-record-in-postgres-or-citus-running-in-b03d8341a258" rel="noopener noreferrer"&gt;https://medium.com/@adnanitdev/fix-for-error-panic-could-not-locate-a-valid-checkpoint-record-in-postgres-or-citus-running-in-b03d8341a258&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>postgres</category>
      <category>data</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>VMWare vExpert Program</title>
      <dc:creator>Suyash Sambhare</dc:creator>
      <pubDate>Thu, 29 Jan 2026 04:35:52 +0000</pubDate>
      <link>https://www.debug.school/suyash/vmware-vexpert-program-3j84</link>
      <guid>https://www.debug.school/suyash/vmware-vexpert-program-3j84</guid>
      <description>&lt;h1&gt;
  
  
  Announcement: vExpert 2025 Recognition
&lt;/h1&gt;

&lt;p&gt;I am pleased to share that I have been recognised as a &lt;strong&gt;vExpert&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
Directory Listing: &lt;a href="https://vexpert.vmware.com/directory/9629" rel="noopener noreferrer"&gt;https://vexpert.vmware.com/directory/9629&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.debug.school/images/ZHtHE_fmdqyd9OJHjKEzImAFGcYwFocWVi0TQNDIDgY/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly93d3cu/ZGVidWcuc2Nob29s/L3VwbG9hZHMvYXJ0/aWNsZXMvaHd2ejQw/bzM3Y3pmejh0cTd3/MXIucG5n" class="article-body-image-wrapper"&gt;&lt;img src="https://www.debug.school/images/ZHtHE_fmdqyd9OJHjKEzImAFGcYwFocWVi0TQNDIDgY/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly93d3cu/ZGVidWcuc2Nob29s/L3VwbG9hZHMvYXJ0/aWNsZXMvaHd2ejQw/bzM3Y3pmejh0cTd3/MXIucG5n" alt="Suyash vExpert" width="800" height="411"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  vExpert Badge
&lt;/h2&gt;

&lt;p&gt;The vExpert program highlights individuals who demonstrate a strong passion for VMware technologies and who dedicate their time to sharing knowledge through blogs, forums, community groups, and various online or in‑person events. I am honoured to be part of such a dynamic and collaborative community, where ideas continually evolve and opportunities to engage with experts from around the world are abundant.&lt;/p&gt;




&lt;h2&gt;
  
  
  Importance of the vExpert Program
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;VMware by Broadcom vExpert Program&lt;/strong&gt; is a global community recognition initiative that acknowledges individuals who have made meaningful contributions to the VMware ecosystem. The program welcomes anyone with a deep interest in VMware products and services and seeks to recognise those who actively share their expertise, insights, and experiences with the broader community.&lt;/p&gt;

&lt;p&gt;I am particularly grateful for the wealth of technical blogs, articles, and resources produced by fellow vExperts. Their contributions not only support other vExperts but also provide invaluable guidance to VMware professionals worldwide. These resources span a wide range of topics, including best practices, troubleshooting, automation, networking, and advanced virtualisation concepts.&lt;/p&gt;




&lt;h2&gt;
  
  
  Ways to Qualify for vExpert
&lt;/h2&gt;

&lt;p&gt;The vExpert award recognises contributions across multiple categories, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Enterprise/Internal Influencer&lt;/strong&gt; – Leading internal knowledge‑sharing sessions such as workshops or webinars on VMware technologies.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Blogging&lt;/strong&gt; – Publishing educational content on VMware products or events like VMware Explore.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code Sharing&lt;/strong&gt; – Providing tools, scripts, or code samples through websites, apps, VMware {code}, or internal platforms.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Event Speaking&lt;/strong&gt; – Presenting at VMUG meetings, VMware Explore, or other industry conferences.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Podcasting&lt;/strong&gt; – Hosting or co‑hosting podcasts focused on VMware topics.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Video Content&lt;/strong&gt; – Creating tutorials, demonstrations, or technical walkthroughs on platforms such as YouTube.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Online Forums&lt;/strong&gt; – Supporting the community by answering questions on VMTN or VMware‑related Reddit communities.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VMUG Leadership Support&lt;/strong&gt; – Assisting local VMUG chapters in leadership or organisational roles.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a href="https://www.debug.school/images/Yr85v5lYc4HIqa9e21yN2BcTFkcHjBjc0nOAjlC1XiE/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly93d3cu/ZGVidWcuc2Nob29s/L3VwbG9hZHMvYXJ0/aWNsZXMvaWc1ejN3/ZWE1dzJsOTRvODEz/ZW8ucG5n" class="article-body-image-wrapper"&gt;&lt;img src="https://www.debug.school/images/Yr85v5lYc4HIqa9e21yN2BcTFkcHjBjc0nOAjlC1XiE/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly93d3cu/ZGVidWcuc2Nob29s/L3VwbG9hZHMvYXJ0/aWNsZXMvaWc1ejN3/ZWE1dzJsOTRvODEz/ZW8ucG5n" alt="vExpert" width="400" height="400"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Value of the vExpert Program
&lt;/h2&gt;

&lt;p&gt;Becoming a vExpert provides numerous benefits that extend well beyond recognition:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Content Promotion&lt;/strong&gt; – vExpert content is amplified through VMware’s official social channels, LinkedIn, Broadcom Advocacy, and the VMware Blog RSS feed, increasing visibility and engagement.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Personal Brand Development&lt;/strong&gt; – The vExpert title enhances professional credibility and strengthens your reputation within the technology community.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Professional Recognition&lt;/strong&gt; – Inclusion in the vExpert Directory and on LinkedIn validates your community contributions and helps distinguish you in your career.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complimentary VMUG Advantage Membership&lt;/strong&gt; – Includes access to valuable resources and discounts.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Free VMware Licenses&lt;/strong&gt; – vExperts receive VCF Home Lab licenses through VMUG Advantage (subject to passing the VCP‑VCF exam), enabling hands‑on learning and skill development.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exclusive Networking Opportunities&lt;/strong&gt; – Access to private vExpert communication channels and industry experts.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Early Access &amp;amp; NDA Briefings&lt;/strong&gt; – Participation in NDA sessions and early access to VMware roadmap materials.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VMware Explore Blogger Passes&lt;/strong&gt; – Complimentary blogger access to VMware Explore events (limited availability).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Pathways to Becoming a vExpert
&lt;/h2&gt;

&lt;p&gt;There are several recognised avenues for contributing to the VMware community:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enterprise / Internal Influencers
&lt;/li&gt;
&lt;li&gt;Bloggers
&lt;/li&gt;
&lt;li&gt;Code Contributors
&lt;/li&gt;
&lt;li&gt;VMUG Leaders
&lt;/li&gt;
&lt;li&gt;Event Speakers
&lt;/li&gt;
&lt;li&gt;Podcasters
&lt;/li&gt;
&lt;li&gt;Online Forum Supporters
&lt;/li&gt;
&lt;li&gt;Authors
&lt;/li&gt;
&lt;li&gt;VCDX Certification Holders
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Beyond being a symbol of achievement, the vExpert program empowers individuals to expand their professional network, strengthen their personal brand, and gain access to exclusive resources and events.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.debug.school/images/SfyboDN5ATMkFcY4k_uRPHk1a2auX290H3hquvYunP0/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly93d3cu/ZGVidWcuc2Nob29s/L3VwbG9hZHMvYXJ0/aWNsZXMvNGdqb2F6/eWJ1ZTYzNHlkZDZ4/bHYucG5n" class="article-body-image-wrapper"&gt;&lt;img src="https://www.debug.school/images/SfyboDN5ATMkFcY4k_uRPHk1a2auX290H3hquvYunP0/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly93d3cu/ZGVidWcuc2Nob29s/L3VwbG9hZHMvYXJ0/aWNsZXMvNGdqb2F6/eWJ1ZTYzNHlkZDZ4/bHYucG5n" alt="vExpert 5 Years" width="800" height="411"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Closing Thoughts
&lt;/h2&gt;

&lt;p&gt;Being part of the vExpert community is not solely about holding a title—it is about the collective impact we make on the VMware ecosystem. One of the most valuable aspects of this community is the wealth of knowledge shared by its members, which continues to inspire and support professionals across the globe.&lt;/p&gt;

&lt;p&gt;If you found this article helpful, a share on &lt;strong&gt;LinkedIn&lt;/strong&gt; or &lt;strong&gt;X&lt;/strong&gt; would be greatly appreciated.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;vExpert Suyash Sambhare&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Directory Listing: &lt;a href="https://vexpert.vmware.com/directory/9629" rel="noopener noreferrer"&gt;https://vexpert.vmware.com/directory/9629&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For more information, visit the official vExpert website: &lt;a href="https://vexpert.vmware.com" rel="noopener noreferrer"&gt;https://vexpert.vmware.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>vmware</category>
      <category>vexpert</category>
      <category>broadcom</category>
      <category>devops</category>
    </item>
    <item>
      <title>DevOps Training</title>
      <dc:creator>Suyash Sambhare</dc:creator>
      <pubDate>Tue, 13 Jan 2026 03:28:07 +0000</pubDate>
      <link>https://www.debug.school/suyash/devops-training-5hi</link>
      <guid>https://www.debug.school/suyash/devops-training-5hi</guid>
      <description>&lt;h2&gt;
  
  
  Application Development Concepts
&lt;/h2&gt;

&lt;p&gt;• History of Application Development&lt;br&gt;
• Evolution of Application Development Methodologies&lt;br&gt;
• Introduction to Application Architectures&lt;br&gt;
• Introduction to the Application Development Lifecycle&lt;br&gt;
• Application Testing and Quality Assurance&lt;br&gt;
• Application Monitoring, Maintenance, and Support&lt;/p&gt;




&lt;h2&gt;
  
  
  Application Security Fundamentals
&lt;/h2&gt;

&lt;p&gt;• What is Secure Application Development&lt;br&gt;
• Need for Application Security&lt;br&gt;
• Common Application Security Risks and Threats&lt;br&gt;
• OWASP Top 10 Application Security Techniques&lt;br&gt;
• Secure Design Principles&lt;br&gt;
• Threat Modeling&lt;br&gt;
• Secure Coding&lt;br&gt;
• Secure Code Review&lt;br&gt;
• SAST and DAST Testing&lt;br&gt;
• Secure Configurations&lt;br&gt;
• Educating Developers&lt;br&gt;
• Role of Risk Management in Secure Development&lt;br&gt;
• Project Management Role in Secure Application Development&lt;/p&gt;




&lt;h2&gt;
  
  
  Introduction to DevOps
&lt;/h2&gt;

&lt;p&gt;• Introduction to DevOps&lt;br&gt;
• DevOps Principles&lt;br&gt;
• DevOps Pipelines&lt;br&gt;
• DevOps and Project Management&lt;/p&gt;




&lt;h2&gt;
  
  
  Introduction to DevSecOps
&lt;/h2&gt;

&lt;p&gt;• Understanding DevSecOps&lt;br&gt;
• DevOps vs. DevSecOps&lt;br&gt;
• DevSecOps Principles&lt;br&gt;
• DevSecOps Culture&lt;br&gt;
• Shift-Left Security&lt;br&gt;
• DevSecOps Pipelines&lt;br&gt;
• Pillars of DevSecOps&lt;br&gt;
• DevSecOps Benefits and Challenges&lt;/p&gt;




&lt;h2&gt;
  
  
  Introduction to DevSecOps Management Tools
&lt;/h2&gt;

&lt;p&gt;• Project Management Tools&lt;br&gt;
• Integrated Development Environment (IDE) Tools&lt;br&gt;
• Source-code Management Tools&lt;br&gt;
• Build Tools&lt;br&gt;
• Continuous Testing Tools&lt;/p&gt;




&lt;p&gt;&lt;a href="https://www.debug.school/images/lj6UXdeepdxwkKW_jj0tnDLCqk5kjId7divIewOkPmc/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly93d3cu/ZGVidWcuc2Nob29s/L3VwbG9hZHMvYXJ0/aWNsZXMvdHUzYmxs/bHM1ZXl2YmQ2MTd4/bmcucG5n" class="article-body-image-wrapper"&gt;&lt;img src="https://www.debug.school/images/lj6UXdeepdxwkKW_jj0tnDLCqk5kjId7divIewOkPmc/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly93d3cu/ZGVidWcuc2Nob29s/L3VwbG9hZHMvYXJ0/aWNsZXMvdHUzYmxs/bHM1ZXl2YmQ2MTd4/bmcucG5n" alt="DevOps Training" width="638" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction to DevSecOps Code and CI/CD Tools
&lt;/h2&gt;

&lt;p&gt;• Continuous Integration Tools&lt;br&gt;
• Infrastructure as Code Tools&lt;br&gt;
• Configuration Management Tools&lt;br&gt;
• Continuous Monitoring Tools&lt;/p&gt;




&lt;h2&gt;
  
  
  Introduction to DevSecOps Pipelines
&lt;/h2&gt;

&lt;p&gt;• Role of DevSecOps in the CI/CD Pipeline&lt;br&gt;
• DevSecOps Tools&lt;br&gt;
• Embracing the DevSecOps Lifecycle&lt;br&gt;
• DevSecOps Ecosystem&lt;br&gt;
• Key Elements of the DevSecOps Pipeline&lt;br&gt;
• Integrating Security into the DevOps Pipeline&lt;/p&gt;




&lt;h2&gt;
  
  
  Introduction to DevSecOps CI/CD Testing and Assessments
&lt;/h2&gt;

&lt;p&gt;• Implementing Security into the CI/CD Pipeline and Security Controls&lt;br&gt;
• Continuous Security in DevSecOps with Security as Code&lt;br&gt;
• Continuous Application Testing for CI/CD Pipeline Security&lt;br&gt;
• Application Assessments and Penetration Testing&lt;/p&gt;




&lt;h2&gt;
  
  
  Implementing DevSecOps Testing and Threat Modeling
&lt;/h2&gt;

&lt;p&gt;• Integrating Security Threat Modeling in Plan Stage&lt;br&gt;
• Integrating Secure Coding in Code Stage&lt;br&gt;
• Integrating SAST, DAST, and IAST in Build and Test Stage&lt;br&gt;
• Integrating RASP and VAPT in Release and Deploy Stage&lt;/p&gt;




&lt;h2&gt;
  
  
  Implementing DevSecOps Monitoring Feedback
&lt;/h2&gt;

&lt;p&gt;• Implementing Infrastructure as Code (IaC)&lt;br&gt;
• Integrating Configuration Orchestration&lt;br&gt;
• Integrating Security in Operate and Monitor Stage&lt;br&gt;
• Integrating Compliance as Code (CaC)&lt;br&gt;
• Integrating Logging, Monitoring, and Alerting&lt;br&gt;
• Integrating Continuous Feedback Loop&lt;/p&gt;

</description>
      <category>devops</category>
      <category>learning</category>
      <category>training</category>
      <category>online</category>
    </item>
    <item>
      <title>EFS Utils</title>
      <dc:creator>Suyash Sambhare</dc:creator>
      <pubDate>Wed, 07 Jan 2026 23:34:57 +0000</pubDate>
      <link>https://www.debug.school/suyash/efs-utils-3pd9</link>
      <guid>https://www.debug.school/suyash/efs-utils-3pd9</guid>
      <description>&lt;h2&gt;
  
  
  Utilities for Amazon Elastic File System
&lt;/h2&gt;

&lt;p&gt;AWS EFS (Elastic File System) Utils is a mount helper for using Amazon EFS file systems used for various tasks related to managing and using Amazon EFS services. Here’s a breakdown of their primary functionalities:&lt;/p&gt;

&lt;h2&gt;
  
  
  Purpose of AWS EFS Utils
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Mounting EFS File Systems
&lt;/h3&gt;

&lt;p&gt;AWS EFS Utils provide easy-to-use commands for mounting EFS file systems to EC2 instances, allowing you to access files stored in EFS from your applications.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Performance Management
&lt;/h3&gt;

&lt;p&gt;The tools include options to configure mount settings that can optimize performance based on your specific workload needs, such as choosing throughput modes.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Automatic DNS Resolution
&lt;/h3&gt;

&lt;p&gt;EFS Utils help automatically resolve the correct DNS name for the EFS file system, simplifying the mounting process.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Health Monitoring
&lt;/h3&gt;

&lt;p&gt;These utils include commands that can be used to check the health and status of your EFS file systems, ensuring they are functioning correctly.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Security Configuration
&lt;/h3&gt;

&lt;p&gt;AWS EFS Utils help with configuring security options like AWS Identity and Access Management (IAM) policies and mounted instances' security groups, enhancing security during access.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Command-Line Interface
&lt;/h3&gt;

&lt;p&gt;The utilities provide a command-line interface for performing various administrative tasks related to EFS, making it easier to integrate EFS with your scripts or applications.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Troubleshooting
&lt;/h3&gt;

&lt;p&gt;They also include features for debugging and monitoring, allowing users to diagnose and troubleshoot issues that may arise during usage.&lt;/p&gt;



&lt;h3&gt;
  
  
  Summary
&lt;/h3&gt;

&lt;p&gt;AWS EFS Utils streamline the process of using Amazon EFS by providing tools for mounting, managing, and optimizing EFS interactions, making it a vital component for applications that require scalable file storage. If you have specific scenarios in mind for using EFS, let me know!&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;efs-utils&lt;/code&gt; package has been verified against the following Linux distributions:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Distribution&lt;/th&gt;
&lt;th&gt;Package Type&lt;/th&gt;
&lt;th&gt;
&lt;code&gt;init&lt;/code&gt; System&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Amazon Linux 2&lt;/td&gt;
&lt;td&gt;&lt;code&gt;rpm&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;systemd&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Amazon Linux 2023&lt;/td&gt;
&lt;td&gt;&lt;code&gt;rpm&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;systemd&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RHEL 8&lt;/td&gt;
&lt;td&gt;&lt;code&gt;rpm&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;systemd&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RHEL 9&lt;/td&gt;
&lt;td&gt;&lt;code&gt;rpm&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;systemd&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ubuntu 20.04&lt;/td&gt;
&lt;td&gt;&lt;code&gt;deb&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;systemd&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ubuntu 22.04&lt;/td&gt;
&lt;td&gt;&lt;code&gt;deb&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;systemd&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ubuntu 24.04&lt;/td&gt;
&lt;td&gt;&lt;code&gt;deb&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;systemd&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenSUSE Leap&lt;/td&gt;
&lt;td&gt;&lt;code&gt;rpm&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;systemd&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SLES 15&lt;/td&gt;
&lt;td&gt;&lt;code&gt;rpm&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;systemd&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;To install AWS EFS (Elastic File System) Utils on Ubuntu, follow these steps:&lt;/p&gt;

&lt;p&gt;Note: Building from source requires Rust 1.70+, Cargo, Go 1.17.13+, CMake 3.0+, GCC/G++, and Perl.&lt;/p&gt;
&lt;h2&gt;
  
  
  Installing AWS EFS Utils on Ubuntu
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Step 1: Update the Package Index
&lt;/h3&gt;

&lt;p&gt;Open your terminal and update the package index:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Install Required Packages
&lt;/h3&gt;

&lt;p&gt;Install the necessary packages for building the EFS Utils:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; git make gcc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Clone the EFS Utils Repository
&lt;/h3&gt;

&lt;p&gt;Clone the AWS EFS Utils GitHub repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/aws/efs-utils
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4: Change Directory
&lt;/h3&gt;

&lt;p&gt;Navigate into the cloned directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;efs-utils
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 5: Install EFS Utils
&lt;/h3&gt;

&lt;p&gt;Run the make command to compile and install:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;make &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 6: Verify Installation
&lt;/h3&gt;

&lt;p&gt;To ensure that the EFS Utils are installed correctly, you can check the version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;efs-utils &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you see the version number, the installation was successful.&lt;/p&gt;

&lt;h3&gt;
  
  
  Detailed Installation Information
&lt;/h3&gt;

&lt;h1&gt;
  
  
  Building efs-utils from Source
&lt;/h1&gt;

&lt;p&gt;This guide provides detailed instructions for building &lt;code&gt;efs-utils&lt;/code&gt; from source on various Linux distributions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build Prerequisites
&lt;/h2&gt;

&lt;p&gt;Building efs-utils v2.0+ requires the following dependencies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;rust&lt;/code&gt; 1.70+&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cargo&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;go&lt;/code&gt; 1.17.13+&lt;/li&gt;
&lt;li&gt;&lt;code&gt;perl&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cmake&lt;/code&gt; 3.0+&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gcc&lt;/code&gt; and &lt;code&gt;g++&lt;/code&gt; (or &lt;code&gt;gcc-c++&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;make&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Recommended Resource Size:&lt;/strong&gt; minimum 2 vCPUs, 4GB RAM to ensure sufficient resources for compilation. In AWS EC2, use t3.medium or larger.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing Rust and Cargo
&lt;/h2&gt;

&lt;p&gt;If your distribution doesn't provide a rust or cargo package, or it provides versions&lt;br&gt;
that are older than 1.70, then you can install rust and cargo through rustup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--proto&lt;/span&gt; &lt;span class="s1"&gt;'=https'&lt;/span&gt; &lt;span class="nt"&gt;--tlsv1&lt;/span&gt;.2 &lt;span class="nt"&gt;-sSf&lt;/span&gt; https://sh.rustup.rs | sh
&lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.cargo/env"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Installing Go
&lt;/h2&gt;

&lt;p&gt;Ensure you have Go 1.17.13 or later is installed and configured on your system.&lt;br&gt;
Some distributions provide Go packages through package manager, but they may have outdated versions.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# DEB-based&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update  
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nb"&gt;install &lt;/span&gt;golang

&lt;span class="c"&gt;# Verify Go 1.17.13 or later is installed&lt;/span&gt;
go version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  GCC Version Requirements
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install GCC 13 (if not already installed)&lt;/span&gt;
&lt;span class="c"&gt;# For Debian 13&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; gcc-13 g++-13

&lt;span class="c"&gt;# Set GCC 13 as the compiler for the build&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;CC&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;gcc-13
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;CXX&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;g++-13
&lt;span class="c"&gt;# Then proceed with the normal build steps&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Ubuntu 20.04, upgrade to use gcc-10 and g++-10&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install GCC 10&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nb"&gt;install &lt;/span&gt;gcc-10 g++-10

&lt;span class="c"&gt;# Set GCC 10 as the compiler for the build&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;CC&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;gcc-10
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;CXX&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;g++-10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Alternatively, you can set the system default compiler using &lt;code&gt;update-alternatives&lt;/code&gt; (requires sudo and affects all applications)&lt;/p&gt;

&lt;h2&gt;
  
  
  CMake version requirement
&lt;/h2&gt;

&lt;p&gt;Building AWS-LC requires CMake 3.0 or later. CMake is typically available through the standard packager manager.&lt;/p&gt;

&lt;h2&gt;
  
  
  DEB-based Distributions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Debian/Ubuntu
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nb"&gt;install &lt;/span&gt;git binutils rustc cargo libssl-dev pkg-config gettext make gcc g++ cmake wget perl &lt;span class="c"&gt;# remove gcc g++ here if you already installed a compatible version following GCC Version Requirements instruction&lt;/span&gt;
git clone https://github.com/aws/efs-utils
&lt;span class="nb"&gt;cd &lt;/span&gt;efs-utils
./build-deb.sh
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nb"&gt;install&lt;/span&gt; ./build/amazon-efs-utils&lt;span class="k"&gt;*&lt;/span&gt;deb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Running Tests
&lt;/h2&gt;

&lt;p&gt;After building from source, you can run the test suite:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Set up a virtualenv:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;virtualenv ~/.envs/efs-utils
&lt;span class="nb"&gt;source&lt;/span&gt; ~/.envs/efs-utils/bin/activate
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Run tests:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;make &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Verifying Installation
&lt;/h2&gt;

&lt;p&gt;After installation, verify efs-utils is working:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mount.efs &lt;span class="nt"&gt;--version&lt;/span&gt;
/usr/sbin/mount.efs Version: 2.2.0

mount.efs &lt;span class="nt"&gt;--help&lt;/span&gt;
Usage: mount.efs &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--version&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;-h&lt;/span&gt;|--help] &amp;lt;fsname&amp;gt; &amp;lt;mountpoint&amp;gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;-o&lt;/span&gt; &amp;lt;options&amp;gt;]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Additional Notes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Make sure you have &lt;code&gt;nfs-common&lt;/code&gt; installed, as it is required for mounting EFS file systems. You can install it with:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;nfs-common
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://www.debug.school/images/-7VTkcsuKAwajdjj4ChE-gTsDO9hS5ClKu7Fou91guU/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly93d3cu/ZGVidWcuc2Nob29s/L3VwbG9hZHMvYXJ0/aWNsZXMvejE0ajJp/dnFiMHBpZjBmeXZ2/NGQucG5n" class="article-body-image-wrapper"&gt;&lt;img src="https://www.debug.school/images/-7VTkcsuKAwajdjj4ChE-gTsDO9hS5ClKu7Fou91guU/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly93d3cu/ZGVidWcuc2Nob29s/L3VwbG9hZHMvYXJ0/aWNsZXMvejE0ajJp/dnFiMHBpZjBmeXZ2/NGQucG5n" alt="Efs Utils" width="472" height="460"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Usage
&lt;/h2&gt;

&lt;h3&gt;
  
  
  mount.efs
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;efs-utils&lt;/code&gt; includes a mount helper utility, &lt;code&gt;mount.efs&lt;/code&gt;, that simplifies and improves the performance of EFS file system mounts.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mount.efs&lt;/code&gt; launches a proxy process that forwards NFS traffic from the kernel's NFS client to EFS.&lt;br&gt;
This proxy is responsible for TLS encryption, and for providing improved throughput performance.&lt;/p&gt;

&lt;p&gt;To mount with the recommended default options, simply run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;mount &lt;span class="nt"&gt;-t&lt;/span&gt; efs file-system-id efs-mount-point/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To mount file system to a specific mount target of the file system, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;mount &lt;span class="nt"&gt;-t&lt;/span&gt; efs &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;mounttargetip&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;mount-target-ip-address file-system-id efs-mount-point/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To mount file system within a given network namespace, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;mount &lt;span class="nt"&gt;-t&lt;/span&gt; efs &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;netns&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;netns-path file-system-id efs-mount-point/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To mount file system to the mount target in a specific availability zone (e.g. us-east-1a), run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;mount &lt;span class="nt"&gt;-t&lt;/span&gt; efs &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;az&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;az-name file-system-id efs-mount-point/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To mount file system to the mount target in a specific region (e.g. us-east-1), run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;mount &lt;span class="nt"&gt;-t&lt;/span&gt; efs &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;region&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;region-name file-system-id efs-mount-point/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To mount the filesystem mount target in the same physical availability zone ID (e.g. use1-az1) as the client instance over cross-AWS-account mounts, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo mount -t efs -o crossaccount file-system-id efs-mount-point/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To mount over TLS, simply add the &lt;code&gt;tls&lt;/code&gt; option:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;mount &lt;span class="nt"&gt;-t&lt;/span&gt; efs &lt;span class="nt"&gt;-o&lt;/span&gt; tls file-system-id efs-mount-point/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To authenticate with EFS using the system’s IAM identity, add the &lt;code&gt;iam&lt;/code&gt; option. This option requires the &lt;code&gt;tls&lt;/code&gt; option.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;mount &lt;span class="nt"&gt;-t&lt;/span&gt; efs &lt;span class="nt"&gt;-o&lt;/span&gt; tls,iam file-system-id efs-mount-point/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To mount using an access point, use the &lt;code&gt;accesspoint=&lt;/code&gt; option. This option requires the &lt;code&gt;tls&lt;/code&gt; option.&lt;br&gt;
The access point must be in the "available" state before it can be used to mount EFS.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;mount &lt;span class="nt"&gt;-t&lt;/span&gt; efs &lt;span class="nt"&gt;-o&lt;/span&gt; tls,accesspoint&lt;span class="o"&gt;=&lt;/span&gt;access-point-id file-system-id efs-mount-point/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To mount your file system automatically with any of the options above, you can add entries to &lt;code&gt;/efs/fstab&lt;/code&gt; like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;file-system-id efs-mount-point efs _netdev,tls,iam,accesspoint&lt;span class="o"&gt;=&lt;/span&gt;access-point-id 0 0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For more information on mounting with the mount helper, see the manual page:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;man mount.efs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;mount.efs  launches  a proxy process that forwards NFS traffic from the kernel's NFS client to EFS. This proxy&lt;br&gt;
is responsible for TLS encryption, and for providing improved throughput performance.&lt;/p&gt;

&lt;p&gt;fs-id-or-dns-name has to be of one of the following two forms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;An EFS filesystem ID in the form of "fs-abcd1234", generated when the file system is created.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A domain name that has a resolvable DNS-CNAME record, which in turn points to a fully-qualified EFS DNS name  in  the  form  of  "fs-abcd1234.efs.us-east-1.amazonaws.com"  or  "us-east-1a.fs-abcd1234.efs.us-east-1.amazonaws.com".&lt;br&gt;
mount-point is the local directory on which the file system will be mounted.&lt;br&gt;
mount.efs automatically applies the following NFS options:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;nfsvers=4.1&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;rsize=1048576&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;wsize=1048576&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;hard&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;timeo=600&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;retrans=2&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;noresvport&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;tls (for Mac distributions)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By  default,  when using the Amazon EFS mount helper with Transport Layer Security (TLS), the mount helper enforces the certificate hostname checking and disables the use of Online Certificate  Status  Protocol  (OCSP). These options can be configured in the config file located at &lt;code&gt;/etc/amazon/efs/efs-utils.conf&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Additionally,  the  Amazon  EFS mount helper has built-in logging for troubleshooting purposes. These logs are located at &lt;code&gt;/var/log/amazon/efs&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It is possible to configure your Amazon EC2 instance to automatically remount your Amazon EFS file system when it reboots. &lt;/p&gt;

&lt;h3&gt;
  
  
  Options
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;-o&lt;/code&gt;,  Options  are specified with a -o flag followed by a comma separated string of options. All of the options specified in nfs are available, in addition to the following EFS-specific options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;tls&lt;/code&gt;: Mounts the EFS file system over TLS. For EC2 instances using Mac distributions, this option is by default passed and the EFS file system is mounted over TLS.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;notls&lt;/code&gt;: Mounts the EFS file system without TLS, applies for Mac distributions only.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;region&lt;/code&gt;: Mounts the EFS file system from the specified region, overriding any config file value.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tlsport=n&lt;/code&gt;: Configures  the  proxy process to listen for connections from the NFS client on the specified port. This is applicable to both non-tls and tls mounts. By default, the tlsport is chosen randomly from port range defined in the config file located at &lt;code&gt;/etc/amazon/efs/efs-utils.conf&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;verify=n&lt;/code&gt;:  Verify TLS certificates using the specified stunnel verify level.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ocsp / noocsp&lt;/code&gt;: Selects whether to perform OCSP validation on TLS certificates, overriding &lt;code&gt;/etc/amazon/efs/efs-utils.conf&lt;/code&gt;. By default OCSP is disabled. The ocsp mount option is incompatible with the efs-proxy process, and will revert efs-utils to the legacy &lt;code&gt;stunnel&lt;/code&gt; mode, which does not support improved per-client throughput performance.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;iam&lt;/code&gt;: Use  the  system's IAM identity to authenticate with EFS. The mount helper will try to retrieve the required IAM credentials from the following locations: the aws credentials URI passed by mount  option,  the  AWS CLI credentials file (&lt;code&gt;~/.aws/credentials&lt;/code&gt;), and the AWS CLI config file (&lt;code&gt;~/.aws/config&lt;/code&gt;), the &lt;code&gt;AWS_CONTAINER_CREDENTIALS_RELATIVE_URI&lt;/code&gt; environment variable,  the  &lt;code&gt;AssumeRoleWithWebIdentity&lt;/code&gt;,  the EC2 instance profile.  The first location that has credentials will be used. This option requires the tls option.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rolearn&lt;/code&gt;: Role ARN for IAM authentication with AssumeRoleWithWebIdentity API.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;jwtpath&lt;/code&gt;: Identity token for IAM authentication with AssumeRoleWithWebIdentity API.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;accesspoint&lt;/code&gt;: Mount the EFS file system using the specified access point. This option requires the tls option. The access point must be in the "available" state before it can be used to mount EFS.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;awsprofile&lt;/code&gt;: Use  the  named profile used to lookup IAM credentials in the AWS CLI credentials file (&lt;code&gt;~/.aws/credentials&lt;/code&gt;) or AWS CLI config file (&lt;code&gt;~/.aws/config&lt;/code&gt;). If botocore is installed, assume the  named  profile  and  use  the  credentials of the assumed profile. If "awsprofile" is not specified, the "default" profile is used.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;awscredsuri&lt;/code&gt;: Use the relative uri to lookup IAM credentials from ecs task metadata endpoint.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cafile&lt;/code&gt;: Use the cafile as the stunnel certificate authority file.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;netns&lt;/code&gt;: Mount the EFS file system to the specified network namespace.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;az&lt;/code&gt;: Mount the EFS file system to the specified availability zone mount target.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mountport&lt;/code&gt;: Use the port 2049 to bypass portmapper daemon on EC2 Mac instances running macOS Big Sur.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mounttargetip&lt;/code&gt;: Mount the EFS file system to the specified mount target ip address.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;stunnel&lt;/code&gt;: Forward NFS traffic from the local NFS client to EFS using stunnel instead of efs-proxy. This will enable compatibility with the ocsp mount option, but will not deliver the increased throughput performance provided by efs-proxy. This option is enabled by default for Mac clients.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ref: &lt;a href="https://github.com/aws/efs-utils" rel="noopener noreferrer"&gt;https://github.com/aws/efs-utils&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>aws</category>
      <category>efs</category>
      <category>utils</category>
    </item>
    <item>
      <title>Happy New Year!</title>
      <dc:creator>Suyash Sambhare</dc:creator>
      <pubDate>Thu, 01 Jan 2026 08:20:33 +0000</pubDate>
      <link>https://www.debug.school/suyash/happy-new-year-3ak9</link>
      <guid>https://www.debug.school/suyash/happy-new-year-3ak9</guid>
      <description>&lt;h2&gt;
  
  
  Happy New Year!
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.debug.school/images/AeEsa1b1k6lAxqSrmuafDG-GjN92m8Wc8l0r_qptJus/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly93d3cu/ZGVidWcuc2Nob29s/L3VwbG9hZHMvYXJ0/aWNsZXMvajkwand5/ODRhd2d1cDEyajlh/ZDQucG5n" class="article-body-image-wrapper"&gt;&lt;img src="https://www.debug.school/images/AeEsa1b1k6lAxqSrmuafDG-GjN92m8Wc8l0r_qptJus/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly93d3cu/ZGVidWcuc2Nob29s/L3VwbG9hZHMvYXJ0/aWNsZXMvajkwand5/ODRhd2d1cDEyajlh/ZDQucG5n" alt="Happy New Year!" width="128" height="48"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy New Year! &lt;br&gt;
🫥🧑🏼‍💻🪺🫕🌁🪉&lt;/p&gt;

</description>
      <category>devops</category>
      <category>newyear</category>
      <category>nye</category>
      <category>2026</category>
    </item>
    <item>
      <title>Configure SQL Container</title>
      <dc:creator>Suyash Sambhare</dc:creator>
      <pubDate>Wed, 17 Dec 2025 04:52:53 +0000</pubDate>
      <link>https://www.debug.school/suyash/configure-sql-container-86l</link>
      <guid>https://www.debug.school/suyash/configure-sql-container-86l</guid>
      <description>&lt;h1&gt;
  
  
  ✅ How to Configure and Customize SQL Server Linux Containers
&lt;/h1&gt;

&lt;p&gt;SQL Server on Linux containers offers powerful flexibility for development, testing, and even some production setups. You can customize your container using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Environment variables&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Custom Dockerfiles&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Persistent storage&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Startup scripts&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Docker Compose or env‑files&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This guide walks you through each of these approaches.&lt;/p&gt;




&lt;h1&gt;
  
  
  1. Create and Customize SQL Server Linux Containers
&lt;/h1&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1.1 Build a Customized Container&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;You can create your own Dockerfile and add scripts, packages, or configuration steps.&lt;/p&gt;

&lt;p&gt;Example from Microsoft documentation: the SQL Server process &lt;strong&gt;must remain the primary (right‑most) foreground process&lt;/strong&gt;; otherwise, the container shuts down when other steps finish.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;/usr/src/app/do-my-sql-commands.sh &amp;amp; 
/opt/mssql/bin/sqlservr
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If &lt;code&gt;sqlservr&lt;/code&gt; is not last, the container exits immediately after your custom script finishes.&lt;/p&gt;




&lt;h1&gt;
  
  
  2. Configure Using Environment Variables
&lt;/h1&gt;

&lt;p&gt;SQL Server on Linux exposes a comprehensive set of environment variables covering setup, memory, language, storage paths, HADR, SQL Agent, ports, and more. &lt;/p&gt;

&lt;p&gt;Here are some of the most important:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Variable&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ACCEPT_EULA&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Required to accept license terms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;MSSQL_SA_PASSWORD&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Sets &lt;code&gt;sa&lt;/code&gt; password (replaces deprecated &lt;code&gt;SA_PASSWORD&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;MSSQL_PID&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Sets edition or product key&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;MSSQL_COLLATION&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Default collation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;MSSQL_LCID&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Language locale&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;MSSQL_MEMORY_LIMIT_MB&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Max memory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;MSSQL_TCP_PORT&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Listen port (default 1433)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;MSSQL_DATA_DIR&lt;/code&gt; / &lt;code&gt;MSSQL_LOG_DIR&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Custom data &amp;amp; log paths&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;MSSQL_BACKUP_DIR&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Backup directory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;MSSQL_AGENT_ENABLED&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Enable SQL Agent (true/false)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;MSSQL_ENABLE_HADR&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Enable Availability Groups&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Example Container Run
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"ACCEPT_EULA=Y"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"MSSQL_SA_PASSWORD=MyP@ssw0rd!"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"MSSQL_AGENT_ENABLED=true"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"MSSQL_TCP_PORT=1533"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 1533:1533 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; sqlserver &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; mcr.microsoft.com/mssql/server:2022-latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  3. Persisting Data (Critical!)
&lt;/h1&gt;

&lt;p&gt;Container files are &lt;em&gt;ephemeral&lt;/em&gt;. To retain your databases, use volumes.&lt;/p&gt;

&lt;p&gt;SQL Server recommends mounting &lt;strong&gt;/var/opt/mssql&lt;/strong&gt;, the location for data, logs, dumps, and configs. &lt;/p&gt;

&lt;h3&gt;
  
  
  Example:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"ACCEPT_EULA=Y"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"MSSQL_SA_PASSWORD=MyP@ssw0rd!"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; ~/sqlvolumes:/var/opt/mssql &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 1433:1433 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; sql1 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; mcr.microsoft.com/mssql/server:2022-latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  4. Using Docker Compose for Multi‑Container or Complex Configs
&lt;/h1&gt;

&lt;p&gt;Docker Compose simplifies multi‑step setups (e.g., AOAG clusters). It passes environment variables, mounts volumes, and orchestrates replicated SQL Server containers. &lt;/p&gt;

&lt;p&gt;Example &lt;code&gt;docker-compose.yml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;sql1&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mcr.microsoft.com/mssql/server:2022-latest&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;ACCEPT_EULA&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Y"&lt;/span&gt;
      &lt;span class="na"&gt;MSSQL_SA_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;MyP@ssw0rd!"&lt;/span&gt;
      &lt;span class="na"&gt;MSSQL_AGENT_ENABLED&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;true"&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1433:1433"&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;sql1data:/var/opt/mssql&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;sql1data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://www.debug.school/images/g7Lp-JMEvt7QBMt9QRFPg3djRDDBbTYhxdADeexIPFk/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly93d3cu/ZGVidWcuc2Nob29s/L3VwbG9hZHMvYXJ0/aWNsZXMvcHg3d3Qx/a20xY2JheXE4ZTQ2/aXIuanBn" class="article-body-image-wrapper"&gt;&lt;img src="https://www.debug.school/images/g7Lp-JMEvt7QBMt9QRFPg3djRDDBbTYhxdADeexIPFk/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly93d3cu/ZGVidWcuc2Nob29s/L3VwbG9hZHMvYXJ0/aWNsZXMvcHg3d3Qx/a20xY2JheXE4ZTQ2/aXIuanBn" alt="SQL" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  5. Using .env Files for Cleaner Configuration
&lt;/h1&gt;

&lt;p&gt;Instead of piling up variables in Docker commands, store them in a file (example from Axial SQL). &lt;/p&gt;

&lt;p&gt;&lt;code&gt;config.env&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;    &lt;span class="py"&gt;MSSQL_PID&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Developer&lt;/span&gt;
    &lt;span class="py"&gt;ACCEPT_EULA&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Y&lt;/span&gt;
    &lt;span class="py"&gt;MSSQL_AGENT_ENABLED&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;True&lt;/span&gt;
    &lt;span class="py"&gt;MSSQL_DATA_DIR&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/var/opt/sqlserver/sqldata&lt;/span&gt;
    &lt;span class="py"&gt;MSSQL_LOG_DIR&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/var/opt/sqlserver/sqllog&lt;/span&gt;
    &lt;span class="py"&gt;MSSQL_BACKUP_DIR&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/var/opt/sqlserver/sqlbackups&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--env-file&lt;/span&gt; config.env &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;MSSQL_SA_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;MyP@ssw0rd! &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 1433:1433 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; sqlcontainer1 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; mcr.microsoft.com/mssql/server:2019-latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  6. Copy Files In and Out of Containers
&lt;/h1&gt;

&lt;p&gt;SQL Server containers support file copying (e.g., backups, scripts).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nb"&gt;cp &lt;/span&gt;myscript.sql sql1:/tmp/myscript.sql
docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; sql1 /opt/mssql-tools18/bin/sqlcmd &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-S&lt;/span&gt; localhost &lt;span class="nt"&gt;-U&lt;/span&gt; sa &lt;span class="nt"&gt;-P&lt;/span&gt; MyP@ssw0rd! &lt;span class="nt"&gt;-i&lt;/span&gt; /tmp/myscript.sql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  7. Advanced Customization with Dockerfile
&lt;/h1&gt;

&lt;p&gt;You can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Install extra tools&lt;/li&gt;
&lt;li&gt;  Add startup scripts&lt;/li&gt;
&lt;li&gt;  Change OS‑level settings&lt;/li&gt;
&lt;li&gt;  Customize collation or locale via environment variables at build time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example from SQL Server 2025 container customization: you can specify collation during container creation only.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"MSSQL_COLLATION=Latin1_General_BIN2"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  8. Starting SQL Server 2025 Preview Containers
&lt;/h1&gt;

&lt;p&gt;Microsoft’s official SQL Server 2025 preview image command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"ACCEPT_EULA=Y"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"MSSQL_SA_PASSWORD=&amp;lt;password&amp;gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"MSSQL_PID=Evaluation"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 1433:1433 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; sqlpreview &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--hostname&lt;/span&gt; sqlpreview &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; mcr.microsoft.com/mssql/server:2025-latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  9. Additional Notes &amp;amp; Best Practices
&lt;/h1&gt;

&lt;h3&gt;
  
  
  Non‑root containers
&lt;/h3&gt;

&lt;p&gt;SQL Server 2019+ containers run as non‑root for security.   &lt;/p&gt;

&lt;h3&gt;
  
  
  Encryption‑first ODBC tooling
&lt;/h3&gt;

&lt;p&gt;ODBC 18 enforces encryption by default when using &lt;code&gt;sqlcmd&lt;/code&gt; inside containers.    &lt;/p&gt;

&lt;h3&gt;
  
  
  Availability Groups in containers
&lt;/h3&gt;

&lt;p&gt;You can build clusterless Always On AG setups using Docker Desktop + scripts.    &lt;/p&gt;




&lt;h1&gt;
  
  
  ✅ Summary
&lt;/h1&gt;

&lt;p&gt;To configure and customize SQL Server Linux containers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Use &lt;strong&gt;environment variables&lt;/strong&gt; for edition, passwords, ports, collation, memory, and SQL Agent.&lt;/li&gt;
&lt;li&gt; Use &lt;strong&gt;Dockerfiles&lt;/strong&gt; to automate customizations.&lt;/li&gt;
&lt;li&gt; Use &lt;strong&gt;volumes&lt;/strong&gt; to persist SQL data.&lt;/li&gt;
&lt;li&gt; Use &lt;strong&gt;copy commands&lt;/strong&gt; or mount points for scripts and backups.&lt;/li&gt;
&lt;li&gt; Use &lt;strong&gt;Docker Compose&lt;/strong&gt; or &lt;strong&gt;env files&lt;/strong&gt; for multi‑container setups or cleaner configs.&lt;/li&gt;
&lt;li&gt; Consider SQL Server 2025 preview features and new image behaviors.&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;Ref: &lt;a href="https://learn.microsoft.com/en-nz/sql/sql-server/?view=sql-server-ver16" rel="noopener noreferrer"&gt;https://learn.microsoft.com/en-nz/sql/sql-server/?view=sql-server-ver16&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>sql</category>
      <category>container</category>
      <category>compose</category>
    </item>
  </channel>
</rss>
