LoginSignup
1
1

EC2内で立ち上げるDockerでMySQL GPGキーの永続的な自動更新

Posted at

現象

下記DockerfileでMySQLのDBコンテナ作成時に、エラーが出る。

Dockerfile-Mysql
FROM mysql:8.0-debian

RUN apt-get update && \
    apt-get install -y procps && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

Reading package lists...
[91mW: GPG error: http://repo.mysql.com/apt/debian bullseye InRelease: The following signatures were invalid: EXPKEYSIG 467B942D3A79BD29 MySQL Release Engineering mysql-build@oss.oracle.com
E: The repository 'http://repo.mysql.com/apt/debian bullseye InRelease' is not signed.

つまり、署名が無効となっている、ということ。

原因

aptリポジトリの公開鍵が期限切れまたは無効になっている。
この問題は通常、外部リポジトリの鍵が更新されると発生する。

https://keyserver.ubuntu.com/
でエラーメッセージの「467B942D3A79BD29」を検索
image.png

2023-12-14T15:39:35Z
で期限切れしていることが分かる。
image.png

やりたいこと

EC2はコスト削減のためLambdaとEventBrigeを利用して、定時刻に自動的に停止、起動をしている。
EC2起動の際に、自動でshを起動させてDockerのimageとcontainerを削除して作り直している。
この仕組みの中で、MySQLの公開鍵を更新したい。
さらに、再度期限切れした時に対応しなくていいように、永続的な更新が出来るようにしたい。

対策

shを作成し、Dockerfileにコマンドを追加して、MySQLの公開鍵を更新する。

  • update-mysql-key.sh

MySQLは
https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
https://repo.mysql.com/RPM-GPG-KEY-mysql-2023
で公開鍵を提供してくれているようだが、2022や2023の部分を、可変で取得したい。
ここを可変で、「今年」にすることで、永続的に公開鍵を更新してくれるはず。

update-mysql-key.sh
#!/bin/bash
set -eux
CURRENT_YEAR=$(date +"%Y")
wget https://repo.mysql.com/RPM-GPG-KEY-mysql-$CURRENT_YEAR -O- | apt-key add -
  • Dockerfile-Mysql
    DBコンテナはDockerfile-Mysqlで作っているので、それを修正
Dockerfile-Mysql
FROM mysql:8.0-debian

# MySQLのAPTリポジトリを一時的にコメントアウト
RUN sed -i '/repo.mysql.com/s/^/#/' /etc/apt/sources.list.d/mysql.list

# 必要なパッケージをインストール
RUN apt-get update && \
    apt-get install -y wget gnupg procps && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# スクリプトをコンテナにコピー
COPY update-mysql-key.sh /update-mysql-key.sh

# スクリプトを実行してMySQLの公開鍵を更新
RUN chmod +x /update-mysql-key.sh && \
    /update-mysql-key.sh

# MySQLのAPTリポジトリのコメントアウトを解除
RUN sed -i '/repo.mysql.com/s/^#//' /etc/apt/sources.list.d/mysql.list

# 再びapt-get updateを実行(エラーが出るかもしれませんが、無視して大丈夫です)
RUN apt-get update || true

説明

1.公開鍵の更新前
  aptリポジトリの公開鍵が古くなっているため、apt-get updateを実行すると、リポジトリの信頼性を確認できず、エラーが発生してしまう。
2.一時的な無効化
  エラーを避けるため、まずリポジトリをコメントアウトで無効にし、その他の必要なパッケージ(例えば、wgetやgnupg)をインストールする。
3.公開鍵の更新
  必要なツールがインストールされたら、スクリプトを実行して公開鍵を更新。
4.リポジトリの再有効化
  公開鍵が更新された後、リポジトリをコメントアウトを解除して再度有効にし、通常通りapt-get updateを実行してシステムを更新する。

===
aptリポジトリの公開鍵を更新する必要があるのは、aptがリポジトリからパッケージを安全にダウンロードし、それらが信頼できるソースから来ていることを保証するため。
公開鍵は、リポジトリからのパッケージが改ざんされていないことを確認するために使用される。
Dockerfileの中でMySQLのaptリポジトリを一時的に無効にする(コメントアウトする)手順は、リポジトリの公開鍵が古くなっていて、apt-get update時にエラーを引き起こす場合に有用。
一時的にリポジトリを無効にするのは、公開鍵の問題を回避して、その他の必要なパッケージを安全にインストールするための一時的な措置であり、公開鍵が更新されれば、リポジトリは再び正常に機能するようになる。

注意

これは、
rpm-gpg-key-mysql-今年
で公開鍵が提供されるのであればうまく動くはず。
来年になってもちゃんと動くか確認したい。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1