が直接、私はいくつかのコンテキストが役立つだろうと思うこの質問に答える前に..あなたを助けます彼は基本的なプロバイダ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
を書き留めておいてください。削除するために見つけられるようにしてください。
私はdbの変更を行うことができました。どうすればaws_vpc_dhcp_options_associationをインポートできますか?あなたはブロックのようなテラフォームの状態について、どのようにこれを行うことができるのか説明できますか? –
また、テラフォームのリフレッシュは私のリモート状態と一致しますが、私のリモート状態は手動での変更だけでは更新されません。 –
Terraformは異なる場合があります。特定のdhcpオプションを回避するには... vpcリモート状態をリフレッシュする価値があります。デフォルトでは現在のdhcpオプションがマークされます。 – jzaa