Amazon web services 如何轻松格式化AWS CLI命令

Amazon web services 如何轻松格式化AWS CLI命令,amazon-web-services,aws-cli,emr,amazon-emr,Amazon Web Services,Aws Cli,Emr,Amazon Emr,我正在使用AWS EMR进行大量工作,当您通过AWS管理控制台构建EMR群集时,可以单击按钮导出创建EMR群集的AWS CLI命令 然后,它将为您提供一个大的CLI命令,该命令不会以任何方式进行格式化,即,如果您复制并粘贴该命令,则所有命令都将显示在一行中 我正在使用这些由其他人创建的EMR CLI命令,使用AWS SDK Boto3库在Python中创建EMR集群,也就是说,我正在查看CLI命令以获取所有配置详细信息。AWS管理控制台UI上提供了一些配置详细信息,但并非所有配置详细信息,因

我正在使用AWS EMR进行大量工作,当您通过AWS管理控制台构建EMR群集时,可以单击按钮导出创建EMR群集的AWS CLI命令

然后,它将为您提供一个大的CLI命令,该命令不会以任何方式进行格式化,即,如果您复制并粘贴该命令,则所有命令都将显示在一行中

我正在使用这些由其他人创建的EMR CLI命令,使用AWS SDK Boto3库在Python中创建EMR集群,也就是说,我正在查看CLI命令以获取所有配置详细信息。AWS管理控制台UI上提供了一些配置详细信息,但并非所有配置详细信息,因此我更容易使用您可以导出的CLI命令

但是,AWS CLI命令很难读取,因为它没有格式化。是否在线提供类似于的AWS CLI命令格式化程序?


我可以使用的另一个解决方案是克隆EMR群集,并在AWS管理控制台上通过EMR群集创建屏幕获取所有配置详细信息,但我仍然很好奇是否可以格式化CLI命令并以这种方式执行。能够格式化导出的CLI命令的另一个好处是,我可以将其放在一个汇合页面上进行文档编制。

下面是一些快速python代码:

