🌊

re:invent期間中発表されたAWS B2B Data InterchangeのCFn側のIssueが解決されたのでCDKで作成

2024/03/06に公開

AWS B2B Data Interchangeというサービスが発表

2023年11月27日 AWS B2B Data Interchangeが発表されていたようです。
https://aws.amazon.com/jp/about-aws/whats-new/2023/11/aws-b2b-data-interchange/

電子データ交換 (EDI) ドキュメントを、JSON や XML などの一般的なデータ表現に大規模かつ従量制料金で自動変換するフルマネージド型サービス、AWS B2B Data Interchange の一般提供を開始したことを発表しました。このサービスにより、EDI データをビジネスアプリケーションや専用データレイクに統合する準備とその統合作業に伴う時間、複雑さ、コストを、製造、小売、医療などのさまざまな業種のお客様が削減できるようになりました。

B2B Data Interchange を使用すると、取引先パートナー関係のネットワーク全体を、一元化されたダッシュボードからオンボード、管理、監視することができます。

27日というとre:invent2023初日という事だと思われます。
アマQやElasticash Servelessの話題に隠れていましたが、概要を調べつつ触ってみたいと思います。


EDI(Electronic Data Interchange)とは

こちらの説明がわかりやすかったです。
https://it-trend.jp/edi/article/80-0004


コストその他

https://aws.amazon.com/jp/b2b-data-interchange/pricing/

料金表の表示だけ見ると現在の所オハイオとオレゴンのみの提供のように見えましたが、
https://aws-new-features.s3.amazonaws.com/html/aws_services.html ではヴァージニアでも利用可能です。

余談ですが、以下サイトは友人と機会があり作成したものになりますが、リージョン毎の利用サービス比較が出来るので機会があればご利用いただければ幸いです。
https://aws-service-utilities.vercel.app/


無料期間は設定されていないように見えましたが、こういう時に臆せず触ってねという意味で別の機会にいただいたクレジットが手元にありましたので、積極的に触って記事に残していきます。


マネコンで

と思いましたが、作成最中に、以下のブログに手順がありましたので、自分の手元で作成した手順はここでは割愛させていただきます。
https://dev.classmethod.jp/articles/aws-b2b-data-interchange/


CDK(メイン)

前置き

ドキュメントにはマネコン、CLI、SDKに対応とありますが、CloudFormationのRelease Historyを見るとNew ResourceとしてType登録されているのを確認出来ました。

CDKのAPI Refarenceを確認

S3にEDIファイルのアップの部分で、CFnだとちょっと面倒(バケットとB2Bのリソースをスタック分け+aws cloudformation packageコマンド等検討しましたが、lamdaがアップロードしたのを待ってからリソース作成されるかな?など考えている内に本筋じゃないなと思ったりで)なのでCDKだけでやる事にしました。(aws_s3_deploymentを利用)

ただここで問題が、以下のようなIssueがあり、先に進めなくなりました。
厳密には作成当時の想定動作だったようですが、マネコンで手動動作が発生するのはIaCユーザー的によくないとの事で数ヶ月後に解決してくれました。(activeとinactiveという値を用意しておきながどちらを選択してもinactiveが立つのを想定動作と言われてもという気持ちは封印)

https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-b2bi/issues/21

ちなみにcdkのAPIリファレンスではb2bi.CfnPartnershipにおいて、capabilitiesプロップスはオプションとなっていますが、指定しないとエラーが起こります。(synthは通りますが、作成時InternalErrorが発生します。)

準備

$ mkdir b2biTest && cd b2biTest && cdk init --language typescript
b2bi_test-stack.ts
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import { aws_s3 as S3 } from 'aws-cdk-lib';
import { aws_s3_deployment as S3Deployment } from 'aws-cdk-lib';
import { aws_b2bi as b2bi } from 'aws-cdk-lib';

export class B2BiTestStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);
// --------------------------------------------------------------------- //
    const Bucket = new S3.Bucket(this, 'Bucket', {
      bucketName:'b2bi-test-bucket20231223',
      removalPolicy: cdk.RemovalPolicy.DESTROY,
      autoDeleteObjects: true,
    });
    // --------------------------------------------------------------------- //
    const s3Deployment = new S3Deployment.BucketDeployment(this, 's3BucketDeployment', {
      sources: [S3Deployment.Source.asset('./assets')],
      destinationBucket: Bucket,
    })

    const transactionSet = 'X12_214';
    const version = 'VERSION_4010';

    const cfnProfile = new b2bi.CfnProfile(this, 'MyCfnProfile', {
      businessName: 'testCompany',
      logging: 'ENABLED',
      name: 'testProfile',
      phone: '0123456789',
    });

    const cfnTransformer = new b2bi.CfnTransformer(this, 'MyCfnTransformer', {
      ediType: {
        x12Details: {
          transactionSet,
          version,
        },
      },
      fileFormat: 'XML',
      mappingTemplate: '0',
      name: 'testTransformer',
      status: 'active',
    });

    const cfnCapability = new b2bi.CfnCapability(this, 'cfnCapability', {
      configuration: {
        edi: {
          inputLocation: {
            bucketName: Bucket.bucketName,
            key: 'input',
          },
          outputLocation: {
            bucketName:  Bucket.bucketName,
            key: 'output',
          },
          transformerId: cfnTransformer.ref,
          type: {
            x12Details: {
              transactionSet,
              version,
            },
          },
        },
      },
      name: 'X12-214-4010',
      type: 'edi',
    
      // the properties below are optional
      instructionsDocuments: [{
        bucketName: Bucket.bucketName,
        key: 'reference/test.EDI',
      }],
    });

    cfnTransformer.node.addDependency(s3Deployment);

    new b2bi.CfnPartnership(this, 'MyCfnPartnership', {
      email: 'test@example.com',
      name: 'testPartnership',
      profileId: cfnProfile.ref,
      capabilities: [cfnCapability.ref],
    });
// --------------------------------------------------------------------- //
  }
}


以上でした

Issueを立ててから数ヶ月経過しており、何だったっけこれから再スタートでした。時期ずれしてしまいましたが、せっかくなので公開にしました。

お読みいただき有難うございました。

Discussion