CloudFormation 中如何派生 S3 存储桶名称?

Posted

技术标签:

【中文标题】CloudFormation 中如何派生 S3 存储桶名称?【英文标题】:How is S3 bucket name being derived in CloudFormation? 【发布时间】:2022-01-23 20:01:54 【问题描述】:

我有这个创建存储桶的 cloudformation 脚本 template.js。我有点不确定存储桶名称是如何组装的。

假设我的堆栈名称是my-service,我将桶名称创建为my-service-s3bucket-1p3s4szy5bomf

    我想知道这个名字是怎么来的 我也想在最后摆脱那个arn。 -1p3s4szy5bomf 我可以跳过最后的输出吗,不确定它们是做什么的

template.js 中的代码

var stackTemplate = 

    "AWSTemplateFormatVersion": "2010-09-09",
    "Description": "with S3",
    "Resources": 
        "S3Bucket": 
            "Type": "AWS::S3::Bucket",
            "DeletionPolicy": "Retain",
            "Properties": ,
            "Metadata": 
                "AWS::CloudFormation::Designer": 
                    "id": "bba483af-4ae6-4d3d-b37d-435f66c42e44"
                
            
        ,
        "S3BucketAccessPolicy": 
            "Type": "AWS::IAM::Policy",
            "Properties": 
                "PolicyName": "S3BucketAccessPolicy",
                "Roles": [
                    
                        "Ref": "IAMServiceRole"
                    
                ],
                "PolicyDocument": 
                    "Version": "2012-10-17",
                    "Statement": [
                        
                            "Effect": "Allow",
                            "Action": [
                                "s3:DeleteObject",
                                "s3:GetObject",
                                "s3:PutObject",
                                "s3:PutObjectAcl",
                                "s3:List*"
                            ],
                            "Resource": [
                                
                                    "Fn::Sub": [
                                        "$S3BucketArn",
                                        
                                            "S3BucketArn": 
                                                "Fn::GetAtt": ["S3Bucket", "Arn"]
                                            
                                        
                                    ]
                                ,
                                
                                    "Fn::Sub": [
                                        "$S3BucketArn/*",
                                        
                                            "S3BucketArn": 
                                                "Fn::GetAtt": ["S3Bucket", "Arn"]
                                            
                                        
                                    ]
                                
                            ]
                        
                    ]
                
            
        
    ,
    "Outputs": 
        "s3Bucket": 
            "Description": "The created S3 bucket.",
            "Value": 
                "Ref": "S3Bucket"
            ,
            "Export": 
                "Name": 
                    "Fn::Sub": "$AWS::StackName-S3Bucket"
                
            
        ,
        "s3BucketArn": 
            "Description": "The ARN of the created S3 bucket.",
            "Value": 
                "Fn::GetAtt": ["S3Bucket", "Arn"]
            ,
            "Export": 
                "Name": 
                    "Fn::Sub": "$AWS::StackName-S3BucketArn"
                
            
        
    
;

stackUtils.assembleStackTemplate(stackTemplate, module);

【问题讨论】:

【参考方案1】:
I want to know how this name was derived

如果您没有为存储桶指定名称,CloudFormation 会根据 $name-of-stack-s3bucket-$generatedId 模式生成一个新名称 来自文档https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3-bucket.html 桶名 存储桶的名称。如果您不指定名称,AWS CloudFormation 会生成一个唯一 ID 并将该 ID 用作存储桶名称。

I also want to get rid of that arn at the end. -1p3s4szy5bomf

您可以为您的存储桶指定一个名称,但 AWS 建议让它为空以生成一个新存储桶,以避免通过 CloudFormation 示例创建具有相同名称(stackset...):

"Resources": 
        "S3Bucket": 
            "Type": "AWS::S3::Bucket",
            "DeletionPolicy": "Retain",
            "Properties": 
               "BucketName": "DesiredNameOfBucket" <== 
                ,
            "Metadata": 
                "AWS::CloudFormation::Designer": 
                    "id": "bba483af-4ae6-4d3d-b37d-435f66c42e44"
                
            
        ,

Can I skip Outputs at the end, Not sure what they do

它用于创建存储桶的信息、名称和 ARN,如果需要,可以从模板中删除 Outputs 部分

【讨论】:

伟大的见解。我不想使用自动生成的名称 bcz 如果最后的唯一 ID 更改我的代码会中断 这意味着您必须在您的模板中指定一个名称,我将更改我的答案以提供代码 完成@Ajeetkumar 将运行并更新您 好的@Ajeetkumar,如果它解决了您的问题,您可以投票并接受问题,否则请告诉我

以上是关于CloudFormation 中如何派生 S3 存储桶名称?的主要内容,如果未能解决你的问题,请参考以下文章

在同一个 Cloudformation 堆栈中连接 Athena 和 S3

如何使用 cloudformation 为 S3 存储桶设置半随机名称

CloudFormation 模板设置 S3 存储桶默认加密 [重复]

如何检查 CloudFormation 脚本中是不是已存在特定资源

将对象上传到 S3 存储桶时如何触发 AWS Cloudformation 堆栈的更新?

如何在存储桶名称中使用变量 AWS Cloudformation