mattintosh note

どこかのエンジニアモドキの備忘録

AWS Image Builder コンポーネントのコンテンツに設定ファイルをそのまま書いたら文字数オーバーした

ファイルの置き場に S3 が使えないので Nginx などの設定ファイルをヒアドキュメントで配置してゴールデンイメージを作ることになったんだけど色々なファイルを配置していたらエラーになった。コンポーネントのコンテンツは 16,000 文字の制限があるらしい。てっきり無限に書けるのかと思ってた。

さてさて困ったのでどうしようかと思ったけど gzip で圧縮して base64 にしたらいけるのでは?と思ってやってみたらできた。

元の nginx.conf はこんな感じ。

/etc/nginx/nginx.conf

# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user nginx;
worker_processes auto;
worker_rlimit_nofile 4096;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
    multi_accept on;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    log_format  ltsv  "time:$time_local"
                      "\thost:$remote_addr"
                      "\tforwardedfor:$http_x_forwarded_for"
                      "\treq:$request"
                      "\tstatus:$status"
                      "\tsize:$body_bytes_sent"
                      "\treferer:$http_referer"
                      "\tua:$http_user_agent"
                      "\treqtime:$request_time"
                      "\tcache:$upstream_http_x_cache"
                      "\truntime:$upstream_http_x_runtime"
                      "\tvhost:$host";

    access_log  /var/log/nginx/access.log  ltsv;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 4096;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

    server_tokens off;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
    add_header X-Content-Type-Options nosniff;
    add_header X-Frame-Options SAMEORIGIN always;
    add_header X-XSS-Protection "1; mode=block";

    server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        root         /Laravel/public;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;
    }
}

不要なところを適当に削って圧縮、Base64 化。

cat nginx.conf | grep -E -v -e '^#' -e '^( +)?$' -e '^ +#' | gzip | openssl enc -base64

2,266 文字が 987 文字になった。

H4sIANXlpGEAA31VW2vbMBR+z68QJhAYOE7XC5tNH8ZuFLZ1LH0odEUo8kktakua
Lmmz0f++I1u5NBfrobX0net3pC/egiHyQcjnYvCkzCMYqo3iYC1YwrxT62NTi0Y4
KtVc1EDOJu8vigEYowyt1QPJFsxk+JG1sbIWGOO+GGhRksx42SFj3BYDIXntSyCZ
tyazFTMQ/RpV+hps9mbMlZxjggVIZ8m/AcEVC0FEAndCSUtOJm/PihZsfO0EZZyD
dkTJYvAyqJzT0RUroXNlGubQkglJyGhooFEOKCtLQ1Ky2vpAyN3QiQawMc7qe5Ig
9seDdQkZtdH212hoHXPekuFMlUs6Wzqw1GLt6BzKoAbmYMD0RIiGIT9lD+iarHyf
Q+lPzJRQhq9kVOz1VDu7ICQJVedbtSdHkiW/XaWsy7c56LFdp8eP/HBNx52Ru3xN
4HGzjr888thnKP5ijzs09+Zvmc9fz+G4vWf53iR6u+tIjx3SsOux54xXaO21RVfW
0Ehme9yXxssuza5jBHpcF92kw9+kuzjhkVjbPtvdd9tB4xYKd6pzQIbL9tVvrfDE
wn/HNWqC9rY6hpVQs+Ue9gigWS0W0DKmPF5icnEe/ZYa51oxW9GGPdMw8Sg4AV2J
x/bKwPGVhGC4cRuhMy9hzlAbaDhamTOta8FZ0JBMcQcu7Vh9nWAraFCjcbmWpY4U
s8AL4tQjoBCpeTzGp0QrYCWqyNQZwV16Y5i0WhmXToF7I9ySJNhWilfr8vTk/PRi
MpkUq6RTP/ukgkLZgmgDtWJlQlj9xJZ2L/5t+lFJh/czvcHe0mvdaaJUVooD5dym
XwxrNnbTD98/X/+6+nr143iC2+k0/WlQIlq9JclJQVCi4XKG8vKYbBMRhTasWlis
Km7eTYrDwF2e3+fbaCRUYo2E0M25UcptBv2NGbaAOtN+hiPcWB0YWpz8ztxe8Jfh
P1merV/2BgAA

展開するときは openssl enc -d -base64gzip 形式に戻して gzip -d に渡す。 /etc/php-fpm.d/www.conf とかそのままコピペすると結構な文字数になるのでコメントアウト外したり空行削除して圧縮、base64 化すればそこそこ小さくなる。

