

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 对适用于 RabbitMQ 的亚马逊 MQ 使用 IAM 身份验证和授权
<a name="rabbitmq-iam-tutorial"></a>

以下过程演示如何为 Amazon MQ for RabbitMQ 代理启用 AWS IAM 身份验证和授权。启用 IAM 后，用户可以使用 AWS IAM 凭证进行身份验证，以访问 RabbitMQ 管理 API 并通过 AMQP 进行连接。有关 IAM 身份验证如何与适用于 RabbitMQ 的 Amazon MQ 配合使用的详细信息，请参阅。[适用于 RabbitMQ 的亚马逊 MQ 的 IAM 身份验证和授权](iam-for-amq-for-rabbitmq.md)

## 先决条件
<a name="iam-tutorial-prerequisites"></a>
+ AWS 拥有 Amazon MQ for RabbitMQ 经纪商的 AWS 账户的管理员证书
+ 使用这些管理员凭据（使用 AWS CLI 配置文件或环境变量）配置的 shell 环境
+ AWS 已安装并配置 CLI
+ `jq`已安装命令行 JSON 处理器
+ `curl`已安装命令行工具

## 使用配置 IAM 身份验证和授权 AWS CLI
<a name="iam-tutorial-procedure"></a>

1. **设置环境变量**

   为您的经纪商设置所需的环境变量：

   ```
   export AWS_DEFAULT_REGION=<region>
   export BROKER_ID=<broker-id>
   ```

1. **启用出站 JWT 令牌**

   为您的 AWS 账户启用出站 Web 联合身份验证：

   ```
   ISSUER_IDENTIFIER=$(aws iam enable-outbound-web-identity-federation --query 'IssuerIdentifier' --output text)
   echo $ISSUER_IDENTIFIER
   ```

   输出以以下格式显示您账户的唯一发行人标识符网址`https://<id>.tokens.sts.global.api.aws`。

1. **创建 IAM 策略文档**

   创建授予获取 Web 身份令牌权限的策略文档：

   ```
   cat > policy.json << 'EOF'
   {
       "Version": "2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "VisualEditor0",
               "Effect": "Allow",
               "Action": [
                   "sts:GetWebIdentityToken",
                   "sts:TagGetWebIdentityToken"
               ],
               "Resource": "*"
           }
       ]
   }
   EOF
   ```

1. **创建信任策略**

   检索您的来电者身份并创建信任策略文档：

   ```
   CALLER_ARN=$(aws sts get-caller-identity --query Arn --output text)
   cat > trust-policy.json << EOF
   {
       "Version": "2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Principal": {
                   "AWS": "$CALLER_ARN"
               },
               "Action": "sts:AssumeRole"
           }
       ]
   }
   EOF
   ```

1. **创建 IAM 角色**

   创建 IAM 角色并附加策略：

   ```
   aws iam create-role --role-name RabbitMqAdminRole --assume-role-policy-document file://trust-policy.json
   aws iam put-role-policy --role-name RabbitMqAdminRole --policy-name RabbitMqAdminRolePolicy --policy-document file://policy.json
   ```

1. **配置 RabbitMQ OAuth2 设置**

   使用 OAuth2 身份验证和授权设置创建 RabbitMQ 配置文件：

   ```
   cat > rabbitmq.conf << EOF
   auth_backends.1 = oauth2
   auth_backends.2 = internal
   
   auth_oauth2.jwks_url = ${ISSUER_IDENTIFIER}/.well-known/jwks.json
   auth_oauth2.resource_server_id = rabbitmq
   auth_oauth2.scope_prefix = rabbitmq/
   
   auth_oauth2.additional_scopes_key = sub
   auth_oauth2.scope_aliases.1.alias = arn:aws:iam::$(aws sts get-caller-identity --query Account --output text):role/RabbitMqAdminRole
   auth_oauth2.scope_aliases.1.scope = rabbitmq/tag:administrator rabbitmq/read:*/* rabbitmq/write:*/* rabbitmq/configure:*/*
   auth_oauth2.https.hostname_verification = wildcard
   
   management.oauth_enabled = true
   EOF
   ```

1. **更新代理配置**

   将新配置应用于您的经纪商：

   ```
   # Retrieve the configuration ID
   CONFIG_ID=$(aws mq describe-broker --broker-id $BROKER_ID --query 'Configurations[0].Id' --output text)
   
   # Create a new configuration revision
   REVISION=$(aws mq update-configuration --configuration-id $CONFIG_ID --data "$(cat rabbitmq.conf | base64 --wrap=0)" --query 'LatestRevision.Revision' --output text)
   
   # Apply the configuration to the broker
   aws mq update-broker --broker-id $BROKER_ID --configuration Id=$CONFIG_ID,Revision=$REVISION
   
   # Reboot the broker to apply changes
   aws mq reboot-broker --broker-id $BROKER_ID
   ```

   等待代理状态恢复到`RUNNING`后再继续下一步。

1. **获取 JWT 代币**

   担任 IAM 角色并获取 Web 身份令牌：

   ```
   # Assume the RabbitMqAdminRole
   ROLE_CREDS=$(aws sts assume-role --role-arn arn:aws:iam::$(aws sts get-caller-identity --query Account --output text):role/RabbitMqAdminRole --role-session-name rabbitmq-session)
   
   # Configure the session with temporary credentials
   export AWS_ACCESS_KEY_ID=$(echo "$ROLE_CREDS" | jq -r '.Credentials.AccessKeyId')
   export AWS_SECRET_ACCESS_KEY=$(echo "$ROLE_CREDS" | jq -r '.Credentials.SecretAccessKey')
   export AWS_SESSION_TOKEN=$(echo "$ROLE_CREDS" | jq -r '.Credentials.SessionToken')
   
   # Obtain the web identity token
   TOKEN_RESPONSE=$(aws sts get-web-identity-token \
       --audience "rabbitmq" \
       --signing-algorithm ES384 \
       --duration-seconds 300 \
       --tags Key=scope,Value="rabbitmq/tag:administrator")
   
   # Extract the token
   TOKEN=$(echo "$TOKEN_RESPONSE" | jq -r '.WebIdentityToken')
   ```

1. **访问 RabbitMQ 管理 API**

   使用 JWT 令牌访问 RabbitMQ 管理 API：

   ```
   BROKER_URL=<broker-id>.mq.<region>.on.aws
   
   curl -u ":$TOKEN" \
       -X GET https://${BROKER_URL}/api/overview \
       -H "Content-Type: application/json"
   ```

   成功的响应确认 IAM 身份验证工作正常。响应包含 JSON 格式的经纪商概述信息。

1. **使用 JWT 令牌通过 AMQP 进行连接**

   使用带有性能测试工具的 JWT 令牌测试 AMQP 连接：

   ```
   BROKER_DNS=<broker-endpoint>
   CONNECTION_STRING=amqps://:${TOKEN}@${BROKER_DNS}:5671
   
   docker run -it --rm --ulimit nofile=40960:40960 pivotalrabbitmq/perf-test:latest \
       --queue-pattern 'test-queue-%d' --queue-pattern-from 1 --queue-pattern-to 1 \
       --producers 1 --consumers 1 \
       --uri ${CONNECTION_STRING} \
       --flag persistent --rate 1
   ```

   如果您收到`ACCESS_REFUSED`错误，则可以使用代理 CloudWatch 日志对配置设置进行故障排除。您可以在 Amazon MQ 控制台中找到您的代理的 CloudWatch 日志日志组链接。