导入shlex
导入json
进口稀土
def格式_命令(命令):
tokens=shlex.split(命令)
格式化=“”
对于令牌中的令牌:
#旗帜得到一个新的行
如果令牌.startswith(“--”):
格式化+='\\\n'
#JSON数据
如果('[','{')中的标记[0]:
json_data=json.loads(令牌)
data=json.dumps(json_数据,缩进=4)。替换('\n','\n'))
格式化+=“{}”。格式(数据)
#引号标记(当它包含空格时)
elif重新匹配('\s',标记):
格式化+=“{}”。格式(标记)
#剩余代币的简单打印
其他:
格式化+=标记+“”
返回格式
示例=“aws emr创建集群——应用程序名称=spark Name=ganglia Name=hadoop--tags'Project=MyProj'--ec2属性“{”KeyName:“emr密钥”,“AdditionalSlaveSecurityGroup:”[“sg-3822994c”,“sg-ccc76987”,“InstanceProfile:“emr_ec2_默认角色”,“ServiceAccessSecurityGroup:“sg-60832c2b”,“SubnetId:“subnet-3c76ee33”,“子网””EmrManagedSlaveSecurityGroup:“sg-dd832c96”,“EmrManagedMasterSecurityGroup:“sg-b4923dff”,“AdditionalMasterSecurityGroups:”[“sg-382299C”,“sg-ccc76987”]}'--服务角色EMR_默认角色--发布标签EMR-5.14.0--名称“测试群集”---实例组[{“InstanceCount”:1,“EBSCOConfiguration:{“EBSBlockDeviceConfig”:[{“卷规格化”:{”SizeInGB:32,“VolumeType”:“gp2”},“VolumeSpeeringInstance”:1}]},“InstanceGroupType”:“MASTER”,“InstanceType”:“m4.xlarge”,“Name”:“MASTER”},{“InstanceCount”:1,“EBSCOConfiguration”:{“EbsBlockDeviceConfigs”:[{“VolumeSpecification”:“{”SizeInGB:32,“VolumeType”:“XL2”},“VolumeSpeeringInstanceType”:“CORE”,“InstanceType”:“m4.arge”,“Name”:“CORE”}]'--configurations'[{“Classification”:“spark defaults”,“Properties”:{“spark.sql.avro.compression.codec”:“snappy”,“spark.eventLog.enabled”:“true”,“spark.dynamicAllocation.enabled”:“false”},“configurations”:[]},{“Classification”:“spark env”,“Properties”:{},“configurations”:[{“Classification”:“导出”,“Properties”:{“spark_守护进程内存”:“4g”},”配置“:[]}]]'--缩小行为在任务完成时终止--区域us-east-1”“”
打印(格式化_命令(示例))
输出如下所示:

aws emr create-cluster \
    --applications Name=spark Name=ganglia Name=hadoop \
    --tags Project=MyProj \
    --ec2-attributes '{
        "ServiceAccessSecurityGroup": "sg-60832c2b", 
        "InstanceProfile": "EMR_EC2_DefaultRole", 
        "EmrManagedMasterSecurityGroup": "sg-b4923dff", 
        "KeyName": "emr-key", 
        "SubnetId": "subnet-3c76ee33", 
        "AdditionalMasterSecurityGroups": [
            "sg-3822994c", 
            "sg-ccc76987"
        ], 
        "AdditionalSlaveSecurityGroups": [
            "sg-3822994c", 
            "sg-ccc76987"
        ], 
        "EmrManagedSlaveSecurityGroup": "sg-dd832c96"
    }' \
    --service-role EMR_DefaultRole \
    --release-label emr-5.14.0 \
    --name Test Cluster \
    --instance-groups '[
        {
            "EbsConfiguration": {
                "EbsBlockDeviceConfigs": [
                    {
                        "VolumeSpecification": {
                            "VolumeType": "gp2", 
                            "SizeInGB": 32
                        }, 
                        "VolumesPerInstance": 1
                    }
                ]
            }, 
            "InstanceCount": 1, 
            "Name": "Master", 
            "InstanceType": "m4.xlarge", 
            "InstanceGroupType": "MASTER"
        }, 
        {
            "EbsConfiguration": {
                "EbsBlockDeviceConfigs": [
                    {
                        "VolumeSpecification": {
                            "VolumeType": "gp2", 
                            "SizeInGB": 32
                        }, 
                        "VolumesPerInstance": 1
                    }
                ]
            }, 
            "InstanceCount": 1, 
            "Name": "CORE", 
            "InstanceType": "m4.xlarge", 
            "InstanceGroupType": "CORE"
        }
    ]' \
    --configurations '[
        {
            "Properties": {
                "spark.eventLog.enabled": "true", 
                "spark.dynamicAllocation.enabled": "false", 
                "spark.sql.avro.compression.codec": "snappy"
            }, 
            "Classification": "spark-defaults", 
            "Configurations": []
        }, 
        {
            "Properties": {}, 
            "Classification": "spark-env", 
            "Configurations": [
                {
                    "Properties": {
                        "SPARK_DAEMON_MEMORY": "4g"
                    }, 
                    "Classification": "export", 
                    "Configurations": []
                }
            ]
        }
    ]' \
    --scale-down-behavior TERMINATE_AT_TASK_COMPLETION \
    --region us-east-1 

这是一个完美的人,谢谢分享。对于任何使用它的人来说,它与Python2.7.14而不是Python3一起工作。我还做了一个“查找和替换”在记事本++中删除\个字符。谢谢Ryan Widmaier。我把的放进去,所以理论上如果你把它倒进一个shell中,它会运行,尽管我没有实际测试它。另外,为python3更新,这实际上只是打印调用。是有意义的,是的,我注意到这只是打印调用,只是想澄清一下,以防有人被删除使用这个不懂Python的人(愚蠢的Python 2.7-3更改…)