APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

【Blog Week】さらば、コンソール作業、、~AWS運用自動化ツール:IAMユーザ作成編~

はじめに

こんにちは、クラウド事業部の清水(雄)です。

今年サービス開発したAWS運用自動化ツール(Chatops)の基本設計と実装手順を記載させて頂きます。
今回はSlackでコマンド叩けば「IAMユーザ作成」が可能なツールが対象です。
手順に記載している各種テンプレートやソースは以下アンケートにお答え頂けるとダウンロードできる仕様となります。
よろしかったらお試しください。

www.ap-com.co.jp

目次

基本設計

IAMユーザ作成ツール 基本設計

本ツールの概要

本ツールは、IAMユーザの作成を、AWSマネジメントコンソースにアクセスせず実現するツールです。
本ツールはSlackから特定のコマンドを実行することで利用できるため、開発者が自らIAMユーザ作成することができます。

本ツールの利用イメージ

本ツールは、Slackから特定のコマンドを実行することで、IAMユーザを作成します。
「IAMユーザー名」、「IAMグループ」、「パスワード」が必須の入力項目となります。

## Slackコンソールから実行するコマンド例
/createiamuser <IAMユーザー名> <IAMグループ名> <パスワード>

本ツール利用時の注意点

  • パスワードは以下条件を満たすものを設定してください。
    ・パスワードの文字数制限: 8~128 文字 ・大文字、小文字、数字、英数字以外の文字 (! @ # $ % ^ & * ( ) _ + - = [ ] { } | ') のうち、最低 3 つの文字タイプの組み合わせ ・AWS アカウント 名または E メールアドレスと同じでないこと

  • 作成したIAMユーザにはMFA認証必須化の為以下ポリシー(Customer_IAM_MFA_Policy)をアタッチしてます。

  • ログイン後MFAの設定をお願いします。

      {
          "Version": "2012-10-17",
          "Statement": [
              {
                  "Sid": "VisualEditor0",
                  "Effect": "Allow",
                  "Action": [
                      "iam:RemoveUserFromGroup",
                      "iam:ListUsers",
                      "iam:GetUser"
                  ],
                  "Resource": "arn:aws:iam::*:user/${aws:username}"
              },
              {
                  "Sid": "VisualEditor1",
                  "Effect": "Allow",
                  "Action": [
                      "iam:DeactivateMFADevice",
                      "iam:DeleteVirtualMFADevice",
                      "iam:EnableMFADevice",
                      "iam:ResyncMFADevice",
                      "iam:CreateVirtualMFADevice",
                      "iam:ListMFADevices"
                  ],
                  "Resource": [
                      "arn:aws:iam::*:mfa/${aws:username}",
                      "arn:aws:iam::*:user/${aws:username}"
                  ]
              },
              {
                  "Sid": "DenyAllExceptMFASession",
                  "Effect": "Deny",
                  "NotAction": "iam:*",
                  "Resource": "*",
                  "Condition": {
                      "BoolIfExists": {
                          "aws:MultiFactorAuthPresent": "false"
                      }
                  }
              }
          ]
      }
    

本ツール利用時に発生する金額コスト

実装手順

前提条件

本ツールを利用するためには、以下の前提を満たす必要があります。

  • AWSアカウントを所有している
  • Slackを利用している
  • IAMグループが作成されている

環境構成図

本ツールの構成図は以下の通りです。

環境構築手順

0. 環境構築準備

  • AWSマネジメントコンソールにログインしてください。
  • 画面左下の CloudShell を選択し、AWS Cloud Shellを起動してください。
  • AWS Cloud Shell画面右上の Actions を選択し、 Upload files を選択してください。
  • slack-iam-user-create.zip を選択し、ファイルをアップロードしてください。
  • アップロード完了後、以下のコマンドを実行し、Zipファイルを解凍してください。
$ unzip slack-iam-user-create.zip

1. IAMポリシーの作成

作成したIAMユーザにアタッチするポリシーを作成します。(MFA)

# template配下のjsonファイルを指定して実行
$ aws iam create-policy --policy-name Customer_IAM_MFA_Policy --policy-document file://template/Customer_IAM_MFA_Policy.json

2. Lambda関数の作成

AWS Cloud Shell環境にアクセスし、以下のコマンドを実行してください。

# 作業ディレクトリに移動
$ cd <解凍したフォルダ名>

# 一時的に使用するAmazon S3バケットを作成します
$ BUCKET_NAME_1=`date "+%Y%m%d-%H%M%S"`
$ BUCKET_NAME_2=`date "+%Y%m%d-%H%M%S"`
$ aws s3api create-bucket --bucket ${BUCKET_NAME_1} \
    --create-bucket-configuration LocationConstraint=ap-northeast-1
$ aws s3api create-bucket --bucket ${BUCKET_NAME_2} \
    --create-bucket-configuration LocationConstraint=ap-northeast-1

# 1つ目のLambda関数を作成します
$ STACK_NAME_1=iam-user-create-request-lambda-01
$ aws cloudformation package --s3-bucket ${BUCKET_NAME_1} \
    --template-file template/slack-iam-user-create-request-handler.yaml \
    --output-template-file template/slack-iam-user-create-request-handler-packaged.yaml
$ cd template/
$ aws cloudformation deploy --stack-name ${STACK_NAME_1} \
    --template-file template/slack-iam-user-create-request-handler-packaged.yaml \
    --capabilities CAPABILITY_IAM

# 2つ目のLambda関数を作成します
$ STACK_NAME_2=iam-user-create-excute-lambda-01
$ aws cloudformation package --s3-bucket ${BUCKET_NAME_2} \
    --template-file template/slack-iam-user-create-excute-handler.yaml \
    --output-template-file template/slack-iam-user-create-excute-handler-packaged.yaml
$ cd template/
$ aws cloudformation deploy --stack-name ${STACK_NAME_2} \
    --template-file ./slack-iam-user-create-excute-handler-packaged.yaml \
    --capabilities CAPABILITY_IAM

次の工程で利用するため、以下のコマンドを実行し、Lambda関数のARNをシェル変数に設定してください。

$ FUNC_ARN=$(aws lambda get-function \
    --function-name slack-iam-user-create-request-handler \
    --query "Configuration.FunctionArn" \
    --output text)
$ echo $FUNC_ARN

3. API Gatewayの作成

AWS Cloud Shell環境にアクセスし、以下のコマンドを実行してください。

# API Gatewayを作成します
$ STACK_NAME_3=iam-user-create-excute-apigw-01
$ aws cloudformation deploy --stack-name ${STACK_NAME_3} \
    --template-file template/slack-iam-user-create-request-apigw.yaml \
    --parameter-overrides FunctionArn=${FUNC_ARN} \
    --capabilities CAPABILITY_IAM

次の工程で利用するため、以下のコマンドを実行し、API GatewayのURLを取得してください。

# 作成したAPI GatewayからURL情報を生成します
$ REST_API_ID=$(aws apigateway get-rest-apis \
    --query 'items[?name==`slack-iam-user-create-apigw`].id' \
    --output text)
$ API_URL=https://${REST_API_ID}.execute-api.ap-northeast-1.amazonaws.com/v1

# シェル変数に格納されたAPI GatewayのURLを表示します
$ echo $API_URL

4. Slackの設定、Slack Signing Secretの取得

作成したAWS API GatewayにSlackからアクセスできるよう、Slack App画面から設定を行います。また後段で使用するため、合わせて Signing Secret の値を取得します。

なお、本項で添付する画面キャプチャの内容は、Slackの更新などによって変更される場合があります。その場合は、利用者の判断のもと、作業内容を適宜修正したうえで実施してください。

  • From scratchを選択してください

  • App nameを入力して下さい (例: CreateIAMUser)。
  • 本ツールを利用可能とするSlackワークスペースを選択してください

  • Slack Appが作成されてら、画面左メニュー Slach Commands を選択してください

  • 必要な項目を以下のように入力してください
    • Command
    • Request URL(API GatewayのURL)
    • Short Description
    • Usage Hint
    • Escape channels, users, and links sent to your app
  • 入力後、画面右下の Save を選択してください。

  • Slashコマンドの作成を完了したら、画面左メニューの Basic Information を選択してください。

  • 画面中程の App Credentials にある Signing Secret に移動し、 Show を選択してください。

  • 設定中の Signing Secret が表示されるので、値を確認し、 必要に応じてメモに記録してください。ただし秘匿情報となるため、使用後は速やかにメモを削除してください。

  • 最後に Slack アプリをワークスペース内で有効化することで、コマンドが使用可能になります。

5. Secrets Managerへの登録

API Gatewayへのアクセスをセキュアにするため、前段で取得したSigning SecretをAWS Secrets Managerに登録します。

AWS Cloud Shell環境にアクセスし、以下のコマンドを実行してください。

# Secrets Managerにリソースを作成します
$ cat <<EOF > secret.json
{
    "key": "<取得したSlack Signing Secretを設定してください>"
}
EOF

$ aws secretsmanager create-secret \
  --region ap-northeast-1 \
  --name slack_for_iam_user_create_auth \
  --secret-string file://secret.json

$ rm secret.json


# 想定通りSecrets Managerにリソースが作成されたかを確認します。エラーが返されなければリソースは作成されています
$ aws secretsmanager describe-secret \
    --secret-id slack_for_iam_user_create_auth

6. 動作確認

  • Slack上の任意のチャンネルから、/createiamuser コマンドを入力してください。その時、項番3で設定したコマンドやUsage Hintが表示されるかを確認してください。
  • 次に、実際にSlackからIAMユーザの作成を実行してください。正しいコマンドを実行した場合、Slackから以下のようなレスポンスが返されます。

<IAMユーザ名> <IAMグループ> <パスワード>

おわりに

将来的には一撃(stackテンプレ一つ)で環境構築できるようにしたいなと思ってます

お知らせ

APCはAWSセレクトティアサービスパートナー認定を受けております。

その中で私達クラウド事業部はAWSなどのクラウド技術を活用したSI/SESのご支援をしております。

https://www.ap-com.co.jp/service/utilize-aws/

また、一緒に働いていただける仲間も募集中です!
今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。

www.ap-com.co.jp

本記事の投稿者: y-shimizu
AWSをメインにインフラ系のご支援を担当しています。 https://www.credly.com/users/giiiiiyu777/badges