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>
)
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/"
}
},
Body
とBucket
に加えてKey
パラメーターを追加することで、同じカスタムリソースを使用して文字列ベースのS3オブジェクトを作成することもできます( docs )。
AWS CloudFormationテンプレートを使用してこれを行うことはできません。
フォルダは実際にはAmazon S3に存在しないであることに注意してください。代わりに、オブジェクトのパスがオブジェクトの名前(key
)の前に追加されます。
したがって、ファイルbar.txt
は、foo
という名前のフォルダーに保存され、実際には次のキーで保存されます:foo/bar.txt
存在しないフォルダーにファイルをコピーすることもできます。フォルダーは自動的に作成されます(フォルダー自体が存在しないため、実際にはそうではありません)。ただし、管理コンソールはそのようなフォルダーの外観を提供し、パスはそのようなフォルダーに格納されていることを示します。
下の行:フォルダーを事前に作成する必要はありません。既に存在するかのように使用します。
(少なくとも現時点では)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/
このサブフォルダにあるすべてのファイルをリストする必要があります。
それが役に立てば幸い。