

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# RabbitMQ のチュートリアル
<a name="rabbitmq-on-amazon-mq"></a>

以下のチュートリアルでは、Amazon MQ で RabbitMQ を設定して使用する方法を説明します。サポートされているクライアントライブラリを Node.js、Python、.NET などのさまざまなプログラミング言語で使用する方法の詳細については、「*RabbitMQ Getting Started Guide*」の「[RabbitMQ Tutorials](https://www.rabbitmq.com/getstarted.html)」を参照してください。

**Topics**
+ [ブローカー設定の編集](amazon-mq-rabbitmq-editing-broker-preferences.md)
+ [Amazon MQ for RabbitMQ でPython Pika を使う](amazon-mq-rabbitmq-pika.md)
+ [RabbitMQ の一時停止されたキュー同期の解決](rabbitmq-queue-sync.md)
+ [接続およびチャネルの数の削減](reducing-connections-and-channels.md)
+ [ステップ 2: ブローカーに JVM ベースのアプリケーションを接続する](#rabbitmq-connect-jvm-application)
+ [Connect your Amazon MQ for RabbitMQ broker to Lambda](#rabbitmq-connect-to-lambda)
+ [Amazon MQ for RabbitMQ での OAuth 2.0 認証と認可の使用](oauth-tutorial.md)
+ [Amazon MQ for RabbitMQ での IAM 認証と認可の使用](rabbitmq-iam-tutorial.md)
+ [Amazon MQ for RabbitMQ での LDAP 認証と認可の使用](rabbitmq-ldap-tutorial.md)
+ [Amazon MQ for RabbitMQ での HTTP 認証と認可の使用](rabbitmq-http-tutorial.md)
+ [Amazon MQ for RabbitMQ での SSL 証明書認証の使用](rabbitmq-ssl-tutorial.md)
+ [AMQP および管理エンドポイントに mTLS を使用する](rabbitmq-mtls-tutorial.md)
+ [JMS アプリケーションを接続する](rabbitmq-tutorial-jms.md)

## ステップ 2: ブローカーに JVM ベースのアプリケーションを接続する
<a name="rabbitmq-connect-jvm-application"></a>

 RabbitMQ ブローカーを作成したら、ブローカーにアプリケーションを接続できます。以下の例では、[RabbitMQ Java クライアントライブラリ](https://www.rabbitmq.com/java-client.html)を使用してブローカーへの接続を作成し、キューを作成して、メッセージを送信する方法を説明します。RabbitMQ ブローカーには、サポートされているさまざまな言語の RabbitMQ クライアントライブラリを使用して接続することができます。サポートされている RabbitMQ クライアントライブラリの詳細については、「[RabbitMQ client libraries and developer tools](https://www.rabbitmq.com/devtools.html)」を参照してください。

### 前提条件
<a name="rabbitmq-connect-application-prerequisites-getting-started"></a>

**注記**  
以下の前提条件ステップは、パブリックアクセシビリティなしで作成された RabbitMQ ブローカーのみに適用されます。パブリックアクセシビリティがあるブローカーを作成している場合は、スキップすることができます。

#### VPC 属性 を有効にする
<a name="rabbitmq-connect-application-enable-vpc-attributes-getting-started"></a>

VPC 内でブローカーにアクセスできることを確実にするには、`enableDnsHostnames` および `enableDnsSupport` VPC 属性を有効にする必要があります。詳細については、*Amazon VPC ユーザーガイド*の「[VPC の DNS サポート](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html#vpc-dns-support)」を参照してください。

#### インバウンド接続を有効にする
<a name="rabbitmq-connect-application-allow-inbound-connections-getting-started"></a>

1. [Amazon MQ コンソール](https://console.aws.amazon.com/amazon-mq/)にサインインします。

1. ブローカーのリストからブローカーの名前 (**MyBroker** など) を選択します。

1. [***MyBroker***] ページの [**Connections**] (接続) セクションで、ブローカーのウェブコンソール URL とワイヤレベルプロトコルのアドレスとポートをメモします。

1. [**Details**] (詳細) セクションの [**Security and network**] (セキュリティとネットワーク) で、セキュリティグループの名前または ![\[Pencil icon indicating an edit or modification action.\]](http://docs.aws.amazon.com/ja_jp/amazon-mq/latest/developer-guide/images/amazon-mq-tutorials-broker-details-link.png) をクリックします。

   EC2 ダッシュボードの [**セキュリティグループ**] ページが表示されます。

1. セキュリティグループのリストから、セキュリティグループを選択します。

1. ページ下部で、[**インバウンド**] を選択し、次に [**編集**] を選択します。

1. [**Edit inbound rules**] (インバウンドルールの編集) ダイアログボックスで、パブリックアクセスを許可する URL またはエンドポイントごとにルールを追加します (以下の例は、これをブローカーのウェブコンソールに対して行う方法を説明しています)。

   1. **[ルールの追加]** を選択します。

   1. [**タイプ**] で、[**カスタム TCP**] を選択します。

   1. [**Source**] (ソース) では、[**Custom**] (カスタム) が選択された状態のままにしておき、ウェブコンソールにアクセスできるようにするシステムの IP アドレスを入力します (`192.0.2.1` など)。

   1. [**Save**] (保存) をクリックします。

      これで、ブローカーはインバウンド接続を受け入れることができます。

#### Java の依存関係を追加する
<a name="rabbitmq-connect-application-java-dependencies-getting-started"></a>

ビルドの自動化のために Apache Maven を使用している場合は、以下の依存関係を `pom.xml` ファイルに追加します。Apache Maven のプロジェクトオブジェクトモデルファイルの詳細については、「[Introduction to the POM](https://maven.apache.org/guides/introduction/introduction-to-the-pom.html)」を参照してください。

```
<dependency>
    <groupId>com.rabbitmq</groupId>
    <artifactId>amqp-client</artifactId>
    <version>5.9.0</version>
</dependency>
```

ビルドの自動化のために [Gradle](https://docs.gradle.org/current/userguide/userguide.html) を使用している場合は、以下の依存関係を宣言します。

```
dependencies {
    compile 'com.rabbitmq:amqp-client:5.9.0'
}
```

#### `Connection` と `Channel` クラスをインポートする
<a name="rabbitmq-import-connections-and-channels"></a>

 RabbitMQ Java クライアントは、そのトップレベルパッケージとして `com.rabbitmq.client` を使用し、それぞれが AMQP 0-9-1 接続とチャネルを表す `Connection` および `Channel` API クラスがあります。以下の例にあるように、使用する前に `Connection` と `Channel` クラスをインポートします。

```
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.Channel;
```

#### `ConnectionFactory` を作成してブローカーに接続する
<a name="rabbitmq-create-connection-factory-and-connect"></a>

以下の例を使用して、所定のパラメータで `ConnectionFactory` クラスのインスタンスを作成します。`setHost` メソッドを使用して、先ほどメモしておいたブローカーエンドポイントを設定します。`AMQPS` のワイヤレベル接続には、ポート `5671` を使用します。

```
ConnectionFactory factory = new ConnectionFactory();

factory.setUsername(username);
factory.setPassword(password);

//Replace the URL with your information
factory.setHost("b-c8352341-ec91-4a78-ad9c-a43f23d325bb.mq.us-west-2.amazonaws.com");
factory.setPort(5671);

// Allows client to establish a connection over TLS
factory.useSslProtocol();

// Create a connection
Connection conn = factory.newConnection();

// Create a channel
Channel channel = conn.createChannel();
```

#### エクスチェンジにメッセージを発行する
<a name="rabbitmq-publish-message"></a>

 エクスチェンジにメッセージを発行するには、`Channel.basicPublish` を使用できます。以下の例では、AMQP `Builder` クラスを使用して、content-type が `plain/text` のメッセージプロパティオブジェクトを構築します。

```
byte[] messageBodyBytes = "Hello, world!".getBytes();
channel.basicPublish(exchangeName, routingKey,
             new AMQP.BasicProperties.Builder()
               .contentType("text/plain")
               .userId("userId")
               .build(),
               messageBodyBytes);
```

**注記**  
`BasicProperties` は自動生成されたホルダークラス `AMQP` の内部クラスであることに注意してください。

#### キューにサブスクライブしてメッセージを受信する
<a name="rabbitmq-subscribe-receive-message"></a>

メッセージは、`Consumer` インターフェイスを使用してキューにサブスクライブすることによって受信できます。サブスクライブすると、メッセージが到着すると同時に自動配信されます。

`Consumer` を実装する最も簡単な方法は、サブクラス `DefaultConsumer` の使用です。以下の例にあるように、`DefaultConsumer` オブジェクトは、サブスクリプションをセットアップするための `basicConsume` コールの一部として渡すことがきます。

```
boolean autoAck = false;
channel.basicConsume(queueName, autoAck, "myConsumerTag",
     new DefaultConsumer(channel) {
         @Override
         public void handleDelivery(String consumerTag,
                                    Envelope envelope,
                                    AMQP.BasicProperties properties,
                                    byte[] body)
             throws IOException
         {
             String routingKey = envelope.getRoutingKey();
             String contentType = properties.getContentType();
             long deliveryTag = envelope.getDeliveryTag();
             // (process the message components here ...)
             channel.basicAck(deliveryTag, false);
         }
     });
```

**注記**  
`autoAck = false` を指定したので、`Consumer` に配信されたメッセージを承認する必要があります。これは、上記の例にあるように、`handleDelivery` で実行することが最も便利です。

#### 接続を閉じてブローカーへの接続を切断する
<a name="rabbitmq-disconnect"></a>

RabbitMQ ブローカーへの接続を切断するには、以下に示すように、チャネルと接続の両方を閉じます。

```
channel.close();
conn.close();
```

**注記**  
RabbitMQ Java クライアントライブラリの使用に関する詳細については、[RabbitMQ Java Client API Guide](https://www.rabbitmq.com/api-guide.html) を参照してください。

## ステップ 3: (オプション) AWS Lambda 関数に接続する
<a name="rabbitmq-connect-to-lambda"></a>

 AWS Lambda は Amazon MQ ブローカーに接続して、Amazon MQ ブローカーからのメッセージを消費できます。ブローカーを Lambda に接続するときは、キューからメッセージを読み取り、関数 [synchronously](https://docs.aws.amazon.com/lambda/latest/dg/invocation-sync.html) を呼び出す[イベントソースマッピング](https://docs.aws.amazon.com/lambda/latest/dg/invocation-eventsourcemapping.html)を作成します。作成するイベントソースマッピングは、ブローカーからメッセージをバッチで読み取り、それらを JSON オブジェクト形式の Lambda ペイロードに変換します。

**ブローカーを Lambda 関数に接続する**

1. Lambda 関数 [execution role](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html) に以下の IAM ロール許可を追加します。
   + [ mq:DescribeBroker ](https://docs.aws.amazon.com/amazon-mq/latest/api-reference/brokers-broker-id.html#brokers-broker-id-http-methods)
   + [ec2:CreateNetworkInterface](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateNetworkInterface.html)
   + [ec2:DeleteNetworkInterface](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteNetworkInterface.html)
   + [ec2:DescribeNetworkInterfaces](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeNetworkInterfaces.html)
   + [ec2:DescribeSecurityGroups](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeSecurityGroups.html)
   + [ec2:DescribeSubnets](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeSubnets.html)
   + [ec2:DescribeVpcs](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeVpcs.html)
   + [logs:CreateLogGroup](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_CreateLogGroup.html)
   + [logs:CreateLogStream](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_CreateLogStream.html)
   + [logs:PutLogEvents](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutLogEvents.html)
   + [secretsmanager:GetSecretValue](https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html)
**注記**  
必要な IAM 許可がない場合、関数は Amazon MQ リソースからレコードを正常に読み取ることができません。

1.  (オプション) パブリックアクセシビリティがないブローカーを作成した場合は、次のいずれかを実行して、Lambda のブローカーへの接続を許可する必要があります。
   +  パブリックサブネットごとに 1 つの NAT ゲートウェイを設定します。詳細については、*AWS Lambda デベロッパーガイド*の「[VPC に接続した関数のインターネットアクセスとサービスアクセス](https://docs.aws.amazon.com/lambda/latest/dg/configuration-vpc.html#vpc-internet)」を参照してください。
   + VPC エンドポイントを使用して、Amazon Virtual Private Cloud (Amazon VPC) と Lambda 間の接続を作成します。Amazon VPC は、 AWS Security Token Service (AWS STS) および Secrets Manager エンドポイントにも接続する必要があります。詳細については、*AWS Lambda デベロッパーガイド*の「[Lambda のインターフェイス VPC エンドポイントの設定](https://docs.aws.amazon.com/lambda/latest/dg/configuration-vpc-endpoints.html)」を参照してください。

1.  AWS マネジメントコンソールを使用して、Lambda 関数の[イベントソースとしてブローカーを設定](https://docs.aws.amazon.com/lambda/latest/dg/with-mq.html#services-mq-eventsourcemapping)します。[https://docs.aws.amazon.com/cli/latest/reference/lambda/create-event-source-mapping.html](https://docs.aws.amazon.com/cli/latest/reference/lambda/create-event-source-mapping.html) AWS Command Line Interface コマンドを使用することもできます。

1.  ブローカーから取り込まれたメッセージを処理するための Lambda 関数のコードをいくつか記述します。イベントソースマッピングによって取得される Lambda ペイロードは、ブローカーのエンジンタイプに依存します。以下は、Amazon MQ for RabbitMQ キューの Lambda ペイロードの例です。
**注記**  
 この例では、`test` がキューの名前で、`/` がデフォルト仮想ホストの名前です。メッセージを受信すると、イベントソースは `test::/` の下にメッセージを一覧表示します。

   ```
   {
     "eventSource": "aws:rmq",
     "eventSourceArn": "arn:aws:mq:us-west-2:112556298976:broker:test:b-9bcfa592-423a-4942-879d-eb284b418fc8",
     "rmqMessagesByQueue": {
       "test::/": [
         {
           "basicProperties": {
             "contentType": "text/plain",
             "contentEncoding": null,
             "headers": {
               "header1": {
                 "bytes": [
                   118,
                   97,
                   108,
                   117,
                   101,
                   49
                 ]
               },
               "header2": {
                 "bytes": [
                   118,
                   97,
                   108,
                   117,
                   101,
                   50
                 ]
               },
               "numberInHeader": 10
             }
             "deliveryMode": 1,
             "priority": 34,
             "correlationId": null,
             "replyTo": null,
             "expiration": "60000",
             "messageId": null,
             "timestamp": "Jan 1, 1970, 12:33:41 AM",
             "type": null,
             "userId": "AIDACKCEVSQ6C2EXAMPLE",
             "appId": null,
             "clusterId": null,
             "bodySize": 80
           },
           "redelivered": false,
           "data": "eyJ0aW1lb3V0IjowLCJkYXRhIjoiQ1pybWYwR3c4T3Y0YnFMUXhENEUifQ=="
         }
       ]
     }
   }
   ```

Amazon MQ の Lambda への接続、Amazon MQ イベントソースに対して Lambda がサポートするオプション、およびイベントソースマッピングエラーに関する詳細については、「*AWS Lambda デベロッパーガイド*」の「[Amazon MQ で Lambda を使用する](https://docs.aws.amazon.com/lambda/latest/dg/with-mq.html)」を参照してください。