/aws-cdk-docker-assets-test

[aws-cdk-study] Test stack of AWS CDK DockerImageAssets.

Primary LanguageTypeScript

AWS CDKによるDocker Image Assets Deployのテストプロジェクト

AWS CDKでは, 各種AWSリソースと合わせて,コンテナイメージをデプロイすることができる.

ここでは,コンテナイメージがどのリポジトリにpushされるかを調べるため,動作テストを行った.

CDKは,2020/08/17時点での最新バージョンであるver1.59.0を使用した.

DockerImageAssets関連の実装は,experimental and under active developmentとのことで, 今後のアップデートで破壊的変更が行われる可能性がある.

利用する場合は,最新情報を確認する必要がある.

リポジトリ名を指定しない場合

aws-ecr-assetsを用いた最もシンプルな実装では,下記のような実装となる.

import assets = require('@aws-cdk/aws-ecr-assets');

const imageAsset = new assets.DockerImageAsset(this, `docker-image`, {
    directory: path.join(__dirname, 'containers'), // Dockerfileがあるパスを指定する.
});

この場合,aws-cdk/assetsというECRリポジトリが自動的に作成され,そこにビルドされたイメージがpushされた.

イメージのタグは,CDKが自動的に採番したものになった.

リポジトリ名を指定しない場合のDocker Image

リポジトリ名を指定する場合

特定のECRリポジトリにpushしたい場合も多いと思う.その場合は,StackSynthesizeraddDockerImageAssetを用いると実現できた.

export class AssetsStack extends cdk.Stack {

    constructor(scope: cdk.Construct, id: string, props: AssetsStackProps) {
        super(scope, id, props);
        //======================================================================
        // Docker image assets - repository specification
        //======================================================================
        this.synthesizer.addDockerImageAsset({
            directoryName: path.join(__dirname, 'containers'), // Dockerfileがあるディレクトリを指定
            sourceHash: "イメージタグ名を指定",
            repositoryName: "リポジトリ名を指定"
        });
        //======================================================================
        // Docker image assets - repository specification end
        //======================================================================

        //======================================================================
        // NG PATTERN Docker image assets - repository specification
        //======================================================================
        // this.synthesizer.addDockerImageAsset({
        //     directoryName: path.join(__dirname, 'containers'),
        //     sourceHash: props.imageHash,
        //     // Failed to deploy. Cannot use string value from ssm parameter store.
        //     repositoryName: reposNameFromSSM
        // });
        // //======================================================================
        // NG PATTERN Docker image assets - repository specification end
        //======================================================================    
    }
}

注意点は,

  • リポジトリ名は,SSMパラメータストア等からデプロイ時に取得する実装にはできない.
  • sourceHashに指定するイメージタグ名を変更しない場合は,Dockerfileを変更しても新たなイメージがpushされない.

という点である.

特に2点目は注意が必要である.

このプロジェクトでは,CI/CDパイプラインでgitコミットハッシュからイメージタグ名を決定し,

それをcdk context valueとして与えるようにして,毎回新しいイメージが生成されるようにした.

リポジトリ名を指定した場合のDocker Image

以上.