【実践&検証】Sandboxの更新

はじめに

こんにちは!株式会社オプトプランニングです。
Salesforce(Salesforce.com/セールスフォース・ドットコム、略してSFDC)であれこれやってみたことを書いていきます。

先日、Sandboxの更新を初めて行いました。
その際、テスト用に作成していたレコードがSandbox更新後になくなってしまいました…(泣)

そこで今回はSandboxの更新について、更新前後でどのような変化が起こるのか、検証を交えてやってみようと思います。

今回やってみること

「Sandboxの更新」って何??

Sandboxの更新については、公式ヘルプで以下のように記載があります。

Sandbox を更新すると、ソース組織のメタデータが更新されます。Sandbox がコピーであるか、Sandbox で Sandbox テンプレートが使用されている場合は、更新プロセスにより、そのメタデータと組織のデータが更新されます。

Sandboxの更新

本番組織を元に作成したSandboxの更新については情報があったのですが、Sandboxを元に作成したSandbox(SandboxのコピーSandbox)の更新についてはあまり情報がなかったため、今回は後者について書いていきます。

SandboxのコピーSandboxの更新をやってみる

今回更新をやってみる環境は、以前作成したSandbox「T2Sandbox」です。(詳しくはこちらをご覧ください)
この「T2Sandbox」は、「TSandbox」というSandboxを元に作成したSandbox(コピーSandbox)です。

コピーSandboxを更新するとコピー元と比べて中のデータがどうなるのか、更新前後でSandboxにどんな変化があるのかを検証を交えて確認していきたいと思います。

イメージは以下の図になります。

図1 内容概要(イメージ)
図1 内容概要(イメージ)

検証用のデータ作成をやってみた

その1:カスタムオブジェクトの作成

Sandboxの更新をやってみる前に、更新前後で比較するための検証用データをコピー元のSandbox(TSandbox)とコピーSandbox(T2Sandbox)にそれぞれ作成していきます。

まず、TSandboxとT2Sandboxにそれぞれの以下のようなカスタムオブジェクトを作成しました。

Sandbox名カスタムオブジェクトの表示ラベルAPI参照名
TSandbox顧客カスタム(Tsandbox作成)Tsandbox__c
T2Sandbox関係者の同意カスタム(T2sandbox作成)T2sandbox__c
図2 TSandboxで作成したオブジェクト
図2 TSandboxで作成したオブジェクト
図3 T2Sandboxkで作成したオブジェクト
図3 T2Sandboxkで作成したオブジェクト

その2:レコードの作成

次に、レコードを作成します。
違いを分かりやすくするため、以下の標準オブジェクトにそれぞれ1つのレコードを作成しました。

レコード名などは画像を参照してください。

Sandbox名レコードを作成したオブジェクト
TSandboxリード
T2Sandbox取引先
図4 TSandboxのリード(レコードあり)
図4 TSandboxのリード(レコードあり)
図5 T2Sandboxのリード(レコードなし)
図5 T2Sandboxのリード(レコードなし)
図6 TSandboxの取引先(レコードなし)
図6 TSandboxの取引先(レコードなし)
図7 T2Sandboxの取引先(レコードあり)
図7 T2Sandboxの取引先(レコードあり)

Sandboxの更新方法と手順

まずは本番環境へ

Sandbox作成の時もそうでしたが、Sandboxの更新も本番環境からでしか行うことはできません。

本番環境へログインし、設定のクイック検索で「Sandbox」と入力し「環境」の配下にある「Sandbox」をクリックします。

さっそく更新

Sandboxの一覧が表示されたら、対象のSandboxの左にある「更新」をクリックします。

図8 Sandboxの一覧画面
図8 Sandboxの一覧画面

「更新」をクリックすると「Sandboxの更新」が表示されます。
(なんだか見覚えのあるような画面ですね~)

「Sandboxの情報」には既に「T2Sandbox」の情報が入っていましたが、変更することもできるようです。

また、「作成元」は「TSandbox」になっていますが、こちらも変更することができるようです。

今回は、更新前後の違いが分かるように「説明」に更新年月を追加し、名前や作成元はそのままで「次へ」をクリックします。(検証を行ったのは2022年6月でした)

