Подтвердить что ты не робот

Создать папку внутри ведра S3 с помощью Cloudformation

Я могу создать ведро S3 с использованием cloudformation, но хотел бы создать папку внутри ведра S3.. вроде

<mybucket>--><myfolder>

Пожалуйста, дайте мне знать шаблон, который будет использоваться для создания папки внутри ведра... оба должны быть созданы в Sametime...

Я использую AWS лямбда ниже

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

Ответ 1

AWS не предоставляет официальный ресурс CloudFormation для создания объектов в ведре S3. Тем не менее, вы можете создать Lambda-backed Custom Resource для выполнения этой функции с помощью AWS SDK, и фактически gilt/cloudformation-helpers Репозиторий GitHub предоставляет готовый пользовательский ресурс, который делает именно это.

Как и в любой настройке Custom Resource, это немного многословно, так как вам нужно сначала развернуть функции 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/"
  }
},

Вы также можете использовать один и тот же пользовательский ресурс для записи строкового объекта S3 путем добавления параметра Body в дополнение к Bucket и Key (см. документы).

Ответ 2

Это невозможно с использованием шаблона AWS CloudFormation.

Следует отметить, что папки на самом деле не существуют в Amazon S3. Вместо этого путь объекта добавляется к имени (key) объекта.

Итак, файл bar.txt, хранящийся в папке с именем foo, фактически хранится с ключом: foo/bar.txt

Вы также можете скопировать файлы в папку, которая не существует, и папка будет автоматически создана (что на самом деле не так, поскольку сама папка не существует). Однако консоль управления обеспечит появление такой папки, и путь подскажет, что она хранится в такой папке.

Нижняя строка: Нет необходимости предварительно создавать папку. Просто используйте его, как будто он уже там.

Ответ 3

Мы не можем (по крайней мере, на данный момент) создать подпапку внутри корзины s3.

Вы можете попробовать использовать следующую команду:

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

А затем попробуйте перечислить все папки внутри корзины, используя команду:

aws s3 ls s3://yavdhesh-bucket

И вы заметите, что подпапка не была создана.

есть только один способ создать подпапку, то есть создать/скопировать файл в несуществующую подпапку или подпапку (относительно корзины)

Например,

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

Теперь, если вы перечислите файлы, присутствующие в вашей подпапке, это должно работать.

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

он должен перечислить все файлы, присутствующие в этой подпапке.

enter image description here

Надеюсь, поможет.