カピバラ好きなエンジニアブログ

興味ある技術とか検証した内容を赴くままに書いていきます。カピバラの可愛さこそ至高。

IAMグループをCloudFormationで作成する

今回はIAMグループをCFnで作成することがあったので備忘までに残しておきます。

作成物は以下に置いています。
github.com

実施作業

yamlファイル作成

公式ドキュメントを参考にyamlファイルを作成します。
AWS::IAM::Group - AWS CloudFormation

ファイル内容は以下です。
今回はAdministratorAccessの管理ポリシーをグループにアタッチします。

AWSTemplateFormatVersion: "2010-09-09"

Resources:
  IAMGroup:
    Type: AWS::IAM::Group
    Properties:
      GroupName: TestIAMGroup
      ManagedPolicyArns:
       - arn:aws:iam::aws:policy/AdministratorAccess


デプロイバッチ作成

毎回コマンドを打つの手間なので、デプロイ用のバッチを作成しておきます。

Param(
    [parameter(mandatory=$true)][String]$cmd_type,        # コマンド種別(create,update,delete)
	[parameter(mandatory=$true)][String]$account_id,      # アカウントID
	[parameter(mandatory=$true)][String]$file_name,       # ファイル名(拡張子無し)
	[parameter(mandatory=$true)][String]$profile_name    # プロファイル名
)

# yamlファイル存在確認
$yml_file = $file_name + ".yaml"
if(-not (Test-Path $yml_file)){
    print("yamlファイルが存在しません")
    exit 1
}

# awsアカウントID設定
$aws_account_id = $account_id

# Cloudformatino実行ロール設定
$role_name = "CloudformationExecuteRole"

# 実行コマンド設定
$exe_cmd = $cmd_type + "-stack"

# Stack名設定
$stack_name = $file_name

# role設定
$role_arn = "arn:aws:iam::" + $aws_account_id + ":role/" + $role_name

# コマンド作成
if(($cmd_type -eq "create") -Or ($cmd_type -eq "update")){
    $cmd = "aws cloudformation " + $exe_cmd + " --template-body file://" + $yml_file + " --role-arn " + $role_arn + " --capabilities CAPABILITY_NAMED_IAM " + " --profile " + $profile_name + " --stack-name " + $stack_name
}
if($cmd_type -eq "delete"){
    $cmd = "aws cloudformation " + $exe_cmd + " --profile " + $profile_name + " --stack-name " + $stack_name
}
if($cmd_type -eq ""){
    print("コマンド種別が間違っています")
    exit 1
}

# 実行コマンド出力
Write-Output($cmd)

# コマンド実行
Invoke-Expression $cmd

# 実行結果値出力
Write-Output($?)


デプロイ実行

作成したデプロイバッチを実行します。
yamlファイルはバッチを同階層に格納しています。

$ .\deplay_cfn.ps1 create XXXXXXXXXXXX iam-cfn default
aws cloudformation create-stack --template-body file://iam-cfn.yaml --role-arn arn:aws:iam::XXXXXXXXXXXX:role/CloudformationExecuteRole --capabilities CAPABILITY_NAMED_IAM  --profile default --stack-name iam-cfn
{
    "StackId": "arn:aws:cloudformation:ap-northeast-1:XXXXXXXXXXXX:stack/iam-cfn/3ec67e00-4fdb-11eb-9447-0a4c2e79e972"
}
True


実行結果確認

スタックのリストコマンドを実行して正常終了したことを確認します。

$ aws cloudformation list-stacks
{
    "StackSummaries": [
        {
            "StackId": "arn:aws:cloudformation:ap-northeast-1:XXXXXXXXXXXX:stack/iam-cfn/3ec67e00-4fdb-11eb-9447-0a4c2e79e972",
            "StackName": "iam-cfn",
            "CreationTime": "2021-01-06T04:54:23.558000+00:00",
            "StackStatus": "CREATE_COMPLETE",
            "DriftInformation": {
                "StackDriftStatus": "NOT_CHECKED"
            }
        },


IAMグループ作成確認

以下のコマンドでIAMグループが作成されていることを確認します。

$ aws iam get-group --group-name TestIAMGroup
{
    "Users": [],
    "Group": {
        "Path": "/",
        "GroupName": "TestIAMGroup",
        "GroupId": "AGPA5WU3AW5J2CVZOLUZE",
        "Arn": "arn:aws:iam::XXXXXXXXXXXX:group/TestIAMGroup",
        "CreateDate": "2021-01-06T04:54:28+00:00"
    }
}

IAMグループにはAdministratorAccessポリシーがアタッチされています。

$ aws iam list-attached-group-policies --group-name TestIAMGroup
{
    "AttachedPolicies": [
        {
            "PolicyName": "AdministratorAccess",
            "PolicyArn": "arn:aws:iam::aws:policy/AdministratorAccess"
        }
    ]
}


感想及び所感

いつもはコンソールを使用することが多いですが、今回は敢えてコマンドベースで操作してみました。
AWSのマネジメントコンソールはUIが変わりすぎてキャプチャしても意味なくなるので、基本コマンドで残したくなります。
※コマンド多いので覚えるのも大変ですが。。