0

terraformの新機能なので、おそらくこの方法で動作するはずがありません。私はaws_s3_bucket_objectを使用してバケットにパッケージをアップロードしたいと思っています。これはアプリのデプロイの一部です。私は各デプロイメントのパッケージを変更しようとしています。古いバージョンを残したいと思います。その後、古いバージョンのオブジェクトを保存することはできますか?

resource "aws_s3_bucket_object" "object" { 
    bucket = "mybucket-app-versions" 
    key = "version01.zip" 
    source = "version01.zip" 
} 

しかし、今後の展開のためにこれを実行した後、私はversion02をアップロードしたいと思うでしょうし、version03などテラフォームは、新しいワン期待される動作と古いzipファイルを置き換えます。

しかし、古いバージョンを破壊しないようにテラフォームを作成する方法はありますか?これはここでサポートされているユースケースですか、これは私がどのようにterraformを使用するのではないのですか?テラフォームが私がここでやろうとしているようなことをする公式のサポートを持っていない場合、私は醜いハックでこれを強制したくありません。

もちろんS3のAPIをスクリプトで呼び出すこともできますが、これをこのアプリケーションの残りのテラフォーム定義で定義することは素晴らしいことです。

答えて

1

アプリケーション展開のためのテラフォームを使用して、推奨されるアプローチは、デプロイ段階からビルドステップを分離し、後者のみのためのテラフォームを使用することです。

ビルドステップの責任は、展開方法に応じて別のツールを使用して実装されます。アーティファクト(アーカイブ、ドッカーコンテナ、仮想マシンイメージなど)を生成し、その場所や識別子をTerraformに渡してデプロイします。

このようにビルドとデプロイを分離することで、新しいバージョンに問題がある場合に古いアーティファクト(再構築せずに)にロールバックするなど、より複雑な状況が可能になります。

単純なシナリオでは、Input Variablesを使用してアーティファクトの場所をTerraformに渡すことができます。例えば、ビルドプロセスはS3にzipファイルを記述し、あなたのような状況で、あなたはこのような変数を定義できます

variable "archive_name" { 
} 

そして、これは${var.archive_name}補間構文を使用して、それを必要とするものは何でもリソースに渡すことができます。特定のアーティファクトを展開するには、-varを使用してコマンドラインでその名前を渡します。

$ terraform apply -var="archive_name=version01.zip" 

一部の組織では、データストアのいくつかの種類の各アプリケーションの「現在」バージョンの記録を保持することを好む、などHashiCorp Consuldata sourceを使用してそれを読んでください。このアプローチは、Terraform自体に異常な引数を渡すことなく、この個別のデータストアを使用してビルドとデプロイの間でアーカイブ名を間接的に渡すことができるため、自動ビルドパイプラインで編成する方が簡単です。

1

現在、terraformに1つのaws_s3_bucket_objectを管理するように指示し、terraformはライフサイクル全体を処理します。つまり、変更がある場合はterraformもファイルを置き換えます。

あなたが探しているものはnull_resourceです。スクリプトを使用して、必要なファイルをアップロードするためにlocal-execプロビジョナを実行することができます。これにより、古いファイルは削除されません。これは、terraformによって直接管理されないためです。スクリプトを使用してAPIを呼び出すこともできますが、s3へのアップロードの全プロセスはまだterraform applyの手順に含まれています。ここで

null_resourceの概要:

resource "null_resource" "upload_to_s3" { 
    depends_on = ["<any resource that should already be created before upload>"] 
    ... 

    triggers = ["<A resource change that must have happened so terraform starts the upload>"] 

    provisioner "local-exec" { 
    command = "<command to upload local package to s3>" 
    } 
} 
関連する問題