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

Terraform AWS & EMR run : VPC destruction issue

我有一个部署 VPC、存储桶、lambda 和数据库的 Terraform 项目。 我的一个 lambda 使用 boto3 Python 库创建了一个 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 吗?你有什么建议?

干杯

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

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

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

我不确定现在是如何为您创建这些安全组的(文档没有提到创建临时安全组,奇怪的是,如果他们这样做了,那么他们之后就会闲逛),但是在 Terraform 中完成所有网络,然后 output those IDs for consumption by your Lambda. This is the method Krishna 提到似乎合乎逻辑。

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

似乎不​​需要创建临时安全组,但如果您这样做了,我会 create/destroy 在您现有代码周围的 boto 中创建它们。这取决于您认为安全组是网络基础设施的一部分,还是工作的一部分。那应该指导你create/destroy他们。