図9 Sandboxの更新画面
図9 Sandboxの更新画面

次に表示されるのは「Sandboxオプション」でした。
こちらは空白のまま「作成」をクリックします。

図10 Sandboxオプション
図10 Sandboxオプション

後は待つだけ

「作成」をクリック後、Sandboxの一覧に戻ってきました。

先ほど更新を行った「T2Sandbox」の「状況」は「待機中」になっており、「説明」が変わっていることが確認できます。
また、「アクション」、「場所」、「完了日」は空白になりました。

更新元である「TSandbox」の方は「アクション」のうち「削除」と「更新」が消えました。

図11 Sandboxの一覧画面
図11 Sandboxの一覧画面

ここまできたらSandboxの作成の時と同じように更新が完了するのを待つだけのはずです!!

いつまで経っても更新が完了しない…

有効化待機中について

Sandboxの一覧画面を時々リロードして見ていたものの、いつまで経っても更新が完了しませんでした。(Sandbox作成の時はすんなりできた記憶があるので、おかしいなと思いつつ他の作業を行っていました。)

半日ほど経過し、流石に時間がかかりすぎでは?と思い、Sandbox一覧画面をよくよく確認してみると…

図12 有効化待機中で表示されるアクション「有効化」と「破棄」
図12 有効化待機中で表示されるアクション「有効化」と「破棄」

更新を行ったT2Sandboxの「状況」が「有効化待機中」になっており、「アクション」に「有効化」と「破棄」が追加されていました…!

そうです、Sandboxの更新では有効化ができるようになったら(状況が有効化待機中に変わった段階で)手動で「有効化」しなければならないのです!!
待つだけではダメでした…(泣)

このことはしっかり公式ヘルプにも載っていましたので気になる方は公式ヘルプも参考にしてください…

Sandbox の更新
更新された Sandbox の有効化

通常だと、有効化する準備ができるとSFDCからメールが送られてくるようです。(私の場合、システムメールを送信しない設定にしていたために気づくのが遅くなりました)

Sandboxの作成と更新は手順や画面が似ているので、気を付けましょう!

有効化する前に破棄を試してみた

気を取り直して、有効化を行おうと思ったのですが、その前に「破棄」をクリックするとどうなるかやってみました。

図13 ポップアップ「更新を破棄」
図13 ポップアップ「更新を破棄」

このようなポップアップが出現しました。

この後、「キャンセル」ボタンを押し、破棄は行いませんでしたが、「破棄」クリック後は確認のポップアップが出るのですぐに破棄されるわけではない、ということが分かりました。

更新の有効化をやってみた

いつも通り脱線してしまいましたが、更新の有効化をやってみます!
「有効化」をクリックすると…

図14 ポップアップ「有効化」
図14 ポップアップ「有効化」
図15 有効化ボタンがアクティブ状態
図15 有効化ボタンがアクティブ状態

破棄の時と同じようにポップアップが出現しました。

このままではポップアップ内の「有効化」ボタンがグレーアウトして押せないので、チェックボックスにチェックをつけます。

すると、「有効化」ボタンがアクティブになるのでクリックします。

図16 有効化中に変化
図16 有効化中に変化

「有効化待機中」から「有効化中」に状況が変化し、「アクション」は空白になりました。

あとは「完了」になるのを待つだけです!!

更新前後のSandboxの比較をやってみた

Sandbox自体の比較をしてみた

まず、更新前後で組織IDが変化し、インスタンス(場所)も変わります。

図17 更新前後のSandbox情報比較
図17 更新前後のSandbox情報比較

そして…先日必須となったMFA認証についてですが、設定は初期化されていました。
そのため、再度設定が必要です。

Sandboxの中身(データ)を比較してみた

冒頭で作成した検証用のデータについて、更新したSandbox(T2Sandbox)は更新前と比較してどうなったか見てみます。

まずは、カスタムオブジェクトを見てみます。

更新後のT2Sandboxを見てみると、更新前に作成したカスタムオブジェクトはなくなり、更新元のTSandboxで作成したカスタムオブジェクトだけありました。

