1. 개요
IBM에서 제공하는 IBM WebSphere Application Server Migration Toolkit에 대해 알아본다. 이 도구는 기존 애플리케이션과 서버 구성을 분석해 WebSphere Application Server, WebSphere Liberty로 전환할 때 필요한 변경 사항을 파악하는 데 도움을 준다.
마이그레이션 도구가 모든 설정과 코드를 자동으로 변환해 주는 것은 아니다. 분석 리포트와 변환 결과를 기준으로, 실제 운영 환경에 맞는 설정 검증과 애플리케이션 테스트를 함께 수행해야 한다.
2. 적용 대상
- WebSphere v5.1 ~ v9 버전을 Liberty 버전으로 마이그레이션하는 경우
- 기존 WebSphere를 WebSphere v8.5.5 또는 v9 버전으로 마이그레이션하는 경우
- Tomcat, JBoss, WebLogic을 WebSphere v8.5.5 또는 v9 버전으로 마이그레이션하는 경우
3. 구성
Migration Toolkit은 목적에 따라 여러 도구로 구성된다. 크게 보면 애플리케이션 바이너리 분석 도구, Eclipse 플러그인 기반의 애플리케이션 마이그레이션 도구, 서버 설정 변환 도구로 나눌 수 있다.
3-1. WebSphere Application Server Migration Discovery Tool
마이그레이션 대상 환경을 파악하기 위한 도구이다. 실제 전환 작업을 시작하기 전에 현재 사용 중인 애플리케이션 서버, 애플리케이션, 설정 정보를 조사하는 용도로 활용할 수 있다.
3-2. Migration Toolkit for Application Binaries
애플리케이션 바이너리를 분석하는 커맨드 라인 도구이다. 소스 코드가 없거나, 먼저 전체 영향도를 빠르게 확인해야 할 때 사용할 수 있다. 제공 리포트는 다음과 같다.
- Application Migration Report
- Application Evaluation Report
- Application Inventory Report
- Detailed Migration Analysis Report
3-3. WebSphere Application Server Migration Toolkit
Eclipse 플러그인 기반 도구이다. 개발 환경에서 애플리케이션 소스와 설정을 확인하면서 마이그레이션 이슈를 분석할 때 사용한다. 포함된 내용은 다음과 같다.
- Cloud Migration Tool
- WebSphere Version to Version Application Migration Tool
- Apache Tomcat to WebSphere Application Migration Tool
- JBoss to WebSphere Application Migration Tool
- Oracle to WebSphere Application Migration Tool
- WebLogic to WebSphere Application Migration Tool
- Apache Tomcat to Liberty Configuration Migration Tool
- WebSphere Configuration Migration Tool: JBoss
- WebSphere Configuration Migration Tool: WebLogic
- WebSphere Configuration Migration Tool: WebSphere to Liberty
3-4. WebSphere Configuration Migration Tool
Eclipse 플러그인 기반의 WAS 엔진 마이그레이션 도구이다. 서버 설정을 읽어 대상 WebSphere 또는 Liberty 환경에서 사용할 수 있는 형태로 변환하는 데 사용한다.
- From: WebLogic, JBoss, WebSphere v7.0+
- To: Liberty, WebSphere 8.5.5+
변환 결과는 그대로 운영 환경에 적용하기보다, 생성된 스크립트와 설정 파일을 검토한 뒤 테스트 서버에서 먼저 실행하는 것이 좋다. 특히 JMS, JDBC, Mail Session처럼 애플리케이션 의존성이 큰 리소스는 JNDI 이름, 인증 정보, 드라이버, 대상 서버의 지원 여부를 별도로 확인해야 한다.
3-4-1. JBoss
JBoss의 경우 WildFly 8을 기준으로 테스트하였다. WildFly 8.2를 설치한 뒤 기본 설정(default configuration)을 변환하였다. 다음은 생성된 Jython 결과 파일이다.
Cell=AdminConfig.getid('/Cell:' + AdminControl.getCell() + '/')
Node=AdminConfig.getid('/Cell:' + AdminControl.getCell() + '/Node:' + AdminControl.getNode() + '/')
Server=AdminConfig.getid('/Cell:' + AdminControl.getCell() + '/Node:' + AdminControl.getNode() + '/Server:server1')
Server=AdminConfig.getid('/Cell:' + AdminControl.getCell() + '/Node:' + AdminControl.getNode() + '/Server:server1')
Node=AdminConfig.getid('/Cell:' + AdminControl.getCell() + '/Node:' + AdminControl.getNode() + '/')
Cell=AdminConfig.getid('/Cell:' + AdminControl.getCell() + '/')
NodeName=AdminControl.getNode()
print 'Started Creating Bus'
AdminConfigVar_7=AdminTask.createSIBus(["-bus", "BUS1" , "-busSecurity", "false" ])
AdminTask.addSIBusMember(["-bus", "BUS1" , "-fileStore", "" , "-node", NodeName , "-server", "server1" ])
print 'Finished Creating Bus'
AdminConfig.getid('/Cell:' + AdminControl.getCell() + '/' + 'Security:/')
print 'Started Creating Queue'
AdminTask.createSIBJMSQueue(Server, ["-queueName", "ExpiryQueue" , "-name", "ExpiryQueue" , "-jndiName", "java:/jms/queue/ExpiryQueue" , "-busName", "BUS1" ])
AdminTask.createSIBJMSQueue(Server, ["-queueName", "DLQ" , "-name", "DLQ" , "-jndiName", "java:/jms/queue/DLQ" , "-busName", "BUS1" ])
print 'Finished Creating Queue'
print 'Started Creating Connection Factories'
AdminTask.createSIBJMSConnectionFactory(Server, ["-jndiName", "java:/ConnectionFactory" , "-name", "InVmConnectionFactory" , "-busName", "BUS1" ])
AdminTask.createSIBJMSConnectionFactory(Server, ["-jndiName", "java:jboss/exported/jms/RemoteConnectionFactory" , "-name", "RemoteConnectionFactory" , "-busName", "BUS1" ])
print 'Finished Creating Connection Factories'
print 'Started Creating Queue'
AdminTask.createSIBJMSQueue(Server, ["-queueName", "ExpiryQueue" , "-name", "ExpiryQueue" , "-jndiName", "unknown_0" , "-busName", "BUS1" ])
AdminTask.createSIBJMSQueue(Server, ["-queueName", "DLQ" , "-name", "DLQ" , "-jndiName", "unknown_1" , "-busName", "BUS1" ])
print 'Finished Creating Queue'
print 'Started Creating Connection Factories'
AdminTask.createSIBJMSConnectionFactory(Server, ["-jndiName", "unknown_2" , "-name", "InVmConnectionFactory" , "-busName", "BUS1" ])
AdminTask.createSIBJMSConnectionFactory(Server, ["-jndiName", "unknown_3" , "-name", "RemoteConnectionFactory" , "-busName", "BUS1" ])
print 'Finished Creating Connection Factories'
print 'Started Creating JDBC Provider and/or Data Sources'
print 'Finishes Creating JDBC Provider and/or Data Sources'
print 'Started Creating Mail Session'
print 'find protocol provider'
AdminConfigVar_8=AdminConfig.getid('/Cell:' + AdminControl.getCell() + '/Node:' + AdminControl.getNode() + '/Server:server1' + 'MailProvider:Built-in Mail Provider/')
pplist=AdminConfig.list('ProtocolProvider', AdminConfig.getid('/Cell:' + AdminControl.getCell() + '/Node:' + AdminControl.getNode() + '/Server:server1')).splitlines()
for pp in pplist:
type = AdminConfig.showAttribute(pp, 'protocol')
if type == ('smtp'):
smtp = pp
elif type == ('smtps'):
smtps = pp
elif type == ('pop3'):
pop3 = pp
elif type == ('pop3s'):
pop3s = pp
elif type == ('imap'):
imap = pp
elif type == ('imaps'):
imaps = pp
AdminConfig.create('MailSession', AdminConfigVar_8, [['mailStoreProtocol', ?], ['name', 'java:jboss/mail/Default'], ['mailTransportUser', ''], ['mailTransportProtocol', smtp], ['mailStoreHost', 'unknown'], ['mailStorePassword', ''], ['mailStoreUser', ''], ['description', ''], ['mailFrom', ''], ['jndiName', 'java:jboss/mail/Default'], ['mailTransportPassword', ''], ['mailTransportHost', 'localhost']])
AdminConfig.create('MailSession', AdminConfigVar_8, [['mailStoreProtocol', ?], ['name', 'java:jboss/mail/Default'], ['mailTransportUser', ''], ['mailTransportProtocol', smtp], ['mailStoreHost', 'unknown'], ['mailStorePassword', ''], ['mailStoreUser', ''], ['description', ''], ['mailFrom', ''], ['jndiName', 'java:jboss/mail/Default'], ['mailTransportPassword', ''], ['mailTransportHost', 'localhost']])
AdminConfig.create('MailSession', AdminConfigVar_8, [['mailStoreProtocol', ?], ['name', 'java:jboss/mail/Default'], ['mailTransportUser', ''], ['mailTransportProtocol', smtp], ['mailStoreHost', 'unknown'], ['mailStorePassword', ''], ['mailStoreUser', ''], ['description', ''], ['mailFrom', ''], ['jndiName', 'java:jboss/mail/Default'], ['mailTransportPassword', ''], ['mailTransportHost', 'localhost']])
AdminConfig.create('MailSession', AdminConfigVar_8, [['mailStoreProtocol', ?], ['name', 'java:jboss/mail/Default'], ['mailTransportUser', ''], ['mailTransportProtocol', smtp], ['mailStoreHost', 'unknown'], ['mailStorePassword', ''], ['mailStoreUser', ''], ['description', ''], ['mailFrom', ''], ['jndiName', 'java:jboss/mail/Default'], ['mailTransportPassword', ''], ['mailTransportHost', 'localhost']])
AdminConfig.create('MailSession', AdminConfigVar_8, [['mailStoreProtocol', ?], ['name', 'java:jboss/mail/Default'], ['mailTransportUser', ''], ['mailTransportProtocol', smtp], ['mailStoreHost', 'unknown'], ['mailStorePassword', ''], ['mailStoreUser', ''], ['description', ''], ['mailFrom', ''], ['jndiName', 'java:jboss/mail/Default'], ['mailTransportPassword', ''], ['mailTransportHost', 'localhost']])
AdminConfig.create('MailSession', AdminConfigVar_8, [['mailStoreProtocol', ?], ['name', 'java:jboss/mail/Default'], ['mailTransportUser', ''], ['mailTransportProtocol', smtp], ['mailStoreHost', 'unknown'], ['mailStorePassword', ''], ['mailStoreUser', ''], ['description', ''], ['mailFrom', ''], ['jndiName', 'java:jboss/mail/Default'], ['mailTransportPassword', ''], ['mailTransportHost', 'localhost']])
AdminConfig.create('MailSession', AdminConfigVar_8, [['mailStoreProtocol', ?], ['name', 'java:jboss/mail/Default'], ['mailTransportUser', ''], ['mailTransportProtocol', smtp], ['mailStoreHost', 'unknown'], ['mailStorePassword', ''], ['mailStoreUser', ''], ['description', ''], ['mailFrom', ''], ['jndiName', 'java:jboss/mail/Default'], ['mailTransportPassword', ''], ['mailTransportHost', 'localhost']])
print 'Finished Creating Mail Session'
print 'Creating WebSphere Variables'
varSubstitutions =AdminConfig.list("VariableSubstitutionEntry",Cell).split(java.lang.System.getProperty("line.separator"))
for varSubst in varSubstitutions:
getVarName = AdminConfig.showAttribute(varSubst, "symbolicName")
print 'Created WebSphere Variables'
AdminConfig.save()
결과 파일을 보면 JMS Bus, Queue, Connection Factory, Mail Session, WebSphere Variable을 생성하는 스크립트가 만들어진다. 다만 일부 항목은 unknown_0, unknown_1처럼 임시 이름으로 생성되거나, mailStoreProtocol 값이 ?로 남아 있다. 이런 값은 자동 변환만으로 확정할 수 없는 항목이므로 적용 전에 반드시 수동으로 보정해야 한다.
검증은 테스트 프로파일에서 스크립트를 실행한 뒤 관리 콘솔 또는 wsadmin으로 생성된 리소스를 확인하는 방식으로 진행한다. 애플리케이션 배포 후에는 JNDI lookup, JMS 송수신, Mail Session 사용 여부처럼 실제 애플리케이션이 의존하는 기능을 기준으로 확인하는 것이 좋다.