Terraform AWS& EMR运行:VPC销毁问题

时间:2018-04-20 11:39:47

标签: amazon-web-services emr terraform

我有一个Terraform项目,部署VPC,存储桶,lambda和数据库。 我的一个lambda使用boto3 Python lib创建了一个EMR集群。

s3 = boto3.client('s3')
session = boto3.session.Session()
client = session.client('emr', region_name=os.environ['region'])
job_id = client.run_job_flow(
            Name=os.environ['emr_name'],
            LogUri=os.environ['log_dir'],
            Instances={
                'MasterInstanceType': os.environ['master_instance'],
                'SlaveInstanceType': os.environ['slave_instance'],
                'InstanceCount': int(os.environ['slave_instances_count']),
                'Ec2SubnetId': os.environ['ec2_subnet_id']
            },
            ReleaseLabel='emr-5.13.0',
            Applications = [
                {'Name': 'Hadoop'},
                {'Name': 'Hive'},
                {'Name': 'Spark'}
            ],
            Steps=[
              my steps...
            ],
            BootstrapActions=[
                 ...
            ],
            ServiceRole='EMR_DefaultRole',
            JobFlowRole='EMR_EC2_DefaultRole',
            VisibleToAllUsers=True
        )

一切顺利,我很满意。

但是当我选择terraform destroy命令时,它无法删除创建的VPC Terraform(超时失败)。

我想这是因为为EMR运行创建了2个安全组。 Terraform不知道它们因此无法删除VPC,因为2 SG在此VPC中。

看一下AWS Web控制台,我可以看到2 SG:

sg-xxxxxxx
ElasticMapReduce-slave
eouti-vpc
Slave group for Elastic MapReduce created on <date>

sg-xxxxxxx
ElasticMapReduce-master
eouti-vpc
Master group for Elastic MapReduce created on <date>

我该如何解决? Terraform应该创建这些SG吗?你有什么建议吗?

干杯

1 个答案:

答案 0 :(得分:1)

在构建与其他组件接口的Terraform时(例如使用直接API调用或其他Terraform与terraform_remote_state运行共享信息),您必须了解不同组件之间的依赖关系。确定分离所属的是一门艺术,就像编写其他类型的软件一样。

documentation for run_job_flow(**kwargs)中,您可以传递几种类型的安全组:

'EmrManagedMasterSecurityGroup': 'string',
'EmrManagedSlaveSecurityGroup': 'string',
'ServiceAccessSecurityGroup': 'string',
'AdditionalMasterSecurityGroups': [
    'string',
],
'AdditionalSlaveSecurityGroups': [
    'string',
]

我现在不确定如何为您创建这些安全组(文档不提及创建临时安全组,如果他们这样做,那么他们会留下奇怪的意思之后会徘徊),但在Terraform中完成所有网络,然后output这些ID供Lambda使用似乎合乎逻辑。这是Krishna提到的方法。

我喜欢这个,因为它将网络基础设施封装在一个地方(Terraform),并且对使用该资源的代码(您的run_job_flow Lambda)有明确的输入/输出。

似乎没有必要创建临时安全组,但如果你这样做,我会在现有代码周围创建/销毁它们。这取决于您是否认为安全组是网络基础结构的一部分,或者是作业的一部分。这应该指导您创建/销毁它们的位置。