図18 更新後のT2Sandboxのオブジェクトマネージャ
図18 更新後のT2Sandboxのオブジェクトマネージャ

次にレコードを見てみます。

こちらもカスタムオブジェクトと同様で、T2Sandboxで作成したレコードはなくなり、更新元のTSandboxで作成したレコードだけとなっていました。

図19 更新後の取引先
図19 更新後の取引先
図20 更新後のリード
図20 更新後のリード

比較からわかったこと

組織IDやインスタンスの場所、MFA認証も初期化されることから、Sandboxの更新は更新元のSandboxから新規でコピーSandboxを作成するのと変わりがないように思います。

更新時に「作成元」が変更できるのも、新規でSandboxを作成するのと変わらないからこそできるように思います。

データを見ても、Sandboxを作成した後に作ったカスタムオブジェクトやレコードは更新をすることで消滅してしまいます。

ここで注意したいのは、Sandbox上でなんらかの開発を行った後にSandboxの更新を計画する場合です。
更新を行うと更新元のSandboxと全く同じデータになるので、更新を行うSandbox上で新規作成したデータはすべて消えてしまいます。
Sandboxの更新について、更新元データを付け足してくれるイメージを持たないようにしましょう。

ではどんな時にSanedboxの更新を行うのがいいのか考えてみました。

  • Sandboxの作成上限に達しているが、不要なSandboxがあるため、新規でSandboxを作成したい
  • 複数のSandboxで同時に開発を行い、1つのSandboxに開発内容を集約した後、他のSandbox同士でも開発内容を共有したい

などが挙げられると思います。

一つ目の場合は、不要なSandboxを削除して作成を行うよりも、不要なSandboxを更新する方が手間が省けそうです。

二つ目の場合は、リリースを特定のSandboxのみに行うことで、相互にリリースしなくていいので変更セット作成とリリースの手間が減りそうです。
言葉だと分かりにくいかもしれませんが、イメージとしては以下です。

図21 複数のSandboxで同時に開発する場合
図21 複数のSandboxで同時に開発する場合

この場合、Sandbox①を本番環境へのリリース用とすれば、本番環境リリース後に開発用Sandboxを更新するとでそれぞれの開発用Sandboxは本番環境と同等の環境に揃えることができそうです。

開発用のSandboxはそれぞれ違った環境を元に作成していても、更新時に同じ環境を更新元(作成元)とすればいいだけです。

もちろん、それぞれの開発環境に独自にテストデータを用意していて、今後も継続して使用したい場合は、レコードの場合はデータローダなどでデータを保存しておいたり、オブジェクトの場合は更新元に作成しておいたりしなければなりません。

あとがき

ここまでやってみて、あまりSandboxの更新は需要がないような気がしてきましたが…
更新を行うとどうなるんだろう?と疑問に思われている方の参考になれば幸いです。

今後も、気になったことがあれば検証してみたいと思います。

それでは、またお会いしましょう!!

関連記事
SalesforceでSandboxを作ってみた(1)
SalesforceでSandboxを作ってみた(2)

社内 野の花画伯から その3

 ハイビスカスは、南国の花のイメージです。

花言葉は、「上品な美」、「新しい恋」、「繊細な美」、「恒久の美」等です。

沖縄などでは、生垣や庭木として親しまれています。花は、一日花で摘んでも暫くは枯れない生命力を持っているのでパワーがあります。花の鮮やかな色や情熱的な姿から「陽の木」が溢れていると言われ、人気運・愛情運・恋愛運を高めてくれるパワーがあるそうです。赤い花は、赤を象徴する火の気があり、火の気の方向としては、「南」を指します。この方向に飾っておくことで運気がアップするそうです。

ハワイ州では、州花にハイビスカスを指定しています。現地では、「神様に捧げる花」として多くの人々に愛されています。ハワイでフラダンスの踊り子達がハイビスカスを髪に挿して踊る姿が目に浮かびます。ハイビスカスを右に挿しているのは未婚者、左に挿しているのは既婚者という意味があるそうです。

Apexを使った簡単なメール送信方法

