2017-05-13 9 views
0

私はterraformを初めて使用しています。私はs3でリモートtfstateを作成しましたが、現在AWSインフラストラクチャで行われているマニュアル変更もあります。私はtfstateでこれらの手動変更をインポートする必要があります。 私はimport fuctionをいくつか使っていましたが、iamのポリシーのように、そのようなインポート機能はありません。 また、一部のリソースはDbのよ​​うな変更であり、新しいパラメータが追加されています。私もそれらをインポートする必要があります。変更をインポートしようとすると、次のようになります。terraformリモートtfstateのマニュアル変更をインポートする方法

Error importing: 1 error(s) occurred: 

* Can't import aws_security_group.Q8SgProdAdminSshInt, would collide with an existing resource. 

Please remove or rename this resource before continuing. 

助けてください。 おかげ

インポート機能を使用するか、手動でブロックなどのテラフォームの状態を追加する必要がリソースについて

答えて

4

が直接、私はいくつかのコンテキストが役立つだろうと思うこの質問に答える前に..あなたを助けます彼は基本的なプロバイダAPIのオブジェクトにあなたの設定のリソースを提供します。 Terraformを使用して新しいオブジェクトを作成すると、作成されたオブジェクトのIDは自動的に状態に保存され、将来のコマンドで参照、更新、および削除操作のオブジェクトを見つけることができます。

terraform importは、状態ファイルにエントリを作成する別の方法です。代わりに新しいオブジェクトを作成し、そのIDを記録するのではなく、ユーザーはコマンドラインでIDを指定します。 Terraform は、そのIDを持つオブジェクトをと読み込み、その結果を状態ファイルに追加します。その後、Terraformが作成したリソースと状態が区別できません。

だからこそ、あなたの質問を1つ1つお答えしましょう。各リソースは、インポートを行うには、検証とデータフェッチ少量のコードを必要とするのでterraform import

をサポートしていないリソースのインポート


ではなく、すべてのリソースは、この時点でインポート用にサポートされています。我々はterraform importが上から何について知っていることを考えると

は理論にそれが提供されたIDのテラフォームの検証をスキップし、代わりに手動状態にリソースを追加することが可能です。 これは高度な操作であり、状態が破損しないように注意して行う必要があります

まず、あなたがあなたの地元の仕事のために使用しますローカルファイルに状態を取得:

terraform state pull >manual-import.tfstate 

これは、テキストエディタで開くことができるファイルmanual-import.tfstateを作成します。 JSON構文を使用しているため、内部構造は安定した形式として文書化されていませんが、予想される構造と一致している限り、慎重に編集できます。

インポート、複製、編集する場所と同じモジュール内にある既存のリソースを見つけるのが最も簡単です。我々はこのようなresourcesオブジェクトを持っていると仮定しましょう:

"resources": { 
    "null_resource.foo": { 
     "type": "null_resource", 
     "depends_on": [], 
     "primary": { 
      "id": "5897853859325638329", 
      "attributes": { 
       "id": "5897853859325638329" 
      }, 
      "meta": {}, 
      "tainted": false 
     }, 
     "deposed": [], 
     "provider": "" 
    } 
}, 

このresourcesオブジェクト内の各属性は、あなたの構成内のリソースに対応します。属性名は、リソースのタイプと名前です。この場合、リソースタイプはnull_resourceであり、属性名はfooです。あなたの場合はaws_instance.serverのようなものが表示されます。

idの属性は、多くのリソース(ただしすべてではありません)のために、入力する必要がある主なものです。だから我々は、架空のIAMポリシーのこのような構造を複製することができます

"resources": { 
    "null_resource.foo": { 
     "type": "null_resource", 
     "depends_on": [], 
     "primary": { 
      "id": "5897853859325638329", 
      "attributes": { 
       "id": "5897853859325638329" 
      }, 
      "meta": {}, 
      "tainted": false 
     }, 
     "deposed": [], 
     "provider": "" 
    }, 
    "aws_iam_policy.example": { 
     "type": "aws_iam_policy", 
     "depends_on": [], 
     "primary": { 
      "id": "?????", 
      "attributes": { 
       "id": "?????" 
      }, 
      "meta": {}, 
      "tainted": false 
     }, 
     "deposed": [], 
     "provider": "" 
    } 
}, 

