プライベートなコンテナイメージを Amazon Lightsail コンテナサービスで使う

プライベートなイメージも使えますよ
2020.11.16

先日に続き、Amazon Lightsail コンテナサービスのネタです。アップデート記事は以下を参照ください。

上記のエントリーで「使用できるコンテナレジストリはパブリックコンテナレジストリのみ」と書いています。

「え、パブリックレジストリしか使えんのやったら、業務アプリとかアカンやん」

と思われたかもしれませんが、そのような場合は Lightsail コンテナサービスに直接 push することでプライベートなコンテナイメージも使用することが出来ます、というのが今回の記事になります。

Lightsail へのイメージ push の準備

以下のツールが必要になりますので、これらをインストールします。

  • AWS CLI v2.1.1 以降
    • AWS CLI v1 では Lightsail コンテナサービスへの push がサポートされていません
  • LightsailControl プラグイン

AWS CLI v2 インストール

まずは AWS CLI v2 をインストールします。以下、macOSの手順ですがその他 OS については公式ガイドを参考にしてください。

$ curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
$ sudo installer -pkg AWSCLIV2.pkg -target /

$ aws --version
aws-cli/2.1.1 Python/3.7.4 Darwin/19.6.0 exe/x86_64

LightsailControl プラグイン

LightsailControl プラグインをインストールします。こちらも macOS の手順ですのでその他 OS については公式ガイドを参考にしてください。

$ sudo curl "https://s3.us-west-2.amazonaws.com/lightsailctl/latest/darwin-amd64/lightsailctl" -o "/usr/local/bin/lightsailctl"
$ sudo chmod +x /usr/local/bin/lightsailctl
$ xattr -c /usr/local/bin/lightsailctl

IAM 権限

最低限、以下の IAM 権限があればイメージを push できます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "lightsail:CreateContainerServiceRegistryLogin",
                "lightsail:RegisterContainerImage"
            ],
            "Resource": "*"
        }
    ]
}

Lightsail にコンテナイメージを push

ローカルの Docker 環境にコンテナイメージを準備しておきます。

$ docker images lightsail-hello-world   
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
lightsail-hello-world   latest              4e96c574653c        2 minutes ago       899MB

イメージの push は aws lightsail push-container-image コマンドを使用します。

$ aws lightsail push-container-image ¥
    --region <Region> ¥
    --service-name <ContainerServiceName> ¥
    --label <ContainerImageLabel> ¥
    --image <LocalContainerImageName>:<ImageTag>

今回はコンテナサービス container-service-1lightsail-hello-world:latest イメージを push します。ラベル名は testlabel としました。

$ aws lightsail push-container-image ¥
    --region ap-northeast-1 ¥
    --service-name container-service-1 ¥
    --label testlabel ¥
    --image lightsail-hello-world:latest

bc153fd226de: Pushed 
c3ab11b5270a: Pushed 
431fc29f78ab: Pushed 
641e75738194: Pushed 
c4fc3bd6e3cb: Pushed 
5f03d9827383: Pushed 
6f7043721c9b: Pushed 
a933681cf349: Pushed 
f49d20b92dc8: Pushed 
fe342cfe5c83: Pushed 
630e4f1da707: Pushed 
9780f6d83e45: Pushed 
Digest: sha256:ae3a0a02024182d2279c0100953634f22e1b825edac387951f98ae75cb795834
Image "lightsail-hello-world:latest" registered.
Refer to this image as ":container-service-1.testlabel.1" in deployments.

Lightsail コンテナサービスにストアされるイメージ名は <コンテナサービス名>.<ラベル名>.<バージョン番号> という形になります。イメージが push されると [イメージ] タブが表示されるようになります。

Lightsail コンテナサービスにストアされているイメージを使用する場合は、保存したイメージを選択 をクリックして選択するだけです。

その他、必要なパラメータを指定し 保存とデプロイ でデプロイします。

$ curl https://container-service-1.XXXXXXXXXXXXX.ap-northeast-1.cs.amazonlightsail.com/
{"message": "Hello Flask API World!"}

パブリックコンテナレジストリを使わずに Lightsail コンテナサービスでコンテナを動かすことが出来ましたね!検証は以上です。

さいごに

あくまで「コンテナレジストリ」としてはパブリックコンテナレジストリのみがサポートされているのであって、プライベートなコンテナイメージを利用することは可能ですよ! ということをお伝えしたく記事にしました。

ECR などプライベートコンテナレジストリのサポートは今後のアップデートに期待しつつ、個人的には直接 Lightsail にイメージを push して利用できるのもシンプルで Lightsail らしい使い方かな、と思います。

以上!大阪オフィスの丸毛(@marumo1981)でした!