はじめに
こんにちは、クラウド事業部の清水(雄)です。
今年サービス開発したAWS運用自動化ツール(Chatops)の基本設計と実装手順を記載させて頂きます。
今回はSlackでコマンド叩けば「IAMユーザ作成」が可能なツールが対象です。
手順に記載している各種テンプレートやソースは以下アンケートにお答え頂けるとダウンロードできる仕様となります。
よろしかったらお試しください。
目次
基本設計
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の更新などによって変更される場合があります。その場合は、利用者の判断のもと、作業内容を適宜修正したうえで実施してください。
- Slack App画面 (https://api.slack.com/apps) にアクセスしてください
- Create an Appを選択してください
- 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/
また、一緒に働いていただける仲間も募集中です!
今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。