セールスフォース

 SFDCからメールを送信する方法は色々とありますが、今回はApexを使った簡単なメール送信方法を紹介します。

 Apexコードを使用するとApexトリガーやApexスケジューラからメールを送信することができます。
 Apexからメール送信する方法には「単一メール送信」と「一括メール送信」があります。今回は「単一メール送信」を使った方法を説明します。
 さらにメール本体についてはApexの中でメール本体を作成する方法と「メールテンプレート」を使う方法がありますが、ここではメール本体をApexの中で作成します。

1.メールアドレス保存用カスタムオブジェクトの作成

 メール送信先を登録するための以下のようなカスタムオブジェクト(MailMember)を作成します。

カスタムオブジェクト(メールメンバー)
図1 カスタムオブジェクト(MailMember)

2.Apexでのメール作成と送信

 Apexでメールを作成し、送信する部分のコードは以下となります。

List<String>mailAdderList = new List<String>();

String mailMsg = '連絡事項';

List<MailMember__c>mailMember = [select id,Name,mailAddress__c from MailMember__c];
for(MailMember__c mM:mailMember){
  mailAdderList.add(mM.mailAddress__c);
  mailMsg += '\n';
  mailMsg += nM.name;
}
mailMsg += '\n';
mailMsg += 'メッセージを入力';

Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();

mail.setToAddresses(mailAdderList);
mail.setSubject('Test Mail Subject');
mail.setPlainTextBody(mailMessage);
mail.setUseSignature(false);
mail.setBccSender(false);
mail.setSenderDisplayName('メール送信者名入力');

List<Messaging.SendEmailResult> results = 
  Messaging.sendEmail(new List<Messaging.SingleEmailMessage>{mail},false);
for (Messaging.SendEmailResult result : results) {
    if (!result.isSuccess()) {
        System.debug(LoggingLevel.ERROR, result.getErrors()[0]);
    }
}

 コードの簡単な説明です。

 List<mailMember__c>mailMemberで送信先メールアドレスを保存します。

 new Messaging.SingleEmailMessage()により「単一メール送信」のインスタンスを作成します。

 mail.setToAddresses()にて送信先アドレスを設定します。設定できるアドレスは100件までです。

 mail.setSubject()にてメールサブジェクトを設定します。

 メール本体(メールのBody部)はmail.setPlainTextBody()にて作成します。

 メールの署名とBccは不要なので、setUseSignature()/setBccSender()にfalseを設定します。

 mail.setSenderDisplayName()でFrom行に表示される送信者表示名を設定します。   setOrgWideEmailAddressId()で組織の送信元のアドレスIDを設定した場合には設定できません。

 また、setOrgWideEmailAddressId()で添付ファイルをsetOrgWideEmailAddressId()で返信先メールアドレスを設定することができます。

 最後に、Messaging.sendEmail()でメールを送信します。2つ目の引数の指定は省略可能でデフォルトはtrueです。trueの場合、任意のsendEmailで失敗した場合、その他すべてのメッセージを送信しない、falseの場合は、メッセージを送信します。
 このメソッドはApex トランザクションごとに 10 回コールすることができます。

 Messaging.sendEmail()の結果はList<Messaging.SendEmailResult> resultsで受け取ることができます。配列で返却された結果に対してisSuccess()メソッドを実施することで結果を取得することができます。isSuccess()の結果がfalseの場合、getError()を使い、sendEmailErrorオブジェクトを取得することができます。エラーとなるのは送信時のエラーで、送信先に到達したか否かは関係ありません。

3.NO_MASS_MAIL_PERMISSIONエラー

 メール送信を実行した場合に「NO_MASS_MAIL_PERMISSION」というエラーが出る場合があります。これは「メールを送信するためのアクセス権」がない場合に発生します。設定により、権限を「すべてのメール」に変更します。

1.検索窓で「送信」を入力
2.メールメニューの「送信」を選択

図2 メールのアクセス権の設定(1)
【図2 メールのアクセス権の設定(1)】

3.アクセス権で「すべてのメール」を選択

図3 メールのアクセス権の設定(2)
【図3 メールのアクセス権の設定(2)】
【図4】メールのアクセス権の設定(3)
【図4】メールのアクセス権の設定(3)