All Articles

distroless, cfn-lint

cfn-lint

cloudformation の lint ができる
リポジトリ

CircleCI で動かすために docker image 作って ecr public registry に入れてみた
以下 CircleCI で動かすまで手順

準備

AWS Console から Public ECR に上げるための Registry は登録しておく

# v2.1 系だと AWS Console の通りにコマンド打つとエラーになるかと思う
$ aws --version
aws-cli/2.2.24 Python/3.9.6 Darwin/20.3.0 source/x86_64 prompt/off

$ aws ecr get-login-password \
    --region <region> \
| docker login \
    --username AWS \
    --password-stdin <aws_account_id>.dkr.ecr.<region>.amazonaws.com

image build

リポジトリの最新 tag が v0.52.0 なのでそれで build する

$ docker build -t tt-cfn-lint .
$ docker tag tt-cfn-lint public.ecr.aws/q0z8a7x0/tt-cfn-lint:v0.52.0
$ docker push public.ecr.aws/q0z8a7x0/tt-cfn-lint:v0.52.0

CircleCI setting

version: 2.1

jobs:
  lint:
    docker:
      - image: public.ecr.aws/q0z8a7x0/tt-cfn-lint:v0.52.0
    steps:
      - checkout
      - run: cfn-lint */CloudFormation.yml

workflows:
  version: 2
  build:
    jobs:
      - lint

distroless docker image

distroless image ってなに

パッケージマネージャ、シェルなどが含まれない超軽量イメージ
なぜ使うかというとランタイムコンテナの中のものをその上で動かすアプリケーションが使うもののみに正確に制限するため CVE の警告と今使っている image の調整をする負担を減らせる

base は Debian10
v1.15 から kubernetes が取り入れている

go や rust などコンパイルしたバイナリを動かすには gcr.io/distroless/static を使えばいい(libc を使わない)
glibc ベースの最小限の Linux で構成されている
以下が含まれている

  • ca-certificates

    • https 通信するときに必要。このパッケージには SSL ベースのアプリケーションが SSL 接続時の認証で接続先 を確認するための CA 証明書の PEM ファイルが含まれている
      特に、Debian のインフラが使用する証明機関や Mozilla ブラウザに同梱の証明書 の証明機関も含まれている。
  • A /etc/passwd entry for a root user
  • A /tmp directory
  • tzdata

    • 世界中の各タイムゾーンに関するルールが適用されているデータファイルが含まれている

その他、libc が必要なアプリケーションは gcr.io/distroless/static を含む gcr.io/distroless/base を使う
以下が含まれている

  • glibc
  • libssl
  • openssl

set up

軽量image の alpine と比較してみる

$ docker pull gcr.io/distroless/static@sha256:c9320b754c2fa2cd2dea50993195f104a24f4c7ebe6e0297c6ddb40ce3679e7d 
$ docker pull alpine:3.14.0

実際のサイズ比較

alpine                                       3.14.0    d4ff818577bc   6 weeks ago     5.6MB
gcr.io/distroless/static                     <none>    91c813be4d6b   51 years ago    1.82MB

gcr.io/distroless/static は 2021/07/31 時点での latest から引っ張ってきた
できれば tag 運用してほしい.. -> latest を使い続けることで、セキュリティ対策になる。脆弱性があれば随時修正されるので。 image list

$ docker pull gcr.io/distroless/static@sha256:c9320b754c2fa2cd2dea50993195f104a24f4c7ebe6e0297c6ddb40ce3679e7d

その他

alpine は、muslとBusyBoxをベースとした Linuxディストリビューション。
Linuxディストリビューション とは、Linux カーネルとソフトウェアをまとめて使いやすくした配布方式。
musl は glibc(GNU C ライブラリ、GNUプロジェクトによる標準Cライブラリ) よりも高効率に動く標準Cライブラリとのこと。

go だとこんなこともある模様
多分、libsass が musl でコンパイルされているから go 側で呼んだときに困るみたいな話? go が libsass など外部ライブラリに対して、本来受けられるスタックサイズより大きいものを渡してしまうのが原因なのかなと。。

Next

data management 本読んでおきたい

参考