1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Terraform CloudからAWSを管理する

Last updated at Posted at 2023-07-17

Terraform CloudからAWSに接続し管理する方法を記述します。

参考

前提

  1. Terraform Cloudにプロジェクト、ワークスペースは作成済み
  2. プログラムはVSCで管理しています。

手順

  1. OIDC Identity Providerを作成します。
  2. IAMロールを作成します。
  3. ワークスペースのVariableに作成したIAMロールの情報を登録します。

OIDC Identity Provider作成

AWSコンソールのIAM > アクセス管理 > IDプロバイダ > プロバイダを追加 から作成します。

OpenID Connect を選択
プロバイダのURLにhttps://app.terraform.ioを設定して「サムプリントを取得」をクリックします。
image.png
対象者にaws.workload.identityを設定して「プロバイダを追加」をクリックします。
image.png
作成されました。「ロールの割り当て」をクリックし、ロールを作成していきます。
image.png

IAMロール作成

新しいロールを作成を選択し「次へ」をクリックします。
image.png
ウェブID、IDプロバイダーapp.terraform.io:eud、Audienceaws.workload.identityが選択されていると思います。「次のステップ:アクセス権限」をクリックします。
image.png
Terraform Cloudで実行したい権限を持つポリシーを適宜選んで「次のステップ:タグ」をクリックします。
image.png
「次のステップ:確認」をクリックします。
image.png
ロール名、ロールの説明を適宜設定して「ロールの作成」をクリックします。
image.png
ロールが作成されました。Terraformの設定にARNが必要なのでコピーしておきます。
shuusei.png
作成したロールの詳細画面の信頼関係のタブから「信頼ポリシーを編集」をクリックします。
test.png
app.terraform.io:subのkeyを追加します。valueは organization:ORG_NAME:project:PROJECT_NAME:workspace:WORKSPACE_NAME:run_phase:RUN_PHASEでTerraformの組織、プロジェクト、ワークスペース、runコマンドを置き換えて、セットします。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::<アカウントID>:oidc-provider/app.terraform.io"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringEquals": {
                    "app.terraform.io:aud": "aws.workload.identity",
+                    "app.terraform.io:sub": "organization:urushibata-org:project:urushibata-aws-management:workspace:aws-managed-terraform:run_phase:*"
                }
            }
        }
    ]
}

Variable登録

Terraform CloudのWorkspace Variablesに環境変数でTFC_AWS_PROVIDER_AUTH:trueTFC_AWS_RUN_ROLE_ARN:ロールのARNを作成します。
image.png

実行

Terraform Cloudからplan & apply実行できました。
image.png

ローカル開発

stateファイルはTerraform Cloud内で管理されます。ローカルで開発をしているときにクラウドのstateファイルを参照してplanでテストしたいと思うので、その方法も記述します。

以下のようにterraformの中にorganization、warkspaceの名前を追加します。

terraform {
  cloud {
    organization = "urushibata-org"
    workspaces {
      name = "aws-managed-terraform"
    }
  }
}

ログインしてplanを実行してみます。

$ terraform login
Terraform will request an API token for app.terraform.io using your browser.

If login is successful, Terraform will store the token in plain text in
the following file for use by subsequent commands:
    /home/s-urushibata/.terraform.d/credentials.tfrc.json

Do you want to proceed?
  Only 'yes' will be accepted to confirm.

  Enter a value: yes


---------------------------------------------------------------------------------

Open the following URL to access the tokens page for app.terraform.io:
    https://app.terraform.io/app/settings/tokens?source=terraform-login


---------------------------------------------------------------------------------

Generate a token using your browser, and copy-paste it into this prompt.

Terraform will store the token in plain text in the following file
for use by subsequent commands:
    /home/s-urushibata/.terraform.d/credentials.tfrc.json

Token for app.terraform.io:
  Enter a value:


Retrieved token for user urush1batalala


---------------------------------------------------------------------------------

                                          -
                                          -----                           -
                                          ---------                      --
                                          ---------  -                -----
                                           ---------  ------        -------
                                             -------  ---------  ----------
                                                ----  ---------- ----------
                                                  --  ---------- ----------
   Welcome to Terraform Cloud!                     -  ---------- -------
                                                      ---  ----- ---
   Documentation: terraform.io/docs/cloud             --------   -
                                                      ----------
                                                      ----------
                                                       ---------
                                                           -----
                                                               -


   New to TFC? Follow these steps to instantly apply an example configuration:

   $ git clone https://github.com/hashicorp/tfc-getting-started.git
   $ cd tfc-getting-started
   $ scripts/setup.sh

$ terraform plan
Running plan in Terraform Cloud. Output will stream here. Pressing Ctrl-C
will stop streaming the logs, but will not stop the plan running remotely.

Preparing the remote plan...

The remote workspace is configured to work with configuration at
./environment/mng relative to the target repository.

Terraform will upload the contents of the following directory,
excluding files or directories as defined by a .terraformignore file
at /home/s-urushibata/work/terraform/aws-managed-terraform/.terraformignore (if it is present),
in order to capture the filesystem context the remote workspace expects:
    /home/s-urushibata/work/terraform/aws-managed-terraform

To view this run in a browser, visit:
https://app.terraform.io/app/urushibata-org/aws-managed-terraform/runs/run-AXSufPxmKGuezL13

Waiting for the plan to start...

Terraform v1.5.3
on linux_amd64
Initializing plugins and modules...
module.organization.data.aws_iam_policy_document.region_restriction: Refreshing...
module.organization.data.aws_iam_policy_document.region_restriction: Refresh complete after 0s [id=1127618634]
module.organization.aws_organizations_policy.region_restriction_policy: Refreshing state... [id=p-4kuo19vh]
module.organization.aws_organizations_policy.region_restriction_policy: Drift detected (update)

No changes. Your infrastructure matches the configuration.

Terraform has compared your real infrastructure against your configuration and found no differences, so no changes are
needed.

------------------------------------------------------------------------

Cost Estimation:

Resources: 0 of 1 estimated
           $0.0/mo +$0.0

実行されたplanはクラウド側に履歴が残ります。
image.png

ソースをVCSで管理していれば、もし誤ってローカルからapplyしてしまってもエラーとなるので安心です。

$ terraform apply
╷
│ Error: Apply not allowed for workspaces with a VCS connection
│
│ A workspace that is connected to a VCS requires the VCS-driven workflow to ensure that the VCS remains the single
│ source of truth.
╵
1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?