web-dev-qa-db-ja.com

Cloudformationを使用してS3バケット内にフォルダーを作成する

Cloudformationを使用してS3バケットを作成できますが、S3バケット内にフォルダーを作成したいです。

<mybucket>--><myfolder>

バケット内にフォルダを作成するために使用するテンプレートを教えてください...両方を同時に作成する必要があります...

以下のようにAWSラムダを使用しています

stackname = 'myStack'
client = boto3.client('cloudformation')
response = client.create_stack(
    StackName= (stackname),
    TemplateURL= 'https://s3.amazonaws.com/<myS3bucket>/<myfolder>/nestedstack.json',
    Parameters=<params>
)
20
shiv455

AWSは、S3バケット内にオブジェクトを作成するための公式のCloudFormationリソースを提供していません。ただし、AWS SDKを使用してこの機能を実行するために Lambda-backed Custom Resource を作成できます。実際、 gilt/cloudformation-helpers GitHubリポジトリは、 -まさにこれを行うシェルフカスタムリソース。

最初にLambda関数とIAMアクセス許可をデプロイする必要があるため、カスタムリソースのセットアップは少し冗長です。次に、スタックテンプレートでカスタムリソースとして参照します。

まず、Lambda::Functionおよび関連するIAM::Roleスタックテンプレートへのリソース:

"S3PutObjectFunctionRole": {
  "Type": "AWS::IAM::Role",
  "Properties": {
    "AssumeRolePolicyDocument": {
      "Version" : "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Service": [ "lambda.amazonaws.com" ]
          },
          "Action": [ "sts:AssumeRole" ]
        }
      ]
    },
    "ManagedPolicyArns": [
      { "Ref": "RoleBasePolicy" }
    ],
    "Policies": [
      {
        "PolicyName": "S3Writer",
        "PolicyDocument": {
          "Version" : "2012-10-17",
          "Statement": [
            {
              "Effect": "Allow",
              "Action": [
                "s3:DeleteObject",
                "s3:ListBucket",
                "s3:PutObject"
              ],
              "Resource": "*"
            }
          ]
        }
      }
    ]
  }
},
"S3PutObjectFunction": {
  "Type": "AWS::Lambda::Function",
  "Properties": {
    "Code": {
      "S3Bucket": "com.gilt.public.backoffice",
      "S3Key": "lambda_functions/cloudformation-helpers.Zip"
    },
    "Description": "Used to put objects into S3.",
    "Handler": "aws/s3.putObject",
    "Role": {"Fn::GetAtt" : [ "S3PutObjectFunctionRole", "Arn" ] },
    "Runtime": "nodejs",
    "Timeout": 30
  },
  "DependsOn": [
    "S3PutObjectFunctionRole"
  ]
},

次に、Lambda関数をカスタムリソースとして使用して、S3オブジェクトを作成できます。

"MyFolder": {
  "Type": "Custom::S3PutObject",
  "Properties": {
    "ServiceToken": { "Fn::GetAtt" : ["S3PutObjectFunction", "Arn"] },
    "Bucket": "mybucket",
    "Key": "myfolder/"
  }
},

BodyBucketに加えてKeyパラメーターを追加することで、同じカスタムリソースを使用して文字列ベースのS3オブジェクトを作成することもできます( docs )。

18
wjordan

AWS CloudFormationテンプレートを使用してこれを行うことはできません。

フォルダは実際にはAmazon S3に存在しないであることに注意してください。代わりに、オブジェクトのパスがオブジェクトの名前(key)の前に追加されます。

したがって、ファイルbar.txtは、fooという名前のフォルダーに保存され、実際には次のキーで保存されます:foo/bar.txt

存在しないフォルダーにファイルをコピーすることもできます。フォルダーは自動的に作成されます(フォルダー自体が存在しないため、実際にはそうではありません)。ただし、管理コンソールはそのようなフォルダーの外観を提供し、パスはそのようなフォルダーに格納されていることを示します。

下の行:フォルダーを事前に作成する必要はありません。既に存在するかのように使用します。

14
John Rotenstein

(少なくとも現時点では)s3バケット内にサブフォルダーを作成することはできません。

次のコマンドを使用して試すことができます:

 aws s3 mb s3://yavdhesh-bucket/inside-folder

そして、コマンドを使用してバケット内のすべてのフォルダーをリストしようとします:

aws s3 ls s3://yavdhesh-bucket

そして、サブフォルダーが作成されていないことがわかります。

サブフォルダーを作成する方法は1つしかありません。つまり、存在しないサブフォルダーまたはサブディレクトリ内にファイルを作成/コピーします(バケットに関して)。

例えば、

aws s3 cp demo.txt s3://yavdhesh-bucket/inside-folder/

これで、サブフォルダー内に存在するファイルを一覧表示すると、機能するはずです。

 aws s3 ls s3://yavdhesh-bucket/inside-folder/

このサブフォルダにあるすべてのファイルをリストする必要があります。

enter image description here

それが役に立てば幸い。

2