挑戦を、この段階では、このリソースに必要なIDの種類を把握することです。これを知る唯一の確実な方法は、read the codeです。このリソースは、このリソースがIDがポリシーの完全なARNであることを予期しています。

上記の例の2つの?????シーケンスを、インポートするポリシーのARNに置き換えます。

状態を手動で変更した後、ファイルの最上位にあるserialの番号を更新する必要があります。 Terraformは、新しい変更にはシリアル番号が高くなるため、この番号を増やすことができます。

アップデートを完了した後、我々は戻っテラフォームに更新された状態のファイルをアップロードする必要がありますが:

terraform state push manual-import.tfstate 

最後に我々はそれが働いていたことを確認するために状態を更新するためにテラフォームを頼むことができます。

terraform refresh 

アゲインこれは、状態ファイルがTerraformの基本システムとの関係の記録であり、このファイルの内容が失われた場合に回復するのが難しいため、非常に危険なプロセスです。インフラストラクチャですでに重要な役割を果たしていない場合や、適切な移行方法がない場合は、リソースを単純に置き換える方が簡単です。あなたの質問に与えられた既存のリソース

エラーメッセージと衝突

輸入は、既存のリソースと「衝突」の輸入について話している:

Error importing: 1 error(s) occurred: 

* Can't import aws_security_group.Q8SgProdAdminSshInt, would collide with an existing resource. 

Please remove or rename this resource before continuing. 

このメッセージの意味は、テラフォームをしようとしたときにその新しいリソースを状態ファイルに書き込むために、既に名前のために存在するリソースエントリが見つかりましたaws_security_group.Q8SgProdAdminSshInt。これは、すでにインポートされているか、Terraform自身ですでに新しいセキュリティグループが作成されていることを示しています。

あなたは状態の既存のリソースの属性を調べることができます。

terraform state show aws_security_group.Q8SgProdAdminSshInt 

は、インポートしようとしていたセキュリティグループに返されたデータを比較してください。 idsが一致すれば、リソースはすでにインポートされているので、何も残っていません。

ids が一致しない場合は、が一致しない場合は、2つのオブジェクトのどちらを保持したいかを判断する必要があります。Terraformが既に持っているものを保持したい場合は、インポートしようとしていたものを手動で削除することができます。ただ

terraform state rm aws_security_group.Q8SgProdAdminSshInt 

(注)このこと:

あなたがあなたの代わりにインポートしようとしていたものを維持したい場合は、インポートが成功するための方法を作るためにテラフォームの状態から不要なものをドロップすることができますTerraformはリソースを「忘れる」ようにします。 EC2にはまだ存在し、コンソール、コマンドラインツール、またはAPIを使用して手動で削除する必要があります。削除する前にそのidを書き留めておいてください。削除するために見つけられるようにしてください。

0

..

かあなたは... dBのコンフィグを述べたようにconfigに変更がある場合はdBのリソースがテラフォームによって管理されている場合舞台裏

、テラフォームがTからのマッピングが含まれている状態ファイルを維持します。リモート状態... terraform refresh

+0

私はdbの変更を行うことができました。どうすればaws_vpc_dhcp_options_associationをインポートできますか?あなたはブロックのようなテラフォームの状態について、どのようにこれを行うことができるのか説明できますか? –

+0

また、テラフォームのリフレッシュは私のリモート状態と一致しますが、私のリモート状態は手動での変更だけでは更新されません。 –

+0

Terraformは異なる場合があります。特定のdhcpオプションを回避するには... vpcリモート状態をリフレッシュする価値があります。デフォルトでは現在のdhcpオプションがマークされます。 – jzaa

関連する問題