スタックセットを使用して AWS CloudFormation リソースをデプロイするうえでの、IAM のベストプラクティスを知りたいです。

所要時間2分
0

AWS CloudFormation における、スタックセットを使用して AWS CloudFormation リソースをデプロイするためのベストプラクティスを知りたいです。

解決策

受信したエラーを特定します。次に、以下の関連セクションの手順に従ってエラーを解決します。
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI エラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。

スタックセットで最も一般的な IAM アクセス許可エラー

エラー: 「アカウント 111111111111 には、ロール 'AWSCloudFormationStackSetAdministrationRole' との信頼関係を持つ 'AWSCloudFormationStackSetExecutionRole' ロールが必要です。」

このエラーは通常、IAM ロールの AWSCloudFormationStackSetExecutionRole または AWSCloudFormationStackSetAdministrationRole が欠けている場合に発生します。また、管理者と対象アカウント間の信頼関係が正しく確立されていない場合にも発生します。

このエラーを解決するには、次の手順を実行します。

  1. 管理者アカウントに、IAM ロール AWSCloudFormationStackSetExecutionRole および AWSCloudFormationStackSetAdministrationRole があることを確認します。ロールに正しい名前が付けられていることを確認してください。たとえば、管理ロールは AWSCloudFormationStackSetExecutionRole である必要があります。各ターゲットアカウントでは、ロールの名前は AWSCloudFormationStackSetExecutionRole である必要があります。
    注: 次の AWS CloudFormation テンプレートを使用して、スタックセット用の基本的な IAM アクセス許可を設定することもできます。

  2. IAM ロールが存在する場合は、ロール間に信頼関係があることを確認します。

    IAM ロール間の基本的な信頼関係を有効にする以下のコードスニペット例を確認してください。

    AWSCloudFormationStackSetAdministrationRole の信頼関係

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Service": "cloudformation.amazonaws.com"
          },
          "Action": "sts:AssumeRole"
        }
      ]
    }

    AWSCloudFormationStackSetAdministrationRole のインラインポリシー

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Action": [
            "sts:AssumeRole"
          ],
          "Resource": [
            "arn:*:iam::*:role/AWSCloudFormationStackSetExecutionRole"
          ],
          "Effect": "Allow"
        }
      ]
    }

    AWSCloudFormationStackSetExecutionRole の信頼関係セクション

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "AWS": "arn:aws:iam::admin_account_id:root"
          },
          "Action": "sts:AssumeRole"
        }
      ]
    }

エラー: 「リソースハンドラーがメッセージを返しました: 「使用しているアカウントは委任管理者ではありません (サービス: CloudFormation。ステータスコード: 400、リクエスト ID: xxxxxx-xxxx-xxxx-xxxx-xxxxxxxx)」(RequestToken:xxxxx-xxx-xxxxx。HandlerErrorCode: InvalidRequest)」CloudFormation リソースタイプ "AWS::CloudFormation::StackSet" を使用して StackSet をデプロイしようとして発生しました」

または、

エラー (AWS CLI): 「ListStackSets 操作の呼び出し中にエラーが発生しました (ValidationError): 使用しているアカウントは委任管理者ではありません」

これらのエラーは、スタックセットのデプロイに使用された AWS アカウントが委任管理者として登録されていないことを示しています。または、IAM ロールに必要なアクセス許可がないためにエラーが発生します。組織には、一度に 5 人までの委任管理者を登録できます。委任管理者は、組織内のすべてのアカウントにデプロイするか、特定の組織ユニット (OU) にデプロイするかを選択できます。

このエラーを解決するには、次の手順を実行します。

  1. 次の AWS CLI コマンドを使用して、アカウントが委任管理者アカウントとして登録されていることを確認します。

    aws organizations list-delegated-administrators \
      --service-principal=member.org.stacksets.cloudformation.amazonaws.com
  2. アカウントが委任管理者として登録されていない場合は、登録します。または、次の AWS CLI コマンドを使用して委任管理者を登録します。

    aws organizations register-delegated-administrator \
      --service-principal=member.org.stacksets.cloudformation.amazonaws.com \
      --account-id="memberAccountId"

    注: memberAccountId は、お使いの AWS アカウント ID に置き換えてください。

  3. アカウントが委任管理者の場合は、IAM ロールの次の IAM アクセス許可を確認してください。

    organizations:ListDelegatedAdministrators
    cloudformation:TagResource
    cloudformation:CreateStackSet

    注: 委任された管理者には、組織内のアカウントにデプロイするためのすべてのアクセス許可があります。管理アカウントは、委任管理者のアクセス許可を特定の OU へのデプロイまたは、特定のスタックセット操作の実行に限定することはできません。

エラー: 「ResourceStatusReason: 次のポリシーに無効なプリンシパルがあります。 "AWS":"arn:aws:iam::111111111111:role/myDeploymentRole" (サービス: AmazonIdentityManagement。ステータスコード: 400。エラーコード: MalformedPolicyDocument。リクエスト ID: xxxxxx-xxxx-xxxx-xxxx-xxxxxx。プロキシ: null)」

このエラーメッセージは、IAM 信頼ポリシーの Principal 要素の値が誤っていることを示しています。このエラーの解決方法の詳細については、「IAM 信頼ポリシーエラー "信頼ポリシーを更新できませんでした。ポリシーに無効なプリンシパルがあります" を解決する方法を教えてください」を参照してください。

エラー: 「ResourceLogicalId:myDeploymentRole。ResourceType:AWS::IAM::Role。ResourceStatusReason:myDeploymentRole が既に存在します」

エラー: 「ResourceLogicalId:myDeploymentRolePolicy。ResourceType:AWS::IAM::ManagedPolicy。ResourceStatusReason:myDeploymentRolePolicy が既に存在します」

これらのエラーは、AWS IAM がグローバルに利用可能なサービスであり、リージョナルサービスではないために発生します。AWS サービスは、リージョナルサービスのコンテンツを AWS リージョンで処理して保存します。IAM はグローバルサービスであるため、あるリージョンで IAM ロールまたはポリシーを作成すると、そのロールまたはポリシーをすべてのリージョンで使用できます。

次に示すように、CloudFormation スタックセットテンプレートで条件を定義して、このエラーを解決します。リージョンの条件を指定すると、スタックは IAM リソースを 1 つのリージョン (us-east-1) にのみデプロイします。完了すると、リージョンのすべてのスタックアカウントが正常に更新されます。

次の YAML テンプレートスニペットは、IAM リソースを us-east-1 リージョンのみにデプロイする方法を示しています。

AWSTemplateFormatVersion: "2010-09-09"
Conditions:
  RoleCreate: !Equals
    - !Ref AWS::Region
    - us-east-1

Resources:
  myIAMRole:
    Type: 'AWS::IAM::Role'
    Condition: RoleCreate
    Properties:
      RoleName: 'TestingIAMRole2'
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - ec2.amazonaws.com
            Action:
              - 'sts:AssumeRole'
AWS公式
AWS公式更新しました 1年前
コメントはありません

関連するコンテンツ