web-dev-qa-db-ja.com

Terraformを使用してAmazon S3バケットにフォルダーを作成する方法

これを使用してAmazon S3にバケットを作成できました link

次のコードを使用してバケットを作成しました:

resource "aws_s3_bucket" "b" {
    bucket = "my_tf_test_bucket"
    acl    = "private"
}

バケット内にフォルダを作成したかったので、Folder1

S3オブジェクトを作成するための link が見つかりました。ただし、これには必須パラメーターsourceがあります。私の意図はS3バケット内にフォルダーを作成することなので、この値が何を持っているのかわかりません。

15
cmm user

MacまたはLinuxでterraformを実行するには、次のようにします。

resource "aws_s3_bucket_object" "folder1" {
    bucket = "${aws_s3_bucket.b.id}"
    acl    = "private"
    key    = "Folder1/"
    source = "/dev/null"
}

Windowsを使用している場合は、空のファイルを使用できます。

S3にフォルダーがないことについては注意を払っていますが、キープレフィックス(またはフォルダーと呼ばれる)のオブジェクトプレースホルダーがあると作業が楽になる操作がいくつかあります。たとえば、s3 syncのように。

40
PaulR

S3はフォルダーをサポートしていません。オブジェクトには、フォルダのように見えるスラッシュを含むプレフィックス名を付けることができますが、それはオブジェクト名の一部にすぎません。したがって、S3にはフォルダーのようなものがないため、terraformまたはその他のフォルダーを作成する方法はありません。

http://docs.aws.Amazon.com/AmazonS3/latest/dev/UsingMetadata.htmlhttp://docs.aws.Amazon.com/AWSImportExport/latest/DG/ ManipulatingS3KeyNames.html

ふりをしたい場合は、「Folder1 /」という名前のバケットにゼロバイトのオブジェクトを作成できますが、これは必須ではありません。 「Folder1/File1」のようなキー名でオブジェクトを作成するだけで機能します。

17
Karen B

古い答えですが、フォルダにキーを指定すると(まだ存在しない場合)、terraformは自動的にフォルダを作成します

terraform {
  backend "s3" {
    bucket  = "mysql-staging"
    key     = "rds-mysql-state/terraform.tfstate"
    region  = "us-west-2"
    encrypt = true
  }
}
2
Patrick

実際には、OSに依存せずに作成する標準的な方法があります。UIでネットワークを検査することで、次のようにコンテンツヘッダーが表示されます。 https://stackoverflow.com/users/1554386/ alastair-mccormack

また、S3は最近、UIから見えるフォルダーをサポートします。

だから、これはあなたがそれを達成する方法です:

resource "aws_s3_bucket_object" "base-folder" {
    bucket  = "${aws_s3_bucket.default.id}"
    acl     = "private"
    key     =  "${var.named_folder}/"
    content_type = "application/x-directory"
    kms_key_id = "key_arn_if_used"
}

末尾のスラッシュに注意してくださいそれ以外の場合は空のファイルが作成されます

上記はWindows OSで使用され、terraform s3_bucket_objectを使用してフォルダーを正常に作成しました。

1
Ilhicas

v0.12.8 は、これをネイティブにサポートするために_for_each_と組み合わせて使用​​できる新しいfileset()関数を導入します。

新機能:

lang/funcs:globパターンに一致する静的ローカルファイルを検索するための新しいファイルセット関数。 ( #2252

この関数の使用例は次のとおりです( here から):

_# Given the file structure from the initial issue:
# my-dir
#    |- file_1
#    |- dir_a
#    |     |- file_a_1
#    |     |- file_a_2
#    |- dir_b
#    |     |- file_b_1
#    |- dir_c
# And given the expected behavior of the base_s3_key prefix in the initial issue

resource "aws_s3_bucket_object" "example" {
  for_each = fileset(path.module, "my-dir/**/file_*")

  bucket = aws_s3_bucket.example.id
  key    = replace(each.value, "my-dir", "base_s3_key")
  source = each.value
}
_

この記事の執筆時点では、v0.12.8は1日前(2019-09-04にリリース)なので、 https://www.terraform.io/docs/providers/aws/r/s3_bucket_objectのドキュメント.html はまだ参照していません。それが意図的かどうかは定かではありません。


余談ですが、上記を使用する場合は、プロジェクトで_version.tf_を次のように更新/作成することを忘れないでください。

_terraform {
  required_version = ">= 0.12.8"
}
_
0
Ashutosh Jindal