CloudFormation で別アカウントの S3 バケットに存在するテンプレートを利用する方法

アノテーションのスライマンです。
今回は CloudFormation で別アカウントの S3 バケットに存在するテンプレートを利用する方法に関する記事となります。

S3 オブジェクトのクロスアカウントアクセス

S3 のオブジェクトはクロスアカウントでのアクセスを実施することは可能となります。
下記のリソースに対して、クロスアカウントでの権限の許可を設定した場合、クロスアカウントでのアクセスを実現することができます。

  • S3 バケットオブジェクトへのプログラムによるアクセスのみのAWS Identity and Access Management (IAM) ポリシーとリソースベースのバケットポリシー
  • S3 バケットオブジェクトへのプログラムによるアクセスのみのIAM ポリシーとリソースベースのアクセスコントロールリスト
  • S3 バケットオブジェクトへのプログラムによるアクセスとコンソールアクセスのためのクロスアカウント IAM ロール

上記の各設定方法については、下記のナレッジセンターの内容をご確認ください。
ユースケースに基づいて、どのリソースに対して、アクセス権限の許可をする必要がございます。

今回の記事では、「AWS Identity and Access Management (IAM) ポリシーとリソースベースのバケットポリシー」の設定により、CloudFormation で別アカウントの S3 バケットに存在するテンプレートを利用する方法をご紹介させていただきます。

必要なリソース

  • 参照元アカウント(A):
    • IAMユーザー/ロール
  • 参照先アカウント(B):
    • S3バケット
    • アップロードするテンプレート
    • S3バケットポリシー

実際にやってみた

以下の流れで作業を進めていきます。

  • 参照先アカウント(B)で S3バケットを作成して、テンプレートをアップロード
  • 参照元アカウント(A)で IAMロールを作成する
  • 参照先アカウント(B)で S3バケットポリシーの設定
  • 参照元アカウント(A)で実際に CloudFormation でテンプレートを参照する

参照先アカウント(B)で S3バケットを作成して、テンプレートをアップロード

S3 バケットを作成していきます。
設定はデフォルトの通りに進めていきます。

続いて、サンプルとなる CFn テンプレートをアップロードします。
今回はサンプルとして、CloudWatch Logs を作成するテンプレートを用意しています。

AWSTemplateFormatVersion: "2010-09-09"

Resources:
  LogGroup:
    Type: AWS::Logs::LogGroup
    Properties: 
      LogGroupName: my-log-group
      RetentionInDays: 7

参照元アカウント(A)でIAMロールを作成する

参照元アカウントで IAMロールを作成します。
今回は IAMロールですが、IAMユーザーを利用していることも可能です。

作成後、まずはクロスアカウントのS3アクセスのために下記の IAM ポリシーを作成します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws:s3:::<S3バケット名>/*"
        }
    ]
}

続きまして、CloudFormation や作成されるリソースへのアクセス権限を許可するため、下記の IAM ポリシーを作成します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "sns:*",
                "iam:List*",
                "cloudformation:*",
                "logs:*"
            ],
            "Resource": "*"
        }
    ]
}

参照先アカウント(B)で S3バケットポリシーの設定

S3 バケットに下記のバケットポリシーを設定します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<AWSアカウントID>:role/<IAMロール名>"
            },
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws:s3:::<S3バケット名>/*"
        }
    ]
}

参照元アカウント(A)で実際に CloudFormation でテンプレートを参照する

実際に参照できるか、試してみます。
コンソールで CloudFormation に進み、S3 の URL 貼り付けます。

次へ進みます。
この時点で S3のアクセスが正常にできておらず、エラーが発生している場合は下記のエラーが発生します。

S3 error: Access Denied For more information check http://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html

上記のエラーが発生せず、次のステップへ進めれた場合、正常に S3にアクセスできていることがわかります。
下記のステップを続けて、スタックを作成して完了となります。

参考情報

アノテーション株式会社について

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。