관리형 모니터링 워크스페이스 생성하기
관리형 모니터링 워크스페이스 생성하기
이 코드 예제에서는 Amazon Managed Grafana 워크스페이스를 만들고 설정하는 방법을 보여드려요.
출처: 문서
본문
- 워크스페이스용 IAM 역할 생성
- Grafana 워크스페이스 생성
- 인증(SAML) 구성
- 선택적 설정 구성
- 리소스 정리
Bash (AWS CLI with Bash script)
Note GitHub에 더 많은 내용이 있어요. 전체 예제와 설정·실행 방법은 Sample developer tutorials 저장소에서 확인할 수 있어요.
이 스크립트는 Amazon Managed Grafana 워크스페이스를 생성하고 CloudWatch 데이터 소스를 사용할 수 있게 IAM 역할·정책을 연결해요.
#!/bin/bash
# Amazon Managed Grafana Workspace Creation Script
# This script creates an Amazon Managed Grafana workspace and configures it
# Set up logging
LOG_FILE="grafana-workspace-creation.log"
exec > >(tee -a "$LOG_FILE") 2>&1
echo "Starting Amazon Managed Grafana workspace creation script at $(date)"
echo "All commands and outputs will be logged to $LOG_FILE"
# Function to check for errors in command output
check_error() {
local output=$1
local cmd=$2
if echo "$output" | grep -i "error\|exception\|fail" > /dev/null; then
echo "ERROR: Command '$cmd' failed with output:"
echo "$output"
cleanup_on_error
exit 1
fi
}
# Function to clean up resources on error
cleanup_on_error() {
echo "Error encountered. Attempting to clean up resources..."
if [ -n "$WORKSPACE_ID" ]; then
echo "Deleting workspace $WORKSPACE_ID..."
aws grafana delete-workspace --workspace-id "$WORKSPACE_ID"
fi
if [ -n "$ROLE_NAME" ]; then
echo "Detaching policies from role $ROLE_NAME..."
if [ -n "$POLICY_ARN" ]; then
aws iam detach-role-policy --role-name "$ROLE_NAME" --policy-arn "$POLICY_ARN"
fi
echo "Deleting role $ROLE_NAME..."
aws iam delete-role --role-name "$ROLE_NAME"
fi
if [ -n "$POLICY_ARN" ]; then
echo "Deleting policy..."
aws iam delete-policy --policy-arn "$POLICY_ARN"
fi
# Clean up JSON files
rm -f trust-policy.json cloudwatch-policy.json
echo "Cleanup completed. See $LOG_FILE for details."
}
# Generate a random identifier for resource names
RANDOM_ID=$(openssl rand -hex 4)
WORKSPACE_NAME="GrafanaWorkspace-${RANDOM_ID}"
ROLE_NAME="GrafanaWorkspaceRole-${RANDOM_ID}"
echo "Using workspace name: $WORKSPACE_NAME"
echo "Using role name: $ROLE_NAME"
# Step 1: Get AWS account ID
echo "Getting AWS account ID..."
ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
check_error "$ACCOUNT_ID" "get-caller-identity"
echo "AWS Account ID: $ACCOUNT_ID"
# Step 2: Create IAM role for Grafana workspace
echo "Creating IAM role for Grafana workspace..."
# Create trust policy document
cat > trust-policy.json << EOF
{
"Version":"2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "grafana.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
EOF
# Create IAM role
ROLE_OUTPUT=$(aws iam create-role \
--role-name "$ROLE_NAME" \
--assume-role-policy-document file://trust-policy.json \
--description "Role for Amazon Managed Grafana workspace")
check_error "$ROLE_OUTPUT" "create-role"
aws iam tag-role --role-name "$ROLE_NAME" \
--tags Key=project,Value=doc-smith Key=tutorial,Value=amazon-managed-grafana-gs
echo "IAM role created successfully"
# Extract role ARN
ROLE_ARN=$(echo "$ROLE_OUTPUT" | grep -o '"Arn": "[^"]*' | cut -d'"' -f4)
echo "Role ARN: $ROLE_ARN"
# Attach policies to the role
echo "Attaching policies to the role..."
# CloudWatch policy
cat > cloudwatch-policy.json << EOF
{
"Version":"2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"cloudwatch:DescribeAlarmsForMetric",
"cloudwatch:DescribeAlarmHistory",
"cloudwatch:DescribeAlarms",
"cloudwatch:ListMetrics",
"cloudwatch:GetMetricStatistics",
"cloudwatch:GetMetricData"
],
"Resource": "*"
}
]
}
EOF
POLICY_OUTPUT=$(aws iam create-policy \
--policy-name "GrafanaCloudWatchPolicy-${RANDOM_ID}" \
--policy-document file://cloudwatch-policy.json)
check_error "$POLICY_OUTPUT" "create-policy"
POLICY_ARN=$(echo "$POLICY_OUTPUT" | grep -o '"Arn": "[^"]*' | cut -d'"' -f4)
echo "CloudWatch policy ARN: $POLICY_ARN"
ATTACH_OUTPUT=$(aws iam attach-role-policy \
--role-name "$ROLE_NAME" \
--policy-arn "$POLICY_ARN")
check_error "$ATTACH_OUTPUT" "attach-role-policy"
echo "CloudWatch policy attached to role"
# Step 3: Create the Grafana workspace
echo "Creating Amazon Managed Grafana workspace..."
WORKSPACE_OUTPUT=$(aws grafana create-workspace \
--workspace-name "$WORKSPACE_NAME" \
--authentication-providers "SAML" \
--permission-type "CUSTOMER_MANAGED" \
--account-access-type "CURRENT_ACCOUNT" \
--workspace-role-arn "$ROLE_ARN" \
--workspace-data-sources "CLOUDWATCH" "PROMETHEUS" "XRAY" \
--grafana-version "10.4" \
--tags Environment=Development,project=doc-smith,tutorial=amazon-managed-grafana-gs)
check_error "$WORKSPACE_OUTPUT" "create-workspace"
echo "Workspace creation initiated:"
echo "$WORKSPACE_OUTPUT"
# Extract workspace ID
WORKSPACE_ID=$(echo "$WORKSPACE_OUTPUT" | grep -o '"id": "[^"]*' | cut -d'"' -f4)
if [ -z "$WORKSPACE_ID" ]; then
echo "ERROR: Failed to extract workspace ID from output"
exit 1
fi
echo "Workspace ID: $WORKSPACE_ID"
# Step 4: Wait for workspace to become active
echo "Waiting for workspace to become active. This may take several minutes..."
ACTIVE=false
MAX_ATTEMPTS=30
ATTEMPT=0
while [ $ACTIVE = false ] && [ $ATTEMPT -lt $MAX_ATTEMPTS ]; do
ATTEMPT=$((ATTEMPT+1))
echo "Checking workspace status (attempt $ATTEMPT of $MAX_ATTEMPTS)..."
DESCRIBE_OUTPUT=$(aws grafana describe-workspace --workspace-id "$WORKSPACE_ID")
check_error "$DESCRIBE_OUTPUT" "describe-workspace"
STATUS=$(echo "$DESCRIBE_OUTPUT" | grep -o '"status": "[^"]*' | cut -d'"' -f4)
echo "Current status: $STATUS"
if [ "$STATUS" = "ACTIVE" ]; then
ACTIVE=true
echo "Workspace is now ACTIVE"
elif [ "$STATUS" = "FAILED" ]; then
echo "ERROR: Workspace creation failed"
cleanup_on_error
exit 1
else
echo "Workspace is still being created. Waiting 30 seconds..."
sleep 30
fi
done
if [ $ACTIVE = false ]; then
echo "ERROR: Workspace did not become active within the expected time"
cleanup_on_error
exit 1
fi
# Extract workspace endpoint URL
WORKSPACE_URL=$(echo "$DESCRIBE_OUTPUT" | grep -o '"endpoint": "[^"]*' | cut -d'"' -f4)
echo "Workspace URL: https://$WORKSPACE_URL"
# Step 5: Display workspace information
echo ""
echo "==========================================="
echo "WORKSPACE INFORMATION"
echo "==========================================="
echo "Workspace ID: $WORKSPACE_ID"
echo "Workspace URL: https://$WORKSPACE_URL"
echo "Workspace Name: $WORKSPACE_NAME"
echo "IAM Role: $ROLE_NAME"
echo ""
echo "Note: Since SAML authentication is used, you need to configure SAML settings"
echo "using the AWS Management Console or the update-workspace-authentication command."
echo "==========================================="
# Step 6: Prompt for cleanup
echo ""
echo "==========================================="
echo "CLEANUP CONFIRMATION"
echo "==========================================="
echo "Resources created:"
echo "- Amazon Managed Grafana workspace: $WORKSPACE_ID"
echo "- IAM Role: $ROLE_NAME"
echo "- IAM Policy: GrafanaCloudWatchPolicy-${RANDOM_ID}"
echo ""
echo "Do you want to clean up all created resources? (y/n): "
read -r CLEANUP_CHOICE
if [[ "$CLEANUP_CHOICE" =~ ^[Yy] ]]; then
echo "Cleaning up resources..."
echo "Deleting workspace $WORKSPACE_ID..."
DELETE_OUTPUT=$(aws grafana delete-workspace --workspace-id "$WORKSPACE_ID")
check_error "$DELETE_OUTPUT" "delete-workspace"
echo "Waiting for workspace to be deleted..."
DELETED=false
ATTEMPT=0
while [ $DELETED = false ] && [ $ATTEMPT -lt $MAX_ATTEMPTS ]; do
ATTEMPT=$((ATTEMPT+1))
echo "Checking deletion status (attempt $ATTEMPT of $MAX_ATTEMPTS)..."
if aws grafana describe-workspace --workspace-id "$WORKSPACE_ID" 2>&1 | grep -i "not found\|does not exist" > /dev/null; then
DELETED=true
echo "Workspace has been deleted"
else
echo "Workspace is still being deleted. Waiting 30 seconds..."
sleep 30
fi
done
if [ $DELETED = false ]; then
echo "WARNING: Workspace deletion is taking longer than expected. It may still be in progress."
fi
# Detach policy from role
echo "Detaching policy from role..."
aws iam detach-role-policy \
--role-name "$ROLE_NAME" \
--policy-arn "$POLICY_ARN"
# Delete policy
echo "Deleting IAM policy..."
aws iam delete-policy \
--policy-arn "$POLICY_ARN"
# Delete role
echo "Deleting IAM role..."
aws iam delete-role \
--role-name "$ROLE_NAME"
# Clean up JSON files
rm -f trust-policy.json cloudwatch-policy.json
echo "Cleanup completed"
else
echo "Skipping cleanup. Resources will remain in your AWS account."
fi
echo "Script completed at $(date)"
API 상세는 AWS CLI Command Reference의 다음 항목을 참고해요.
AttachRolePolicy,CreatePolicy,CreateRole,CreateWorkspace,DeletePolicy,DeleteRole,DeleteWorkspace,DescribeWorkspace,DetachRolePolicy,GetCallerIdentity