Alibaba Cloud Terraform Provider は、複数の認証方式をサポートしています。適切な方式は、Terraform のランタイム環境とシナリオによって異なります。
認証方式の優先順位
Alibaba Cloud Provider を設定する際、通常は 1 つの認証方式のみを選択します。Terraform Provider は、以下の順序で認証情報を検索し、有効な認証情報が見つかり次第、検索を停止します。
静的構成:プロバイダーはまず、`provider` ブロックで `access_key`、`secret_key`、`security_token`、または `ecs_role_name` パラメーターが明示的に指定されている場合、それらを読み取ります。
環境変数:静的構成が見つからない場合、プロバイダーは `ALICLOUD_ACCESS_KEY` や `ALICLOUD_SECRET_KEY` などのシステム環境変数を読み取ります。
共有設定ファイル:
静的構成:プロバイダーは、ローカルの共有設定ファイルから指定されたプロファイルの認証情報を読み取ります。この情報には、AccessKey ペア、`ram_role_arn`、`ram_role_name`、または `sts_token` が含まれる場合があります。
高度な構成:共有設定ファイルに静的構成が含まれておらず、CloudSSO、OAuth、外部プログラム、または連鎖可能な RAM ロール (`ChainableRamRoleArn`) が設定されている場合、プロバイダーは対応するプラグインを呼び出して、一時的な Security Token Service (STS) 認証情報を取得します。
URL 認証情報:上記のいずれの方式でも認証情報が提供されない場合、プロバイダーは `credentials_uri` で指定された URL から認証情報を取得しようとします。
セキュリティに関する推奨事項
本番環境のセキュリティを強化するために、一時的な認証情報に依存する以下の認証方式を使用することを推奨します。
ECS のインスタンス RAM ロール
RAM ロールの引き受け (AssumeRole)
OIDC IdP のロールの引き受け
これらの方式には、以下のセキュリティ上の利点があります。
設定ファイルに有効期間の長い AccessKey をハードコーディングしたり、公開したりすることを回避し、キー漏洩のリスクを低減します。
有効期限が固定された認証情報を使用することで、権限の有効期間を制限します。
きめ細かな権限付与のサポート
アプリケーション、チーム、プロジェクトなどのディメンションに基づいてリソースアクセスをきめ細かく制御するには、RAM ロールの偽装と OIDC IdP ロールの偽装を使用します。専用のロールとアクセスポリシーを異なる Terraform ワークロードにアタッチすることで、最小権限の原則に従うことができます。
Terraform の認証方式
Alibaba Cloud Terraform Provider は、以下の認証方式を提供しています。
認証方式 | 手順 | ユースケース |
(access_key) | 設定ファイル内で AccessKey (AK) をプレーンテキストで定義するか、パラメーターとして渡します。 |
|
(ALIBABA_CLOUD_ACCESS_KEY) | 環境変数から AccessKey (AK) 情報を読み取ります。 |
|
(ecs_role_name) | ECS インスタンスのメタデータから、アタッチされた RAM ロールのアクセス認証情報を取得します。 | Terraform が ECS インスタンス上で実行される場合。 |
OIDC ロールの偽装 (assume_role_with_oidc) | OpenID Connect (OIDC) を通じてロールを引き受けることで、アクセス認証情報を取得します。 | Terraform が Alibaba Cloud Container Service for Kubernetes (ACK) などの OIDC をサポートする Kubernetes クラスターで実行される場合。 |
(assume_role) | RAM ロールを偽装することで、アクセス認証情報を取得します。 |
|
(credentials_uri) | 一時的な認証情報を取得するための URI を指定します。 | API やファイルなどのカスタム認証情報サービスから認証情報を取得する場合。 |
(profile) | Alibaba Cloud コマンドラインインターフェイス (CLI) を使用して、複数の認証方式を 1 つのファイルに統一して設定します。プロファイル名を指定することで、アクセス認証情報を取得します。サポートされている認証方式は次のとおりです。
|
|
共有設定ファイル
Terraform は、共有設定ファイルからのアクセス認証情報の使用をサポートしています。共有設定ファイルは、Alibaba Cloud コマンドラインインターフェイス (CLI) によって生成される config.json ファイルです。静的 AccessKey、ECS ロール、ロールの偽装など、複数の種類の認証情報を 1 つのファイルに設定し、profile 名を使用して参照できます。設定方法の詳細については、「認証情報の設定」をご参照ください。
共有設定ファイルのデフォルトパスは次のとおりです。
Linux/macOS:
~/.aliyun/config.jsonWindows:
C:\Users\USER_NAME\.aliyun\config.json
設定例
Terraform の provider 設定では、profile パラメーターを使用して使用する認証情報設定の名前を指定できます。設定ファイルがデフォルトパスにない場合は、shared_credentials_file パラメーターを使用して設定ファイルの絶対パスを指定できます。次のコードは設定例です。
provider "alicloud" {
region = "cn-hangzhou"
shared_credentials_file = "~/.aliyun/config.json"
profile = "TerraformTest"
}以下は config.json ファイルの例です。
{
"current": "<PROFILE_NAME>",
"profiles": [
{
"name": "<PROFILE_NAME>",
"mode": "AK",
"access_key_id": "<ALIBABA_CLOUD_ACCESS_KEY_ID>",
"access_key_secret": "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>"
},
{
"name": "<PROFILE_NAME1>",
"mode": "StsToken",
"access_key_id": "<ALIBABA_CLOUD_ACCESS_KEY_ID>",
"access_key_secret": "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>",
"sts_token": "<SECURITY_TOKEN>"
},
{
"name": "<PROFILE_NAME2>",
"mode": "RamRoleArn",
"access_key_id": "<ALIBABA_CLOUD_ACCESS_KEY_ID>",
"access_key_secret": "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>",
"ram_role_arn": "<ROLE_ARN>",
"ram_session_name": "<ROLE_SESSION_NAME>",
"expired_seconds": 3600
},
{
"name": "<PROFILE_NAME3>",
"mode": "EcsRamRole",
"ram_role_name": "<RAM_ROLE_ARN>"
},
{
"name": "<PROFILE_NAME4>",
"mode": "External",
"process_command": "<YOUR_COMMAND>",
"region_id": "<REGION_ID>",
"output_format": "json",
"language": "en"
},
{
"name": "<PROFILE_NAME5>",
"mode": "OIDC",
"oidc_provider_arn": "<OIDC_PROVIDER_ARN>",
"oidc_token_file": "<OIDC_TOKEN_FILE>",
"ram_role_arn": "<ROLE_ARN>",
"ram_session_name": "<ROLE_SESSION_NAME>",
"expired_seconds": 3600
},
{
"name": "<PROFILE_NAME6>",
"mode": "ChainableRamRoleArn",
"source_profile": "<PROFILE_NAME>",
"ram_role_arn": "<ROLE_ARN>",
"ram_session_name": "<ROLE_SESSION_NAME>",
"expired_seconds": 3600
},
{
"name": "<PROFILE_NAME7>",
"mode": "CloudSSO",
"cloud_sso_sign_in_url": "https://******/login",
"access_token": "eyJraWQiOiJiYzViMzUwYy******",
"cloud_sso_access_token_expire": 1754316142,
"cloud_sso_access_config": "ac-00s1******",
"cloud_sso_account_id": "151266******"
},
{
"name": "<PROFILE_NAME8>",
"mode": "OAuth",
"access_key_id": "<ALIBABA_CLOUD_ACCESS_KEY_ID>",
"access_key_secret": "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>",
"sts_token": "<SECURITY_TOKEN>",
"region_id": "<REGION_ID>",
"output_format": "json",
"language": "<zh|en>",
"sts_expiration": "<STS_EXPIRATION>",
"oauth_access_token": "<OAUTH_ACCESS_TOKEN>",
"oauth_refresh_token": "<OAUTH_REFRESH_TOKEN>",
"oauth_access_token_expire": 1754316142,
"oauth_site_type": "<CN|EN>"
}
]
}config.json ファイルでは、mode パラメーターを使用してさまざまな認証情報の種類を指定できます。
AK:ユーザーの AccessKey を認証情報として使用します。
StsToken:STS トークンを認証情報として使用します。
RamRoleArn:RAM ロールの ARN を使用して認証情報を取得します。
EcsRamRole:ECS インスタンスにアタッチされた RAM ロールを使用して認証情報を取得します。
External:外部プログラムのコマンドを実行して動的に認証情報を取得します。
OIDC:OIDC IdP の ARN と OIDC トークンを使用して認証情報を取得します。
ChainableRamRoleArn:ロールチェーンを使用します。
config.jsonファイル内の別の認証情報の名前をsource_profileで指定して、新しい認証情報を取得します。OAuth:OAuth を使用して CLI にログインして取得した認証情報。
CloudSSO:CloudSSO ユーザーが Alibaba Cloud CLI を使用して取得した認証情報。