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 ブラウザに同梱の証明書 の証明機関も含まれている。
- https 通信するときに必要。このパッケージには SSL ベースのアプリケーションが SSL 接続時の認証で接続先 を確認するための CA 証明書の PEM ファイルが含まれている
- 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 本読んでおきたい