複数行書式で Base64エンコードした文字列を貼り付ける。あとはコードパイプラインがよしなにやってくれる。

phases:
  - name: build
    steps:
      - name: InstallConfig
        action: ExecuteBash
        inputs:
          commands:
            - |
              set -- /etc/nginx/nginx.conf
              openssl enc -d -base64 <<'EOT' | gzip -d >${1}
              H4sIANXlpGEAA31VW2vbMBR+z68QJhAYOE7XC5tNH8ZuFLZ1LH0odEUo8kktakua
              Lmmz0f++I1u5NBfrobX0net3pC/egiHyQcjnYvCkzCMYqo3iYC1YwrxT62NTi0Y4
              KtVc1EDOJu8vigEYowyt1QPJFsxk+JG1sbIWGOO+GGhRksx42SFj3BYDIXntSyCZ
              tyazFTMQ/RpV+hps9mbMlZxjggVIZ8m/AcEVC0FEAndCSUtOJm/PihZsfO0EZZyD
              dkTJYvAyqJzT0RUroXNlGubQkglJyGhooFEOKCtLQ1Ky2vpAyN3QiQawMc7qe5Ig
              9seDdQkZtdH212hoHXPekuFMlUs6Wzqw1GLt6BzKoAbmYMD0RIiGIT9lD+iarHyf
              Q+lPzJRQhq9kVOz1VDu7ICQJVedbtSdHkiW/XaWsy7c56LFdp8eP/HBNx52Ru3xN
              4HGzjr888thnKP5ijzs09+Zvmc9fz+G4vWf53iR6u+tIjx3SsOux54xXaO21RVfW
              0Ehme9yXxssuza5jBHpcF92kw9+kuzjhkVjbPtvdd9tB4xYKd6pzQIbL9tVvrfDE
              wn/HNWqC9rY6hpVQs+Ue9gigWS0W0DKmPF5icnEe/ZYa51oxW9GGPdMw8Sg4AV2J
              x/bKwPGVhGC4cRuhMy9hzlAbaDhamTOta8FZ0JBMcQcu7Vh9nWAraFCjcbmWpY4U
              s8AL4tQjoBCpeTzGp0QrYCWqyNQZwV16Y5i0WhmXToF7I9ySJNhWilfr8vTk/PRi
              MpkUq6RTP/ukgkLZgmgDtWJlQlj9xJZ2L/5t+lFJh/czvcHe0mvdaaJUVooD5dym
              XwxrNnbTD98/X/+6+nr143iC2+k0/WlQIlq9JclJQVCi4XKG8vKYbBMRhTasWlis
              Km7eTYrDwF2e3+fbaCRUYo2E0M25UcptBv2NGbaAOtN+hiPcWB0YWpz8ztxe8Jfh
              P1merV/2BgAA
              EOT
            - |
              set -- /etc/nginx/default.d/php.conf
              openssl enc -d -base64 <<'EOT' | gzip -d >${1}
              H4sIALPlpGEAA52RX2vDIBTF3/Mp7oPQdKPp+8IY3WhpYevCmoc9jIlE0wiJytXQ
              lv357DNtmiyjT/NBvF5/R89RKi72IJs5MoVpV4Wryn4ZB6XOmJNawRQ+AvDD4YHm
              shQWSI0Spp0AkZYy3FrSTHHwFVjhoNksnDMWRqM4kDmEpClpVuqa56iVo7nGHUMu
              ODWonYZbOALj9r6hilaNcq+z/w/eefqGtyj0T/80BcNxOI2uxnekBXNmXbaV1JpS
              OmqYK6hUuYb3MLr21N1Nx51AEg8wqZzATBhHBaLG09XDA038ff6nrlRZWXMB7Tgf
              NgxZZYcCxz2AzcPLKknpYvU4X8+e5gCE66yuhE8WtXak85Gh9K9RrBIXdZJZuqSr
              9eIZSN9pTV8ElmmabH5lK3OqtLdbGXf4C1jrS29ykptq2CskF7QQjAuE10midwIF
              n9wfznH4FBUrm1/7AWUI0VuwAgAA
              EOT

何書いてあるかわからなくてもデコードすれば見れるし、EC2 インスタンスの中ではデコードされてるので AMI からインスタンス作って中入って確認すればいいんじゃないかな。